导言
笔者曾在本刊2008年12期上宣布过一篇文章——《依据μC/OS-11的时刻片调度法规划》,近期在网络上看到有许多感兴趣的技能同行作了许多引证和转载。依据在实践项目中的使用经历,有必要对其再议,主要原因如下:
①多使命的时刻片调度在嵌入式范畴有实用价值。一方面是许多嵌入式软件体系晋级有这种需求,旧的软件模块依据Endless Loop完结,晋级到μC/OS-II后,若要最大极限地复用旧的软件模块,时刻片调度算法是完结旧的规划形式到新架构之间最简略的桥梁。另一方面,关于操控范畴,存在许多的耗时使命无法主动开释操控权,时刻片调度降低了使命规划的复杂度。刚刚发布不久的μC/OS-II,推出的严重改善之一便是增加了对Round Robin的支撑,更是标明μC/OS-II的使用者们对该功用的实践需求是实在存在的。
②不更改μC/OS-II内核代码完结时刻片调度。《依据μC/OS-II的时刻片调度法规划》对OS内核代码作了修正,尽管很少但增加了体系耦合度,对日后的项目保护和第三方晋级都是晦气的。假如存在彻底不必更改内核而仅依据OS服务的正常调用的完结计划,对体系的可靠性和移植性都是有利的。
③相对μC/OS-III,μC/OS-II依然有广泛的使用范畴。μC/OS-III作出了严重的改善,增加了时刻片调度,扩展了使命数的约束,答应了平等优先级使命的存在,更多新特性的引进带来了内核结构的重整以及运转时开支的增加。尽管能够经过装备优化体系,但就大部分的使用而言,μC/OS-II彻底能够担任,至少不需求只是为了时刻片调度功用而选用μC/OS-III。
1 调度原理
该调度算法对体系的要求有两点:首先要树立一个额定的调度使命用于办理待调度的用户使命时刻片计时及其切换,咱们将其命名为TaskRB_Scheduler;其次是保证其使命优先级高于一切的待调度时刻片使命,保证调度使命能抢占一切被调度使命的操控权。
咱们假定体系中有3个使命需求同享时刻片,分别为TaskRB_1、TaskRB_2、TaskRB_3。为了完结时刻片的调度功用,还需求额定的调度使命TaskRB Scheduler,所以体系中的将会有4个使命。其间,TaskRB Scheduler由初始化代码创立,而待调度的3个用户使命的创立和办理彻底由TaskRB Scheduler使命来完结。
TaskRB_Scheduler的运转分为两个阶段:首先是初始化阶段,担任一切时刻片使命的创立并保证其处于Suspend状况;然后是调度运转阶段,如图1所示。
下面对照图1对调度运转阶段的各个进程进行描绘。
①TaskRB_Scheduler经过调用OSTaskResume使TaskRB_1处于Ready状况(其他使命处于Suspend态)。
②TaskRB_Scheduler调用OSTimeDly开释操控权进入延时等候状况,延时参数即为TaskRB_1使命运转的时刻片长度,此刻仅有处于Ready态的用户使命TaskRB_1取得操控权进入Running状况。
③OSTimeDly超时产生,TaskRB_Schedulcr处于Rcady态而且由于使命优先级高于TaskRB_1抢占其操控权,所以TaskRB_Scheduler进入运转状况,TaskRB_1回来Ready态。
④TaskRB_Scheduler调用OSTaskSuspend让处于Ready态的TaskRB_1进入Suspend状况,防止其竞赛下一个时刻片。
⑤~⑧重复①~④进程,对TaskRB_2分配运转时刻片。
⑨~重复①~④进程,对TaskRB_3分配运转时刻片。
简而言之,调度使命由于具有最高优先级,能够依据时刻片分配表发动并打断待调度的时刻片使命,尽管时刻片使命优先级各不相同,但经过保证仅有一个时刻片使命处于Readsr态的办法,防止了不同时刻片使命之间的竞赛
抵触。
为简化示意图,并没有标示中止ISR行为的影响,事实上ISR只能影响到使命时刻片的长度而不会影响到使命片调度的流程;而关于时刻片调度体系而言,一般都选用类似于前后台体系的信号同步战略处理中止数据,这现已不是本文评论的要点。
2 完结代码
原理比较简略,只是给出 TaskRB_Scheduler部分代码:
3 使用扩展
有项目经历的人都深知Demo和产品有着大相径庭,这句话相同适用于此刻刻片调度计划。在实践使用中,咱们还须关注到以下几个方面。
(1)怎么与非时刻片调度使命协同作业
关于混合体系而言,作为时刻片调度的使命一般都对实时性要求比较低,因而一般的做法是设置优先级:实时使命优先级>TaskRB_Sche duler>时刻片使命>IDLE,时刻片精度会会由于实时使命的抢占受到影响。
(2)怎么处理时刻片使命中的critical_section
critical section的处理很重要,咱们一般不期望一个时刻片使命在发送UART数据包的进程中被TaskRB_Scheduler暂时掐断,但TaskRB_ Scheduler又确实无法预知时刻片用户的状况。有两种解决办法:一是经过调度器上锁,二是经过时刻片使命和调度使命同享互斥量。明显,调度器上锁不是个好主意,会封闭正常的使命切换,在上述的混合体系中简直是不行幻想的,但在朴实的时刻片调度体系中不会带来太多的费事。同享互斥量增加了体系资源的耗费,在混合体系中的运转时功率更高。
(3)运转时装备
TaskRB_Scheduler一方面是时刻片的调度器,另一方面也是一个一般的μC/OS-II使命,在实践项目中能够经过创立使命链表的方法保护办理归入时刻片调度的用户使命,在运转时灵敏地增加删去使命列表以及调整时刻片宽度。鉴于原理都很简略,完结代码不再赘述。