【uCOSiii】任务管理

為{幸葍}努か 提交于 2020-03-07 07:09:55

uCOSiii 一个任务由三部分组成

①任务控制块:任务控制块os_tcb是一个比较复杂结构体,它用来保存任务的信息。在使用OSTaskCreate()时会创建任务时会分配一个任务控制块给任务。
②任务堆栈:每个任务都有任务堆栈CPU_STK,在进行任务切换时用来保存现场也就是将当前任务的状态和变量保存在自身的任务堆栈中,等到下次切换回来时,再将任务堆栈的内容取出。
③任务函数:也就是自己写应用程序。

uCOSiii 有五种任务状态


①休眠态:还未用OSTaskCreate()创建任务时的状态,也就是一段未执行的代码。
②就绪态:已经记录在就绪表中的状态,等待获得cpu使用权
③运行态:正在运行的任务状态
④等待态:正在运行的任务为了等待内核对象比如信号量,消息暂时让出cpu使用权进入等待态,直到内核对象到达就会重新进入就绪态
⑤中断服务态:运行的任务被中断打断,cpu去执行中断,任务就挂起进入中断服务态。

任务就绪表由就绪任务列表跟优先级位映射表组成:

**优先级位映射表:**简单地说就是用一个8或者16或者32位的数据的每一位代表一个优先级,某优先级下有就绪任务就会将相应的位置1 。OSPrioTbl[MAX]代表有多个32位组成的优先级位映射表;通过OS_PrioGetHighest()来获得优先级位映射表中最高优先级的任务。
就绪任务列表:
struct os_rdy_list {
OS_TCB *HeadPtr;
OS_TCB *TailPtr;
OS_OBJ_QTY NbrEntries;
};
因为ucosiii支持时间片轮转调度,所以用就绪任务列表来管理同一优先级下的任务。

任务调度

ucosiii是可剥夺型内核,高优先级会抢占低优先级任务的CPU使用权,cpu总是先执行任务就绪表中优先级最高的任务,所以就需要任务调度来切换。任务调度靠任务调度器
任务调度器
调度器又分为任务级调度器OSSched()跟中断级调度器OSIntExit()。
时间片轮转调度
时间片轮转调度同一优先级下的任务,分配给任务时间片,时间片过了就会执行当前优先级下的其他就绪任务。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!