![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
![](http://embed.chinaitlab.com/UploadFiles_4615/200910/20091004093624493.gif)
图1 基于μC/OSII时间片调度过程 ① 任务2和任务3都处于就绪态,任务1在等待一个信号量,优先级中的任务2获得CPU使用权。
② 任务2的时间片用完,优先级低的任务3获得CPU使用权。
③ 任务3的时间片用完,任务2重新获得CPU的使用权。
④ 任务2的时间片还没用完时中断来临,中断服务程序获得CPU使用权。
⑤ 中断服务程序发送了一个任务1等待的信号量,中断服务完成后优先级高的任务1获得CPU使用权。
⑥ 任务1的时间片用完,任务2继续运行。
⑦ 任务2的时间片用完,任务3获得CPU使用权。
⑧ 任务3的时间片用完,重新分配时间片,新一轮调度开始。
2 实现方法
在调度算法的实现过程中,力求做到3点:
① 尽可能少地改动μC/OSII原有的代码;
② 增加的代码在风格上保持与原有的相一致;
③ 兼容原有的优先级调度法(可以很方便地选择优先级调度法或是时间片调度法)。
注:对于该小节中出现的代码,如果是笔者增加的部分都用黑体表示。
2.1 数据结构中增加的变量
在进程控制块中增加两项:
Typedef struct os_tcb{
……
#if OS_TASK_TIME_SLICE_EN>0
/*条件编译,OS_TASK_TIME_SLICE_EN在os_cfg.h中定义,凡是涉及与时间片调度相关的代码都用条件编译。这样,可以通过更改配置文件很方便地选择任务调度法
*/INT16UOSTCBTimeSlice;
/*任务的时间片大小,在任务创建时被初始化,运行过程中保持不变*/
INT16UOSTCBCounter;
/*任务运行剩余时间计数器,每一轮调度开始时该变量被赋值(等于OSTCBTimeSlice),运行过程中不断递减。当其等于0时任务被剥夺CPU使用权*/
#endif
}
由于当前任务的时间片使用完时,该任务将被从就绪表OSRdyGrp以及OSRdyTbl[OS_RDY_TBL_SIZE]中清除;新一轮调度开始时它又必须被恢复,因此笔者在uCOS_II.h文件中增加以下变量(不妨把它们称为“时间片调度表”)分别用于保存OSRdyGrp和OSRdyTbl[OS_RDY_TBL_SIZE]。
OS_EXT INT8UOSTSSGrp;
OS_EXT INT8UOSTSSTbl[OS_RDY_TBL_SIZE];
另外,在uCOS_II.h文件中增加宏定义,用于表示任务时间片被用完这种状态:
#defineOS_STAT_TS_USEUP0x40 |
|