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 运行多个任务具有相同的优先级。这时,它可以被设置为循环轮转调度。
当多个任务有相同优先级时,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 运行多个任务具有相同的优先级。这时,它可以被设置为循环轮转调度。
相关文章推荐
- ucos-iii学习之抢占式调度以及调度点
- ucos-iii学习之内部任务管理
- ucos-iii学习之系统内部任务
- JS实现div内部的文字或图片自动循环滚动
- JS实现div内部的文字或图片自动循环滚动代码
- 修改uCOS_II以实现“优先级+时间片”联合调度
- NIO学习系列:缓冲区内部实现机制
- php学习之 循环结构实现代码
- Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度
- spring与quart整合实现任务调度_学习笔记
- ucOS学习笔记(2)——多任务是如何实现的
- 数据结构学习----顺序循环队列(Java实现)
- Linux设计与实现学习笔记之进程调度
- java按时间片轮转进程调度算法实现
- 修改uCOS_II以实现“优先级+时间片”联合调度
- Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度
- 数据结构学习之循环队列的另一种c++实现
- Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度
- 算法学习笔记 —— MergeSort 的一种循环实现
- Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度