UCOS 杂项 笔记
1. 建立任务和建立数据队列 哪个先建立?
经过试验得知,数据队列和任务的建立先后没有顺序,都可以正常运行.
2.关于主函数的面试问题。
主函数写法有: int main() 和void main()
int main() 表示该函数必须有返回值,即程序实现中一定要有return xx;字样
void main() 表示函数不需要返回值,一定不能有return xx字样
否则程序编译都会出错
如果括号里面还有个 “void” 意思就是空 ,即 函数没有参数。
3.任务建立函数注意要点
调试函数花费一上午时间,问题泽恩也找不到,原来是格式不对。
OSTaskCreate(MyTask,(void*)0,&MyTaskStk(TASK_STK_SIZE-1),3);
上面这个任务建立函数出问题了 ,怎么也找不到原因???????????
仔细看是格式不对了,“【】”写成了“()”
下面这个建立任务是正确的:
OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE-1], 0);
4.void OSStatInit (void)
#if OS_TASK_STAT_EN > 0
void OSStatInit (void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OSTimeDly(2);
OS_ENTER_CRITICAL();
OSIdleCtr = 0L;
OS_EXIT_CRITICAL();
OSTimeDly(OS_TICKS_PER_SEC / 10);
OS_ENTER_CRITICAL();
OSIdleCtrMax = OSIdleCtr;
OSStatRdy = TRUE;
OS_EXIT_CRITICAL();
}
#endif
在OSStatInit一开始延迟时间为2时钟节拍里:
第一,在就绪表中删除掉当前任务的就绪标志,这个当前任务也就是调用OSStatInt( )的用户编写的TaskStart()任务,这是用户创建的优先级最高的任务;
第二,令OSTCBDly = ticks也就是这个任务要延迟ticks所代表的时间;
第三,调用 OS_Sched( ),进行一次任务调度,在任务调度里找出优先级最高的任务,并进行任务切换,切换到现在的具有最高优先级的任务,使其运行。此时在任务调度的时候,TaskStart()任务又重新处于就绪状态,此时程序从OSTimeDly(2)中返回,接着执行下面下面的程序。执行完OSIdleCtr= 0L; 后,又进入一个延时程序OSTimeDly(OS_TICKS_PER_SEC / 10); ,本程序是又延迟了100毫秒,在这100毫秒中,TaskStart()任务处于等待状态,因此在这100毫秒中执行的是Idle任务。Idle任务会不断给OSIdelCtr计数,从而100毫秒后OSIdelCtr记录的就是100毫秒内被增加的最大次数(在这一秒中没有其它任务高于Idle任务,所以结果是最大的)。100毫秒延迟结束后。TaskStart()任务重新就绪,获得cpu使用权,就执行OSIdleCtrMax = OSIdleCtr; OSStatRdy = TRUE;此后程序结束。
OSStatInit一开始延迟时间为2时钟节拍,用于保持与系统时钟的同步,因为延迟之后调用的第一个语句为“OSIdelCtr=0”,基本不用花费系统时间,然后就进入第二个语句OSTimeDly(OS_TICKS_PER_SEC); 相当于再次延迟1s;在这延迟的一秒中,Idle任务会不断给OSIdelCtr计数,从而1s后OSIdelCtr记录的就是1s内被增加的最大次数(在这一秒中没有其它任务高于Idle任务,所以结果是最大的)。
在建立其他任务之前,必须调用OSStatInit()来确定用户的PC有多快。在一开始,OSStatInit()就将自身延时了两个时钟节拍,这样它就可以与时钟节拍中断同步。因此,OSStatInit()必须在时钟节拍启动之后调用;否则,用户的应用程序就会崩溃。当µC/OS-II调用OSStatInit()时,一个32位的计数器OSIdleCtr被清为0 ,并产生另一个延时,这个延时使OSStatInit()挂起。此时,uCOS-II没有别的任务可以执行,它只能执行空闲任务(µC/OS-II的内部任务)。空闲任务是一个无线的循环,它不断的递增OSIdleCtr。1秒以后,uCOS-II重新开始OSStatInit(),并且将OSIdleCtr保存在OSIdleMax中。所以OSIdleMax是OSIdleCtr所能达到的最大值。而当用户再增加其他应用代码时,空闲任务就不会占用那样多的CPU时间。OSIdleCtr不可能达到那样多的记数,如果用户程序每秒抚慰一次OSIdleCtr()。CPU利用率的计算由µC/OS-II 中的OSStatTask()函数来完成,这个任务每秒执行一次。而当OSStatRdy置为TRUE表示µC/OS-II将统计CPU的利用率。
OSStatInit()将返回到TaskStart()。所有任务可以都由TaskStart()中建立,由于TaskStart()的优先级为0(最高),新任务建立后不进行任务调度。当所有任务都建立完成后,TaskStart()将进入无限循环之中。
做嵌入式应用时,用户必须在第一个任务中打开时钟节拍中断。
void ARMStartTimer(void)
{
//autoreload and start m
rTCON = 0x9;
}
UCOS 杂项 笔记的更多相关文章
- 杂项-笔记-VS:VS2019笔记
ylbtech-杂项-笔记-VS:VS2019笔记 1.返回顶部 1. http://www.ddooo.com/softdown/142335.htm 2. 2.返回顶部 3.返回顶部 4. ...
- perl 学习杂项笔记
### 由于perl 语法属于很自由的那种, 建议出现错误的时候打开 -w 或者使用 -Mdiagnositics 试一下 ### 如何调试 perl程序 http://www.ibm.com/dev ...
- 一些css杂项笔记
div[class*="col-"]{ background-color: gold; border: 1px solid #ccc; } //给class开头等于col-的div ...
- go 杂项笔记
*** 使用go build编译该程序,注意这里需要指定 -gcflags "-N -l" 关闭编译器优化,否则编译器可能把对sum函数的调用优化掉. bobo@ubuntu:~/ ...
- ucos实时操作系统学习笔记——任务间通信(消息)
ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...
- ucos实时操作系统学习笔记——内核结构和任务创建
对于ucos实时操作系统,邵贝贝的那本书已经写得很详细了,我因为之前不深的研究过ucos,所以在这里做一个笔记,写一些个人对该操作系统的理解,仅仅是个人理解,如果有人看到这边随笔有不对的地方,望给我指 ...
- ucos实时操作系统学习笔记——操作系统在STM32的移植
使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...
- ucos实时操作系统学习笔记——任务间通信(队列)
ucos操作系统中的queue机制同样使用了event机制来实现,其实和前面的sem,mutex实现类似,所不同的是对sem而言,任务想获得信号量,对mutex而言,任务想获得的是互斥锁.任务间通信的 ...
- ucos实时操作系统学习笔记——任务间通信(互斥锁)
想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥 ...
随机推荐
- 【转】vim 修改tab为四个空格
原文网址:http://blog.sina.com.cn/s/blog_620ccfbf01010erz.html 为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方法: 1. ...
- 使用C#开发ActiveX控件 11
C#开发ActiveX控件 ActiveX 是一个开放的集成平台,为开发人员.用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内容的方法. 使用 ...
- 【动态规划】XMU 1029 矩阵链乘法
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1029 题目大意: 题同乘法难题.给n+1个数,头尾不能动,中间的数可取出,取出时代价是 ...
- LeetCode——Restore IP Addresses
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- Something broke! (Error 500)——reviewboard
Something broke! (Error 500) 1.什么时候会出现? 不清楚,出现过几次 2.解决手段及方法: 更改/www_rb/conf/settings_local.py文件,将DEB ...
- Android 单指触控拖拽,两指触控缩放
import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view. ...
- Computer Vision and Machine Learning Competitions
一.ImageNet Object Detection, Object Classification+Localization 二.COCO Image Captioning 三.LFW Face R ...
- [置顶] hdu 1890 伸展树区间翻转
题意: 给你n个数,每次先输出第i大的数的位置(如果有多个,选下标小的那个),然后每次将第i个位置到第i大的数所在位置之间的数进行翻转. 思路:输入的数组可能有多个相同的值,我们可以进行两次排序把数组 ...
- [转] .bss段和.data段的区别
PS:http://stackoverflow.com/questions/16557677/difference-between-data-section-and-the-bss-section-i ...
- Java基础知识强化96:Calendar类之获取任意年份的2月有多少天的案例
1. 分析: (1)键盘录入任意的年份 (2)设置日历对象的年月日 年:就是(1)输入的数据 月:是2(3月份) 日:是1 (3)把 ...