stk

【连载】【FPGA黑金开发板】NIOSII那些事儿—UC/OS实验(二十四)

拜拜、爱过 提交于 2020-03-29 02:57:45
声明:本文为原创作品,版权归本博文作者所有,如需转载,请注明出处 http://www.cnblogs.com/kingst/ 这一章,我们简单研究一下基于NIOS II的uC/OS系统的开发过程。实验中有三个任务:第一个任务用于实时时钟DS1302驱动,第二个任务用于LED灯闪烁;第三个任务用于数码管显示654321;最终通过把数据通过PC机串口显示出来,有兴趣的可自行把开发板上的其它功能添上。 1 、 uC/OSII 简介 u C / O S 是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。 μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC

7、uCOS-Ⅱ 信号量

时光怂恿深爱的人放手 提交于 2020-03-05 23:06:06
1、“信号量”为操作系统用于处理临界区问题和实现进程间同步提供了一种有效的机制。 在很多操作系统原理书中都提到了信号量的概念,常用P操作与V操作来表明信号量的行为。 PV操作的伪代码如下: 设s为一整数型变量: P操作:while( s==0); s--; V操作:s++ 2、例程代码 1 /***************************************************************************************************************************** 2 * 3 * 文件名称:main.c 4 * 文件功能:主函数 5 * 文件说明:无 6 * 7 *****************************************************************************************************************************/ 8 /********************************************************** 9 * 10 * 头文件声明 11 * 12 **********************************************************/ 13 14

CodeForces 1313 C2.Skyscrapers (hard version) (单调栈)

安稳与你 提交于 2020-02-28 00:03:38
题意: 给定长度为n的数组a, 现在要在这n个位置建立大厦,但是要满足一下要求: 1.位置pos的高度h[pos]不能超过a[pos] 2.位置pos左边和右边不能有高于h[pos] 输出高度和最大的建立方案(输出每个位置的高度h) n<=5e5 思路: easy版本n只有 1000 ,可以直接枚举最高大厦的位置,然后暴力计算答案,复杂度 O ( n ^ 2 ) hard版本数据范围很大,枚举显然不行 思考如何利用i - 1 的答案推导出出i的答案 设l [ i ] 为位置i为峰时 , i及其左半部分最大高度和 设r [ i ] 为位置i为峰时 , i及其右半部分最大高度和 则以i为峰的高度和就是l [ i ] + r [ i ] - a [ i ] 计算l [ ] 和r [ ] : 假设i是j左边第一个高度限制小于j的 , 那么l [ j ] = l [ i ] + ( j - i ) * a [ j ] 因为i到j中间部分k的高度限制大于j , 那么最高建到a [ j ] , i以及左边部分是已经计算出来的d [ i ] , 两者相加就是j位置的答案 计算r [ ] 同理 , 而找某个位置左边或者右边第一个比它小的位置是单调栈的基础操作 , 因此用单调栈就能实现 code: # include <bits/stdc++.h> using namespace std ; #

Codechef BTREE Union on Tree

▼魔方 西西 提交于 2020-02-15 09:26:58
Link 首先可以很自然地想到把虚树建出来然后在上面搞。 我们做两遍dp,把每个点的 \(r_i\) 更新成从这个点出来能覆盖的最远距离和从其他点出来经过这个点后能够覆盖的最远距离的最大值。 这样我们保证了对于一条边 \((u,v)\) ( \(u\) 是 \(v\) 的父亲),一定存在一个点 \(w\) 使得 \(v\) 比 \(u\) 更新 \(w\) 更优。 那么我们先计算出所有更新后 \(U(x_i,r_i)\) 能够覆盖到的点的数目。 这样子肯定会算重,我们再考虑把算重的减掉。 算重的部分相当于找到上文说的那个 \(w\) ,计算有多少点在 \(w\) 上面并且被 \(v\) 的范围包含,以及在 \(w\) 下面并且被 \(u\) 的范围包含。 由 \(r_u-(dep_w-dep_u)=r_v-(dep_v-dep_w)\) 可以确定 \(w\) 的位置。 同时可以发现 \(w\) 往上往下延伸的范围是相等的,这就相当于是 \(U(w,r_u-(dep_w-dep_u))\) 。 那么我们现在需要做的就是求 \(|U(x,r)|\) 。 这个可以建出点分树然后暴力跳父亲一层层统计。 注意到 \(w\) 可能在边上,所以一开始化边为点即可。 #include<cstdio> #include<cctype> #include<vector> #include

