UCOS学习笔记——任务管理

任务与任务调度器

任务的概念

从系统的角度看,任务是竞争系统资源的最小运行单元,UCOS是一个支持多任务的操作系统。在UCOS中, 任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其他任务运行,任何数量的任务可以共享同一个优先级,处于就绪态的多个相同优先级任务将会以时间片切换的方式共享处理器。
UCOS的任务可认为是一系列独立任务的集合。每个任务在自已的环境中运行。

任务调度器的概念

UCOS中提供的任务调度器是基于优先级的全抢占式调度
系统理论上可以支持无数个优先级(用户自定义
UCOS内核中采用两种方法寻找最高优先级的任务
通用方法:利用C语言模仿前导零指令的效果实现了快速查找到最高优先级任务的方法
特殊方法:利用硬件计算前导零指令CLZ
UCOS内核中也允许创建相同优先级的任务。相同优先级的任务采用时间片轮转方式进行调度,时间片轮转调度仅在当前系统中无更高优先级就绪任务存在的情况下才有效

任务状态迁移及UCOS任务状态

任务状态迁移

Alt

UCOS任务状态

UCOSIII支持的是单核CPU,不支持多核CPU,这样在某一时刻只有一个任务会获得CPU使用权进入运行态,其他的任务就会进入其他状态,UCOSII 中的任务有多个状态,如下表5.2.1所示。在这里插入图片描述
任务状态标志

就绪 (OS_ TASK_ STATE_RDY)
延时 (OS_ TASK_ STATE_DLY)
等待 (OS TASK STATE_PEND)
运行 (Running)
挂起 (OS_ TASK_ STATE_SUSPENDED)
延时+挂起 (OS_TASK_ STATE_ DLY_ SUSPENDED)
等待+挂起 (OS_TASK_STATE_ PEND_ SUSPENDED)
超时等待+挂起 (OS_ TASK_ STATE PEND_TIMEOUT SUSPENDED)
删除 (OS TASK STATE _DEL)

注意:
1:处于运行态的任务永远处于最高优先级
2:无论任务处于何种状态都能调用挂起函数,将任务挂起。当任务被挂起时不处于就绪列表,且对调度器不可见。

常用任务函数

任务挂起函数OS_ TaskSuspend()
挂起指定任务。被挂起的任务绝不会得到CPU的使用权,不管该任务具有什么优先级。
任务恢复函数OSTaskResume()
任务恢复就是让挂起的任务重新进入就绪状态,恢复的任务会保留挂起前的状态信息,在恢复的时候根据挂起时的状态继续运行。
删除任务函数QSTaskDel()
OSTaskDel()用于删除一个任务。当一个任务删除另外一个任务时,形参为要删除任务创建时返回的任务句柄,如果是删除自身,则形参为NULL。
OSTimeDly()
OSTimeDly()函数常用于停止当前任务进行的运行,延时(或阻塞)一段时间后再运行
DSTimeDlyHMSM()
OSTimeDlyHMSM()函数与OSTimeDly()函数的功能类似,但OSTimeDIlyHMSM()
函数会更加直观,延时多少个小时、分钟、秒、毫秒

任务设计注意事项

中断服务函数:在这个上下文环境中不能使用挂起当前任务的操作,不允许调用任何会阻塞运行的API函数接口
普通任务:任务设计时,就应该保证任务在不活跃的时候,任务可以进入阻塞态以交出CPU使用权,将紧急的处理事件的任务优先级设置得高一些。
空闲任务:用户可以通过空闲任务钩子方式,在空闲任务上钩入自己的功能函数,永远不会挂起空闲任务,不应该陷入死循环,需要留出部分时间用于统计系统的运行状态等。
任务的执行时间:要注意任务从开始到结束的时间和任务的周期设计的合理性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章