就续表之我见
理解三个变量:OSRdyGrp、OSRdyTbl[]、OSMapTbl[]
所谓就绪表,就是定义了两个变量,OSRdyGrp是组向量,它就是一个八位二进制数(如:10000100),OSRdyTbl[]是位向量,它就是一个有八个元素的数组,每个元素也是一个八位二进制数(如:01100100),OSMapTbl[]是uc为加快运算速度定义的一个数组,每个元素也是一个八位二进制数(为啥说它就加快运算了呢?若我们想使某个任务就绪,我们要把OSRdyGrp、OSRdyTbl[]的某位上置1,正好与2的n次方(如00000010是2的1次方)相“或”,而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 = 00000010,OSRdyTbl = 00010000,通过观察可以口算出prio = 8*1 + 4 = 12,即:OSRdyGrp 右移一位得到1,OSRdyGrp右移4位得到1
OSUnMapTbl如何确定的呢??????????????????????????