首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于μC/OS-II的时间片调度法设计 02

基于μC/OS-II的时间片调度法设计 02

图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
返回列表