当前位置:首页 > 模拟 > 模拟
[导读]多任务的调度算法多种多样,各种调度算法也各有千秋。在某些应用场合,时间片调度法就比纯粹的优先级调度法更具优势。本文提出了基于μC/OS—II的时间片调度法的设计原理,给出实现该调度法的关键部分源代码,并且通过一个简单的应用实例将该时间片调度法与优先级调度法进行比较。

引 言
    μC/0S—II嵌入式实时操作系统采用的是基于优先级的可剥夺调度法。基于优先级的可剥夺调度法是指,CPU总是让处于就绪态的、优先级最高的任务运行;最高优先级的任务一旦就绪,总能得到CPU的使用权,当一个运行着的任务使一个比它优先级高的任务进入了就绪态时,当前任务的CPU使用权就被剥夺了,更高优先级的任务立刻得到了CPU的使用权。除非最高优先级的任务主动放弃CPU的使用权(通过调用0STimeDly()、0SSem—Pend()等函数),否则低优先级的任务是没机会获得CPU使用权的。对于一个实际应用系统中耗时比较长的任务,为了让其他任务能够得到实时调度,可以用两种方法来处理。第一种方法是把该任务的优先级设为最低(当然还是比空闲任务要高);第二种方法就是让该耗时任务运行一段时间后延时一下再继续运行,即把整个任务划分为若干步骤来执行,如以下的示例代码:

    很多情况下,耗时长的任务并不能设置为最低优先级任务,而划分步骤来执行的方法不但繁琐而且每一步执行的时间也是不确定的(其他低优先级任务获得CPU使用权的时间也会是不确定的)。笔者在用μC/OS—II开发一款车载信息娱乐系统的时候就碰到了这样的问题,因此设计了一种优先级和时间片相结合的调度法(也就是基于μC/0S—II的时间片调度法)。

1 调度原理
    这种调度法给处于就绪态的每一个任务都分配一个时间片(优先级越高分配的时间片越长,空闲任务得不到时间片的分配),内核按照任务的优先级依次调度处于就绪态的任务,即当就绪态中最高优先级的任务用完自己的时间片后,CPU控制权转让给就绪态中优先级第二高的任务。该任务用完自己的时间片后,CPU控制权又转让给下一优先级的就绪态任务……当就绪态的每一个任务都被调度一次之后将重新为它们分配时间片,然后又开始新一轮的调度……
    其中要注意的是,在调度过程中如果有一个比当前任务优先级更高的任务由其他态变成了就绪态(被创建或获取了一个信号量等),当前任务的CPU控制权将被剥夺;空闲任务仍然是等到其他任务都退出就绪态才获得CPU的使用权。
    图1解释了该调度法的调度过程(其中任务1优先级最高,任务2次之,任务3最低)。

    ①任务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/0S—II原有的代码;
    ②增加的代码在风格上保持与原有的相一致;
    ③兼容原有的优先级调度法(可以很方便地选择优先级调度法或是时间片调度法)。
    注:对于该小节中出现的代码,如果是笔者增加的部分都用黑体表示。
2.1 数据结构中增加的变量
   
在进程控制块中增加两项:

Typedef struct os_tcb{

    ……

    #if OS_TASK_TIME_SLICE-EN>0

    /*条件编译,OS_TASK_TIME_SLICE_EN在os_cfg.h中定义,凡是涉及与时间片调度相关的代码都用条件编译。这样,可以通过更改配置文件很方便地选择任务调度法*/

INT16U OSTCBTimeSlice;

    /*任务的时间片大小,在任务创建时被初始化,运行过程中保持不变*/

INT16U OSTCBCounter;

    /*任务运行剩余时间计数器,每一轮调度开始时该变量被赋值(等于OSTCBTimeSlice),运行过程中不断递减。当其等于0时任务被剥夺CPU使用权*/

    #endif

}
    由于当前任务的时间片使用完时,该任务将被从就绪表OSRdyGrp以及OSRdyTbl[OS_RDY_TBL_SIZE]中清除;新一轮调度开始时它又必须被恢复,因此笔者在uC0S_II.h文件中增加以下变量(不妨把它们称为“时间片调度表”)分别用于保存OSRdyGrp和OSRdyTbl[OS_RDY_TBL_SIZE]。
    OS_EXT INT8U OSTSSGrp;
    OS_EXT INT8U OSTSSTbl[OS_RDY_TBL_SIZE];
    另外,在uCOS_II.h文件中增加宏定义,用于表示任务时间片被用完这种状态:
    #define OS_STAT_TS_USEUP 0x40
2.2 相关函数的修改
   
