ucos-iii学习之循环轮转调度及调度的内部实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34401994/article/details/78088449

1.循环轮转调度
当多个任务有相同优先级时,uC/OS-III 允许每个任务运行规定的时间片。当任务没有用完分配给它的时间片时,它可以自愿地放弃CPU。
uC/OS-III 允许用户为每个任务设置不同的时间片。当任务被创建时,其时间片长度被设置。也可以在运行时调用 OSTaskTimeQuantaSet()修改。
2.调度的内部实现
OSSched()和 OSIntExit()。
OSSched()在任务级被调用,OSIntExit()在中断级被调用。
调度所需要的两个数据结构:位映像表和就绪列表。
(1)OSSched()
OSSched()通过扫描映像表OSPrioTbl[]找到就绪列表中优先级最高的位,确定好优先级后,索引到 OSRdyList[]并提取该记录中的首个TCB(OSRdyList[highest priority].HeadPtr)。
调度和上下文切换是运行在关中断的状态下的。
(2)OSIntExit()
中断级调度器代码。
(3)OS_SchedRoundRobin()
一任务的时间片期满,负责运行同优先级就绪的任务。
这个函数被OSTimeTick()或者 OS_IntQTask()调用。
3.总结
uC/OS-III 是可抢占的调度器,所以它总是执行优先级最高的就绪任务。
uC/OS-III 运行多个任务具有相同的优先级。这时,它可以被设置为循环轮转调度。

猜你喜欢

转载自blog.csdn.net/qq_34401994/article/details/78088449
今日推荐