就绪表中有两个变量:OSRdyGrp 和 OSRdyTbl[].
这两个变量的对应关系是
OSRdyTbl[ n ] 中任何一位是1时, OSRdyGrp 的第n 位 是1。相当于OSRdyGrp 是OSRdyTbl[]的索引。
具体的对应关系如下图
数组OSRdyTbl[8] 按位来算的话正好是64个位---64个优先级。接下来我们再分析一下任务优先级变量: prio。由上图可知优先级变量的低三位 :在OSRdyTbl[OS_LOWEST_PRIO/8+1] 中 “位”的位置; 次高三位: 在OSRdyGrp 中 “位”的位置。
数值m 换算成“位”的位置(OSMapTbl[]的值)
<table border="1" cellpadding="0" cellspacing="0"> <tbody> <tr> <td style="width:284px;">m
</td> <td style="width:284px;">位表示
</td> </tr> <tr> <td style="width:284px;">0
</td> <td style="width:284px;">0000 0001
</td> </tr> <tr> <td style="width:284px;">1
</td> <td style="width:284px;">0000 0010
</td> </tr> <tr> <td style="width:284px;">2
</td> <td style="width:284px;">0000 0100
</td> </tr> <tr> <td style="width:284px;">3
</td> <td style="width:284px;">0000 1000
</td> </tr> <tr> <td style="width:284px;">4
</td> <td style="width:284px;">0001 0000
</td> </tr> <tr> <td style="width:284px;">5
</td> <td style="width:284px;">0010 0000
</td> </tr> <tr> <td style="width:284px;">6
</td> <td style="width:284px;">0100 0000
</td> </tr> <tr> <td style="width:284px;">7
</td> <td style="width:284px;">1000 0000
</td> </tr> </tbody> </table>
由上可知
1.使进入就绪态的方法:
Prio的次高三位可以确定OSRdyGrp
OSRdyGrp |= OSMapTbl[Prio>>3];
低三位可以确定OSRdyTbl[]
OSRdyTbl[[Prio>>3] |= OSMapTbl[Prio&0x07];
2. 使脱离就绪态的方法:
if((OSRdyTbl[Prio>>3] &= ~OSMapTbl[Prio&0x07]) = = 0)
OSRdyGrp &= ~OSMapTbl[Prio>>3];
由就绪表找出优先级最高的任务:上面的反运算,须查表
y = OSUnMapTbl[OSRdyGrp ];
x = OSUnMapTbl[ OSRdyTbl[y] ];
Prio = y<<3+x;
OK,那我们看看这个OSUnMapTbl[] 表是如何建立起来的
假设 OSRdyGrp= 0x68 , 即二进制: 0110 1000
根据低位优先级高,可知 OSRdyGrp 中bit3 优先级最高。在OSRdyTbl[3] 中查找,如果OSRdyTbl[3]=0xE4 ,即二进制 1110 0100 ,可知 bit2 优先级最高。 于是乎Prio = 3<<3+2=26
当OSRdyGrp= = 0bxxxx xxx1 时,最高优先级在OSRdyTbl[0]中 ,即OSUnMapTbl[OSRdyGrp] = 0
同理
当OSRdyGrp= = 0bxxxx xx10 时,最高优先级在OSRdyTbl[1]中 ,即OSUnMapTbl[OSRdyGrp] = 1 , 以此类推
OK,接下来我们画一个表格来总结一下
<table border="1" cellpadding="0" cellspacing="0"> <tbody> <tr> <td style="width:142px;">
OSRdyGrp
</td> <td style="width:142px;">OSUnMapTbl[OSRdyGrp]
</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 [0 ] ,一共256个。
//下面是生成OSUnMapTbl[256]的代码
#include <stdio.h>
void main(void)
{
int i,t;
int tab[256]={0};
for(i=0;i<8;i++)
for(t=1;(t<<i)<256;t++) //算法有重复的部分
{
tab[t<<i]=i;
}
}
文章评论(0条评论)
登录后参与讨论