热度 12
2011-12-6 19:27
2619 次阅读|
0 个评论
就绪表中有两个变量:OSRdyGrp 和 OSRdyTbl 中任何一位是1时, OSRdyGrp 的第n 位 是1。相当于OSRdyGrp 是OSRdyTbl 按位来算的话正好是64个位---64个优先级。接下来我们再分析一下任务优先级变量: prio。由上图可知优先级变量的低三位 :在OSRdyTbl 中 “位”的位置; 次高三位: 在OSRdyGrp 中 “位”的位置。 数值m 换算成“位”的位置(OSMapTbl ; 低三位可以确定OSRdyTbl |= OSMapTbl ; 2. 使脱离就绪态的方法: if((OSRdyTbl = ~OSMapTbl ) = = 0) OSRdyGrp = ~OSMapTbl ; 由就绪表找出优先级最高的任务:上面的反运算,须查表 y = OSUnMapTbl ; x = OSUnMapTbl ]; Prio = y3+x; OK,那我们看看这个OSUnMapTbl 中查找,如果OSRdyTbl =0xE4 ,即二进制 1110 0100 ,可知 bit2 优先级最高。 于是乎Prio = 33+2=26 当OSRdyGrp= = 0bxxxx xxx1 时,最高优先级在OSRdyTbl 中 ,即OSUnMapTbl = 0 同理 当OSRdyGrp= = 0bxxxx xx10 时,最高优先级在OSRdyTbl 中 ,即OSUnMapTbl = 1 , 以此类推 OK,接下来我们画一个表格来总结一下 table border="1" cellpadding="0" cellspacing="0" tbody tr td style="width:142px;" OSRdyGrp /td td style="width:142px;" OSUnMapTbl /td td style="width:142px;" 个数 /td /tr tr td style="width:142px;" 0b xxxx xxx1 /td td style="width:142px;" 0 /td td style="width:142px;" 2^7 /td /tr tr td style="width:142px;" 0b xxxx xx10 /td td style="width:142px;" 1 /td td style="width:142px;" 2^6 /td /tr tr td style="width:142px;" 0b xxxx x100 /td td style="width:142px;" 2 /td td style="width:142px;" 2^5 /td /tr tr td style="width:142px;" 0b xxxx 1000 /td td style="width:142px;" 3 /td td style="width:142px;" 2^4 /td /tr tr td style="width:142px;" 0b xxx1 0000 /td td style="width:142px;" 4 /td td style="width:142px;" 2^3 /td /tr tr td style="width:142px;" 0b xx10 0000 /td td style="width:142px;" 5 /td td style="width:142px;" 2^2 /td /tr tr td style="width:142px;" 0b x100 0000 /td td style="width:142px;" 6 /td td style="width:142px;" 2^1 /td /tr tr td style="width:142px;" 0b 1000 0000 /td td style="width:142px;" 7 /td td style="width:142px;" 2^0 /td /tr /tbody /table 个数总和为255个 ,另外加上无法计算的OSUnMapTbl ,一共256个。 //下面是生成OSUnMapTbl 的代码 #include stdio.h void main(void) { int i,t; int tab ={0}; for(i=0;i8;i++) for(t=1;(ti)256;t++) //算法有重复的部分 { tab =i; } }