就续表之我见

就续表之我见

 

理解三个变量:OSRdyGrpOSRdyTbl[]OSMapTbl[]

 

所谓就绪表,就是定义了两个变量,OSRdyGrp是组向量,它就是一个八位二进制数(如:10000100),OSRdyTbl[]是位向量,它就是一个有八个元素的数组,每个元素也是一个八位二进制数(如:01100100,OSMapTbl[]uc为加快运算速度定义的一个数组,每个元素也是一个八位二进制数(为啥说它就加快运算了呢?若我们想使某个任务就绪,我们要把OSRdyGrpOSRdyTbl[]的某位上置1,正好与2n次方(如0000001021次方)相“或”,而uc把用到的八个值计算好了存放在一个数组里,用的时候只需要查就行了)

 

想让一个任务就绪:

OSRdyGrp |= OSMapTbl[prio>> 3];

OSRdyTbl[prio>> 3] |= OSMapTbl[prio & 0x07]

 

我们来看,一个任务优先级将它化成二进制数,它的低三位与它在哪一组没有任务关系!因为逢八才换组,而低三位最大才是七!但它能决定这个任务在一组的某个地方(即能决定X的值)而它的接下去三位与它在一组中的哪个位置没有任何关系!因为去掉低三位,接下去三位始终是八的倍数,始终指向组的首地址!但它能决定Y的值!这样,在一个矩阵中,X的值和Y的值都决定了,那么这个任务所在的位置就决定了。这样,使一个任务进入就绪状态和脱离就绪状态也就简单了。

 

让任务脱离就绪状态:

    If((OSRdyTbl[prio>> 3] &= ~OSMapTbl[prio & 0x07]== 0x00

           OSRdyGrp &= ~OSMapTbl[prio >> 0]

找出处于就绪状态的优先级最高的任务:

       y = OSUnMapTbl[OSRdyGrp];

       x = OSUnMapTbl[OSRdyTbl[y]];

       prio = y << 3 + x ;

 

如果不用查表的话,如入是OSRdyGrp = 00000010OSRdyTbl = 00010000,通过观察可以口算出prio = 8*1 + 4 = 12,即:OSRdyGrp 右移一位得到1OSRdyGrp右移4位得到1

 

 

 

OSUnMapTbl如何确定的呢??????????????????????????

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值