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

今天看了一下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中任务调度的认识,如若有误请不吝赐教。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值