您的位置:首页 > 其它

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

2017-09-25 19:13 211 查看
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 运行多个任务具有相同的优先级。这时,它可以被设置为循环轮转调度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cpu