您的位置:首页 > 其它

UC/OS-ii任务优先级管理与查找算法

2017-03-11 22:01 281 查看
今天看了一下UC/OS-ii中的任务调度算法,做了一下整理与总结。 首先,UC/OS-ii中之可以调度64个任务就是因为:(OSRdyGrp)8位*(就绪表OSRdyTbl【】)8位=64; 其中OSRdyTbl【】是一个长度为8个字节的数组,它用于存储各个优先级的任务是否就绪,对应优先级为:

而每个优先级的就绪状态为‘0’-未就绪 ‘1’-就绪表示。 而OSRdyGrp是一个字节,其中的8位就是用来表示数组中哪一组中有无就绪的任务(哪一组有就将对应的置为1,无则为0)。

例如:

OSRdyTbl[0],OSRdyTbl[3],OSRdyTbl[6]中有已就绪的任务,则OSRdyGrp二进制就为:10010010。

理解了以上,我们就可以来看看以下几个对于任务的管理算法:

1)任务的登记

就是将已经就绪的任务根据其优先级(prio)在就绪表(OSRdyTbl【】)里的相对应位置为‘1’。

其算法为:

OSRdyGrp|=OSMapTbl[prio>>3];

OSRdyTbl[prio>>3]|=OSMapTbl[prio&0X07];

**:prio>>3:根据位运算可以得到其所在的组比如:15 : 00001111B>>3=00000001B=1其在OSRdyTbl[1]。

其中:

OSMapTbl[0]=00000001B;

OSMapTbl[1]=00000010B;

OSMapTbl[2]=00000100B;

OSMapTbl[3]=00001000B;

OSMapTbl[4]=00010000B;

OSMapTbl[5]=00100000B;

OSMapTbl[6]=01000000B;

OSMapTbl[7]=10000000B;

2) 任务注销:

任务的需要脱离就绪态时就要将其在就绪表置为‘0’,这就是任务注销。

其算法与登记的思想一样,算法刚好相反:

if((OSRdyTbl[prio>>3]&= -OSMapTbl[prio&0X07])==0)

OSRdyGrp&= -OSMapTbl[prio>>3];//如果此组已无就绪任务将OSRdyGrp相应的位置为‘0’;

3) 最高优先级就绪任务的查找:

这是任务调度的很重要的算法,是要OS每次任务调度时要找到已就绪的任务中优先级最高的任务(prio):

Y=OSUnMapTal[OSRdyGrp];

X=OSUnMapTal[OSRdyTbl[y]];

Prio=(y<<3)+x;

而关于OSUnMapTbl[]数组的定义为:



而这个数组很多书上是不做介绍的,经过本人的研究发现,其实这张表很简单:

因为,优先级越高其所在就绪表的组下表越小,那么在OSRdyGrp中其所在位数也就越低。

那么我们就可以这么说,在OSRdyGrp中其中的8位我们只找为‘1’的最低为就好,那么在8位二进制表示的数中也就是OSRdyGrp的值,所有由最低位为‘1’的所构成的数x,比如:0: 00000000B,2: 00000010B……,我们将其所在的OSUnMapTbl[x]置为1,0: 00000000B,2: 11111110B……,我们将其所在的OSUnMapTbl[x]置为0。。。。所有,由最低位为‘0’,次低位为‘1’的数x,所对应的 OSUnMapTal[x]置为1,以此类推。而所置成的数就是我们要找的

OSRdyTbl【】的下标y。

而x的求法与y的求法一样,只是将OSRdyGrp换成了OSRdyTbl【】;

而y<<3就是将数值向上进一组,然后再加上所在组的位数就是其优先级Prior了;

以上就是我个人对于UC/OS-II中任务调度的认识,如若有误请不吝赐教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息