任务管理
任务管理
任务是竞争系统资源的最小运行单元,任何数量的任务都可以共享同一优先级,处于就绪态的多个相同优先级的任务将会以时间片切换的方式共享处理器。而一个系统能运行多少个任务,取决于系统可用的SRAM。
在任何时刻,只有一个任务得以运行,uC/OS调度器决定运行哪个任务。调度器的主要职责就是在任务切入、切出时保存上下文环境(寄存器值、栈内容)
任务的调度机制
- 抢占式调度机制——>前导零指令
- 时间片轮转调度机制
实时操作系统的要求特性
一个操作系统如果只是具备了高优先级任务能够“立即”获得处理器并得到执行的特点,那么它仍然不算是实时操作系统。因为这个查找最高优先级任务的过程决定了调度时间是否具有确定性,例如一个包含 n 个就绪任务的系统中,如果仅仅从头找到尾,那么这个时间将直接和 n 相关,而下一个就绪任务抉择时间的长短将会极大的影响系统的实性。
uC/OS 内核中采用两种方法寻找最高优先级的任务
- 第一种是通用的方法:因为 uCOS防止 CPU平台不支持前导零指令,就采用 C语言模仿前导零指令的效果实现了快速查找到最高优先级任务的方法。
- 第二种方法则是特殊方法:利用硬件计算前导零指令 CLZ,这样子一次就能知道哪一个优先级任务能够运行,这种调度算法比普通方法更快捷,但受限于平台(在 STM32 中我们就使用这种方法)。
uCOS的任务状态

uC/OS的任务状态通常分为以下几种:
- 就绪
- 延时
- 等待
- 无期限等待
- 超时等待
- 运行
- 挂起(有挂起与恢复函数控制)
- 延时+挂起
- 无限期等待+挂起
- 超时等待+挂起
- 删除
注意:1. 挂起嵌套数
2. 与挂起任务不同的是,任务恢复函数指针不容许指向自身
3. 删除任务不是删除代码,是指任务将返回并处于删除(休眠)状态,任务的代码不再被uC/OS调用,注意,删除任务并不会释放任务的栈空间。
任务控制块存储有关这个任务重要的信息,对任务间有至关重要的作用,挂起任务根本不会动任务控制块,但删除任务就会把任务控制块进行初始化,这样子关于任务的任何信息都被抹去。
任务延时函数
每个任务都必须是死循环,并且必须有阻塞的情况,否则低优先级的任务无法运行。
- OSTimeDly()
- OSTimeDluHMSM()
节拍列表:加入节拍列表的任务会按照延时时间进行升序排列。
/

浙公网安备 33010602011771号