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

[11-20 15:54:45]   来源:http://www.88dzw.com  arm嵌入式   阅读:8443

文章摘要:…… #if OS_TASK_TIME_SLICE_EN>0/*条件编译,OS_TASK_TIME_SLICE_EN在os_cfg.h中定义,凡是涉及与时间片调度相关的代码都用条件编译。这样,可以通过更改配置文件很方便地选择任务调度法 */INT16UOSTCBTimeSlice;/*任务的时间片大小,在任务创建时被初始化,运行过程中保持不变*/ INT16UOSTCBCounter;/*任务运行剩余时间计数器,每一轮调度开始时该变量被赋值(等于OSTCBTimeSlice),运行过程中不断递减。当其等于0时任务被剥夺CPU使用权*/ #end

基于μC/OS-II的时间片调度法设计,标签:arm嵌入式系统,arm系统,http://www.88dzw.com

  ……

      #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

 2.2 相关函数的修改

  对OS_TCBInit()、OSTimeTick()、OSTimeDly()、OS_EventTaskWait()、OS_EventTaskRdy()这5个函数的修改,是在μC/OSII基础上实现时间片调度法的关键。下面将一一对这几个函数的修改部分进行说明。

  在初始化任务控制块的函数OS_TCBInit()中,笔者添加以下代码让新创建的任务处于时间片就绪表中,并根据任务优先级对任务的时间片大小进行初始化。



  OSTimeTick()函数在每个时钟滴答被调用,在时间片调度过程中起到了递减时间片计数器的作用。当计数器为0时,进行任务切换或是重新给各个任务分配时间片并开始新一轮调度。

  OSTimeDly()函数的作用是将任务延时一定的时间。这种情况下,应该把该任务从时间片调度表中清除。

  当某个任务须等待一个事件的发生时,信号量、互斥型信号量、邮箱及消息队列会通过相应的PEND函数调用函数OS_EventTaskWait(),使当前任务从就绪任务表中脱离就绪态,此时还需把当前任务从时间片调度表中清除。笔者在OS_EventTaskWait()函数中添加了以下代码:



  相应地,当某个事件发生了,信号量、互斥型信号量、邮箱及消息队列会通过相应的POST函数调用OS_EventTaskRdy(),从等待任务队列中使最高优先级任务脱离等待状态,此时还需要把该任务添加到时间片调度表中。笔者在OS_EventTaskRdy()函数中添加了以下代码:

  OSTSSGrp |= bity;

  OSTSSTbl[y] |= bitx;

  3 应用实例

  笔者首先把μC/OSII移植到开发板上(MCU是意法半导体生产的基于ARM7TDMI核的STR730[3]),然后如2小节所述对相关部分的源代码进行修改,接下来将优先级调度法和基于μC/OSII的时间片调度法进行比较。为此分别建立了2个任务Task_TimeConsuming()、Task_Audio(),任务的优先级分别是5、6。


上一页  [1] [2] [3]  下一页


Tag:arm嵌入式arm嵌入式系统,arm系统arm嵌入式
分类导航
最新更新
热门排行