基于μC/OS-Ⅱ的实时分层调度算法研究

时间:2012-04-16来源:网络

(该子系统模块1中的任务在最坏的情况下,完成任务的时间分别为:
R11=RL-1+E1=2+0.5=2.5
R12=2*RL-1-(1-E1)+E2=5-0.5+1.2=5.7
R13=3*RL-1-(2-E1-E2)+E3+E1=9-1-0.3+0.8-0.5=9

而按照分层模型可调度性公式(2.2a)迭代计算可知Rij最大响应时间分别如下:

R11(max):初始预设值为t(1)=0.5(即任务的执行时间),用该值替代t,发现公式(2.2a)左边等于0.5,但右边为0,不满足公式(2.2a),第二次迭代中,t(2)= =3,经计算发现针对该t值,公式(2.2a)成立,因此T11的最大响应时间为3,依次可计算第一个子模块中其它两个任务的最大响应时间分别为 R12(max)=6,R13(max)=9。

由此可知系统在分层调度情况下,子模块M1中的任务最坏情况下的调度能在最大响应时间内运行完毕。同理,对其它2个模块中的任务逐个检验它的可调度条件,可判别出子系统模块中的任务在最坏情况下的调度能满足最大响应时间的要求,从而保证分层情况下任务的可调度性。

2.2 实现分层调度的μC/OS-Ⅱ内核结构修改和扩展

为了实现分层调度,需要修改和扩展μC/OS-Ⅱ内核结构。创建一个模块控制块MCB,以此作为模块标识,将属于同一模块的任务TCB挂在同一模块任务链上,在调度过程中,子模块按固定时间轮转调度,子模块中任务的调度仍然保持μC/OS-Ⅱ按优先级的抢占式调度策略按RM调度算法进行。为实现分层任务的级联查找,需要创建两级索引表,一级指向子模块,另一级索引子模块中的任务,原内核结构如图2所示,改进后的内核结构如图3所示。

15.jpg

具体的调度算法如下 :
OS_Layered_Sched(){
OSMCBRdy = Get a ready submode;/* 控制块就绪指针指向一个子模块*/
if ( OSMCBGetCycle_Piece = =ture ) {/*子模块得到固定时间分配。*/
if (MCBTb[].TaskTcb[].Rdy==ture) /*查看其中是否有就绪的任务,如果有,则调度*/
{OS_ENTER_CRITICAL();
OS_PRIOCYCLE_RDY =(INT8U)(z+(y3+)+OS_UnMapTb1[OSRdyTb1[y]];
/* z是用来确定模块的地址*/ OS_sched();
OS_EXIT_CRITICAL()}
else {
if( MCBTb!= MCBTb[n]) /*判断是否到了最后一个子模块*/
{ MCBTb= MCBTb->next; }/*是,指向下一个子模块,否,指针回到第一个子模块*/
Else
{ MCBTb = MCBTb[1] }
}
}

3、实验仿真及结果分析

移植μC/OS- Ⅱ实时操作系统到PC机上,以BC++4.5为开发平台,完成分层调度算法下任务的调度执行,结果如图4所示。

16.jpg

实验结果显示,改进后的算法可以实现分层子模块中任务的调度,调度器运转正常,证明了分层调度算法的可行性。在执行多次后,如有任务完成,它就脱离原来的链,重新调整两级索引表,并按调整后的两级索引表引起新的调度。

1 2 3

关键词: 算法 研究 调度 分层 C/OS- 实时 基于

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版