基于Cortex-M3的简易操作系统——简易任务调度(一)

亡梦爱人 提交于 2020-02-07 23:27:26
一、引言 上一次简单的记录了一下我学习用Cortex-M3写一个最小调度系统的过程,但大多是图片的堆砌,所以现在准备写一个基于Cortex-M3的简易操作系统的系列,也算记录一下学习操作系统的过程。 本系列使用基于Cortex-M3内核的STM32F103RCT6作为平台 代码开源在gitee上,大家可以自行下载: https://gitee.com/dwk88/SimpleOS 二、预备知识 本文默认你学习并实际开发过Cortex-M系列的的单片机,例如:STM32,Tiva等,熟悉汇编知识 你还需要了解Cortex-M3包含的寄存器以及它们的功能 首先我们来思考一个问题:如何让多个任务同时进行(并行),例如:算法程序计算(长时间占用MCU)和数据传输、显示、外部控制 要知道我们的单核MCU是无法同时执行两条指令的,要并行运行多个任务必然要多个MCU,但那样协调性和成本都是问题。 我们做不到并行,所以折中的解决方案是使用一个调度程序,周期性的切换执行的任务。 三、时间片轮转调度算法 时间片轮转的意思是,以一个固定的时间周期,每隔一段时间就切换MCU执行的任务。 下面举一个列子: void task1(void) { while(1) { GPIO_PinWrite(LED_Red.port, LED_Red.num, 1); Delay_ms(500); GPIO

【SDOI2017】天才黑客

依然范特西╮ 提交于 2020-02-07 15:38:30
题面 题解 这是好久之前菊开讲的一道题目了。 可以发现在这道题目中,边比点更加重要,所以我们化边为点,将边权改为点权,边与边之间的边权就是题目所给的Trie树上LCA深度的和。 想到一个平方的暴力,每条边和它连向的点的出边连一条边。下一步考虑怎么优化。 对于每一个点,将它的入边和出边都拿出来,按照dfs序排序,那么可以考虑将每个点拆成入点和出点,因为 \(\operatorname{lcp}(i, j)\) 的值是 \(i \to j\) 之间所有的边的 \(\operatorname{lcp}\) 的最小值,于是前后缀优化连边就可以了。 可以考虑使用下面这个图来帮助理解: 说起来容易做起来难, 代码留给读者作为练习 代码 #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout) inline int read() { int data = 0, w = 1; char ch = getchar(); while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar(); if (ch ==

「JSOI2011」汇总

