新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > μC/OS2Ⅱ中优先级调度算法的改进及实现

μC/OS2Ⅱ中优先级调度算法的改进及实现

作者:时间:2012-04-06来源:网络收藏


将任务放入

套用μC/OS2Ⅱ中定义的变量OSRdyGrp和OSRdyTbl[ ],仍旧用变量OSRdyGrp来表示中所在的行,在OSRdyGrp中,任务按分组,16个任务为一组。OSRdyGrp的每一位表示16组任务中是否有进入就绪态的任务,如果存在进入就绪态的任务,则相应位置为1。使用OSRdyTbl[]数组(根据上面的扩展规则将该数组的大小由原来的8位扩展为16位) 表示在就绪表中的列信息,即存放每个优先级的任务是否就绪的信息,如果某一位对应的任务处于就绪态,则将该位的值置为1。

例如,OSRdyTbl[0]对应优先级为0~15的任务,OSRdyTbl [1]对应优先级为16~31的任务,依次类推,OSRdyTbl[15]对应优先级为240~255的任务。优先级为78的任务处于就绪状态,不仅要将 OSRdyTbl[4]的第14位置1,而且要将OSRdyGrp的第4位置1。也就是说只要OSRdyTbl[n ]中有一位为1,则OS2RdyGrp的第n 位就为1。变量OSRdyGrp和OSRdyTbl[]之间的关系如图2所示(图2中OSRdyGrp下表格中标注的数字0~15仅为清楚起见表示16组任务,并非表示OSRdyGrp中每一位的状态信息,同理,OSRdyTbl[ ]下表格中的数字0~255也仅表示256个任务,并非实际存放的状态信息) 。



把任务放入就绪表的程序是:

OSRdyGrp| =OSMapTbl[prio> > 4];
OSRdyTbl[prio> > 4]| =OSMapTbl[prio 0X0F];

其中,char OSMapTbl[]= {0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0X0100,0X0200,0X0400,0X0800,0X1000,0X2000,0X4000,0X8000} ,用于限制OSRdyTbl []数组的元素下标在0到15之间,prio表示任务的优先级。

从就绪表中删除任务

当优先级为prio任务脱离就绪状态时,可清除OSRdyGrp和OSRdyTbl[]中的对应该任务的位:
if ( (OSRdyTbl[prio> > 4] =~OSMapTbl[prio 0X0F]) ==0)
OSRdyGrp =~OSMapTbl[prio> > 4];

以上代码将就绪任务表数组OSRdyTbl []中相应元素的相应位清零,而对于OSRdyGrp,只有当被删除任务所在的任务组中,全组任务一个都没有进入就绪态时,才将相应位清零。也就是说,OSRdyTbl [prio> > 4]所有的位都是0时,OSRdyGrp的相应位才清0。

判定最高优先级就绪任务的方法

在 μC/OS2Ⅱ中,采用基于优先级的可抢占式调度策略,系统为每一个任务分配一个优先级,调度程序总是选择优先级最高的就绪任务运行。内核运行中将频繁地进行,并且属于系统的临界资源,调度时需要独占CPU,不允许外部中断和任务切换。所以调度速度缓慢时,会影响整个系统的响应速度和处理能力。因此,如何快速查找最高优先级就绪任务就成为整个算法的核心问题之一。



评论


相关推荐

技术专区

关闭