对0S_TCBInit()、OSTimeTick()、OSTimeD1y()、OS_EventTaskWait()、OS_EventTaskRdy()这5个函数的修改,是在μC/OS—II基础上实现时间片调度法的关键。下面将一一对这几个函数的修改部分进行说明。
    在初始化任务控制块的函数0S_TCBInit()中,笔者添加以下代码让新创建的任务处于时间片就绪表中,并根据任务优先级对任务的时间片大小进行初始化。


    0STimeTick()函数在每个时钟滴答被调用,在时间片调度过程中起到了递减时间片计数器的作用。当计数器为0时,进行任务切换或是重新给各个任务分配时间片并开始新一轮调度。
    OSTimeDly()函数的作用是将任务延时一定的时间。这种情况下,应该把该任务从时间片调度表中清除。
    当某个任务须等待一个事件的发生时,信号量、互斥型信号量、邮箱及消息队列会通过相应的PEND函数调用函数OS_EventTaskwait(),使当前任务从就绪任务表中脱离就绪态,此时还需把当前任务从时问片调度表中清除。笔者在OS_EventTaskWait()函数中添加了以下代码:

   

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


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


    由于模拟的耗时任务Task_TimeConsuming()是个死循环且没有调用OSTimeDly()函数,其优先级又比Task_Audio()高,如果完全按照优先级调度,系统不会有声音输出,因为负责声音控制的任务Task_Audio一直得不到运行。而如果按照时间片调度(在os_cfg.h中增加#defineOS_TASK_TIME_SLICE_EN 1),则声音输出正常,通过仿真器在Task_Audio()中设置断点,程序会很快停止在断点处。进一步地,依次在Task_TimeConsuming()和Task_Audio()函数体中设置断点,分别记录两次PC指针停止在断点处时看门狗计数器的值WDG_Counterl和WDG_Counter2,可以利用WDG_Counter1和WDG_Counter2的差值估算出任务Task_Audio前后两次被调度的时间间隔(忽略任务在切换过程中的耗时)。经过多次计算,这个时间间隔值的范围在58~59 ms,而任务Task_TimeConsuming的时间片理论值=64一Prio=64—5=59 ms,实验值与理论值是非常吻合的。
    当然,这只是简单的验证实验。严格的测试还需要兼顾信号量、互斥型信号量、邮箱及消息队列相应的PEND、POST函数以及0STimeDly()函数调用。鉴于篇幅关系,这里就不再赘述了。

结 语
    笔者已经成功地把这种基于μC/0S—II的时间片调度法运用到车载信息娱乐系统的开发中。实践证明,对于含有耗时任务的系统,尤其是在需要严格控制耗时任务运行时间长度的场合,该调度算法会有一定的便捷性,也能保证系统的实时响应,而且整个算法只改动了μC/OS—II中的少量代码;还可以根据实际需要调整各个任务的时间片大小,体现出了算法的实用性与灵活性。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

联发科下一代旗舰芯片天玑9400的传闻近期在数码圈掀起了不少讨论。知名博主数码闲聊站爆料称,为确保天玑9400在性能和能效上占据优势,联发科深入参与了Armv9“Blackhawk黑鹰”CPU架构的设计,并指出这种新架构...

关键字: 天玑9400 CPU

助力科研与检测新突破 上海2024年5月15日 /美通社/ -- 全球知名的科学仪器和服务提供商珀金埃尔默公司今日在上海举办了主题为"创新不止,探索无界"的新品发布会,集中展示了其在分析仪器领域的最...

关键字: 质谱仪 BSP DSC 气相色谱

上海2024年5月16日 /美通社/ -- 2024年5月10日至5月13日,富士胶片(中国)投资有限公司携旗下影像产品创新力作亮相北京P&E 2024。在数码相机展览区域,全新制定的集团使命"为世界绽...

关键字: 富士 数码相机 影像 BSP

贝克曼库尔特目前已成为MeMed Key免疫分析平台和MeMed BV检测技术的授权经销商 在原有合作的基础上,继续开发适用于贝克曼库尔特免疫分析仪的MeMed BV检测 加州布瑞亚和以色列海法2024年5月16日...

关键字: BSP IO 检测技术 免疫分析仪

英国英泰力能的燃料电池是可产业化的产品解决方案 英国首个专为乘用车市场开发的燃料电池系统 在 157kW 功率下,此燃料电池比乘用车的其他发动机更为强大 &...

关键字: ENERGY INTELLIGENT 氢燃料电池 BSP

深爱人才,共赴"芯"程 深圳2024年5月15日 /美通社/ -- 5月11日,深圳国资国企"博士人才荟"半导体与集成电路产业专场活动在深圳市重投天科半导体有限公司(简...

关键字: 半导体 集成电路产业 BSP 人工智能

武汉2024年5月15日 /美通社/ -- 北京时间4月26日-5月4日,2024 VEX 机器人世界锦标赛于美国得克萨斯州达拉斯市举办。本届 VEX 世锦赛为期九天,设有 VIQRC 小学组/初中组、V5RC 初中组/...

关键字: 机器人 BSP RC POWERED

上海2024年5月15日 /美通社/ -- 由生成式人工智能(AI)驱动的临床阶段生物医药科技公司英矽智能宣布,与复星医药(600196.SH;02196.HK)合作开发的潜在"全球首创"候选药物IS...

关键字: ISM BSP PC 人工智能

上海2024年5月13日 /美通社/ -- 5月8日,浦东新区国资委组织陆家嘴集团等9家区属企业与立邦中国召开合作交流会,旨在贯彻落实浦东新区区委、区政府工作要求,进一步放大进博会溢出带动效应,持续扩大区属企业与进博会重...

关键字: BSP 数字化 自动化立体仓库 智慧园区

上海2024年5月13日 /美通社/ -- 在数字化时代,高效的税务管理和ERP系统成为企业发展的关键。为了满足这一需求商应信息科技与Exact Software 易科软件就金四全电票税系统与ERP系统集成及商务合作建立...

关键字: AC 软件 BSP 数字化
关闭
关闭