末鹿安然 提交于 2020-01-31 00:56:14
「JSOI2011」柠檬 斜率优化题。 在优化前,还有一个值得一提的优化: 对于最后的最有分割方案,每一段的两个端点一定是同颜色的,并且作为这一段的 \(s_0\) 证明:如果不作为这一段的 \(s_0\) ,那么它显然没有贡献,把这一个单独分出来显然更优,直到最后两个端点就一定都是 \(s_0\) ,颜色相同。 那么我们只需要从之前和该点种类相同的位置进行转移即可。 这样就从直接枚举的复杂度 \(O(n^3)\) 优化到了 \(O(n^2)\) ,但还是不够,继续考虑优化。 我们先把转移方程写出来: \(dp_i\) 表示把前 \(i\) 个取完,且 \(i\) 点作为一段的终点最大收益。 \[dp_i=\max\limits_{1\le j \le i,a_j=a_i}\left\{dp_{j-1}+s_i(p_i-p_j+1)^2\right\}\] \(p_i\) 表示第 \(i\) 个点是种类为 \(s_i\) 的第 \(p_i\) 个点。 根据斜率优化的一些做法,我们可以把式子化成这样: \(p_i\times 2p_js_j+dp_i-s_i(p_i+1)^2=dp_{j-1}-2a_jp_j+a_jp_j^2\) 设 \(x_i = 2s_ip_i,y_i=dp_{i-1}-2s_ip_i+s_ip_i^2\) \(p_ix_j+dp_i-s_i(p_i+1)^2

Luogu P3233 [HNOI2014]世界树

怎甘沉沦 提交于 2020-01-17 21:37:08
虚树 + DP 想了很久很久还调了半天 就算有倍增数组我也要树剖求lca 先建出虚树,然后虚树上的每个节点维护到自己最近的关键点的距离 \(dis[u]\) 和所属的关键点 \(be[u]\) 。 dp1(int u) 从底往上去更新, dp2(int u) 从上向下去更新。 计算答案时,我们发现若虚树上一条边 \((u,v)\) (即原图中的一条链 \((u,\cdots,v)\) )满足 \(be[u]\neq be[v]\) ,那么 \((u,\cdots,v)\) 中一定被分为了不相交的两部分,即 \(be[i]=be[u],i\in(u,\cdots,x)\\be[j]=be[v],j\in (y,\cdots,v)\\(u,\cdots,x)+(y,\cdots,v)=(u,\cdots,v)\) 为了快速获得分界点,我们在原树上倍增去找即可;记得排除同一棵子树的贡献,即在父节点时要减掉子树的 \(sz\) 。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define R register int using namespace std; namespace Luitaryi { inline int g() { R x=0,f=1; register char s

青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)

大城市里の小女人 提交于 2020-01-17 01:46:47
题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离。 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 第一种,树形dp+LCA 比赛的时候,我猜测对于不为1的n个数,其中两两互质的对数不会很多,肯定达不到n^2 然后找出所有互质的对数,然后对为1的数进行特殊处理。(初略的估计了下,小于500的大概有50个质数,将n个数平均分到这些数中,最后大概有10000*50*200=10^7) 对所有的非1质数对,采用离线LCA可以搞定。 对于1的特殊情况,只需要用两次dfs,就可以找出所有1到其它点的距离和与1之间的距离和。 第二种,树形dp+容斥 这种方法从边的角度,考虑每一条边会被计算多少次,这也是树上求距离的常用方法。 由于树边都是桥边,所有只要求出边两边联通块之间互质对数。最简单的想法即是枚举每一条边,然后再分别枚举两边区域,这样的复杂度是500*500*10000 很遗憾并没有这么简单。于是用容斥原理进行优化。在枚举某条边的一边的x(1<=x<=500)的时候,考虑右边为x质因子倍数的情况,也就是容斥了。 这样可以将复杂度变为10000*500*k*2^k( k<=4) 官方题解: 附上代码: // // main.cpp // 160701 // // Created by New_Life on 16/7

uC/OS任务创建

眉间皱痕 提交于 2020-01-13 13:18:15
1.任务的定义 1)定义任务堆栈 1 #define TASK1_STK_SIZE 128 2 #define TASK2_STK_SIZE 128 3 4 static CPU_STK Task1Stk[TASK1_STK_SIZE]; 5 static CPU_STK Task2Stk[TASK2_STK_SIZE]; 2)定义任务函数 3)定义任务控制块 任务控制块是一种数据类型,包含着任务的所有信息(任务堆栈,名字,优先级,链表指针等),任务的执行是通过系统的调度,系统对任务的操作则是通过任务控制块来实现 4)定义任务函数 2.系统初始化 系统初始化一般是在硬件初始化完成之后进行 3.启动系统 1 void OSStart (OS_ERR *p_err) 2 { 3 if ( OSRunning == OS_STATE_OS_STOPPED ) { 4 /* 手动配置任务 1 先运行 */ 5 OSTCBHighRdyPtr = OSRdyList[0].HeadPtr; 6 7 /* 启动任务切换*/ 8 OSStartHighRdy(); 9 10 /* 不会运行到这里,运行到这里表示发生了致命的错误 */ 11 *p_err = OS_ERR_FATAL_RETURN; 12 } else { 13 *p_err = OS_STATE_OS_RUNNING; 14 }