中级会员
- 积分
- 370
- 金钱
- 370
- 注册时间
- 2017-8-3
- 在线时间
- 38 小时
|
本帖最后由 xie112 于 2018-8-22 16:51 编辑
- 一个任务也称作一个线程,就是一个简单的程序,可以认为其独享中央处理器CPU。实际上,在只有一个CPU时,任何时刻只有一个任务能够得到执行。
- uc/osIII允许应用程序有任意多个任务,任务的最大数目仅仅受限于存储器容量。
- 多任务管理其实就是在多个任务间调度和切换CPU使用权的过程。
- 任务的类型有两种:运行至完成型和无线循环型。在多数嵌入式系统设计中,任务采用无线循环型。一个运行至完成型的任务必须通过调用OSTaskDel函数来删除自己。另外任务与C函数不同在于,任务不允许返回和一般写成无限循环。
- 实现任务无线循环方式:while(1)或者for(;;),在无限循环类型的任务中必须调用uc/os服务函数,使得任务进入等待某个事件的状态。
- 典型的键盘使用:键盘扫描任务应当只是缓存所按按键的标识符,然后由另外一个任务决定如何处理。
- 在任务等待某个事件时,不会占用CPU时间。
- 每个任务都有属于自己的一套CPU寄存器,都可以认为其独自占有CPU。
- UC/os是一个可剥夺型的内核,所以每个任务必须有自己的栈空间,任务栈空间永远位于RAM中,可用来保存局部变量、函数调用以及可能的ISR嵌套。
- 栈空间可以静态和动态分配,当使用malloc函数动态分配时,如果平凡创建和删除任务,存储器会布满碎片,导致无法再使用存储器管理函数给栈分配空间。p_stk=(CPU_STK*)malloc(stk_size);//其中p_stk作为栈的基地址使用。
- 单调执行率调度法RMS:根据任务执行的平凡程度分配任务优先级,执行频率最高的任务分配优先级最高。
- 栈空间分配时,必须考虑任务调用函数的嵌套情况,局部变量的数目以及嵌套ISR对栈的需求,任务栈必须有足够的空间能够存储所有的CPU寄存器并且CPU有FPU的情况下,能够存储所有的FPU寄存器。作为嵌入式系统中一个通用原则不要使用递归调用。
- 栈溢出很常见,会造成一些很奇怪的现象,因此在开发和测试产品中,要一只监视任务在运行时堆栈使用量。
- 任务状态:休眠态,任务已经存在存储器中,但不受uc/os管理,要调用OSTaskCreate()创建之后才受系统管理。就绪态:当一个任务准备运行时候,进入就绪态,在就绪表中记录。运行态,任务正在运行,对于单核CPU,在任何时刻只有一个任务运行。等待态,等待某个事件的发生,此时任务会被放入与改任务所等待的事件所对应的等待表中。中断服务态,发生中断时,正在运行的任务被挂起,CPU开始执行中断服务子程序ISR。
|
|