有256个元素的数组是通过任务就绪表找到就绪任务中优先级最高的任务所用到的数组。代码如下:
y=OSUnMapTal[OSRdyGrp];//获得优先级别的D5、D4、D3位
x=OSUnMapTal[OSRdyTbl[y]]; //获得优先级别的D2、D1 、D0位
prio=(y<<3)+x;
prio是表示优先级的一个无符号八位数,不过只有低六位有效。prio与就绪任务表的两个数组的关系是这样的:prio高三位表示组数,即OSRdyGrp[]中的哪一位是一。低三位表示这一组中的位数,即OSRdyTbl[]中的哪一位是一。例如,如果prio是00011001,即优先级是25。则OSRdyGrp[]中的第三位是被置一的,OSRdyTbl[]中的第一位是被置一的。
由于有可能有很多任务是处于就绪状态的,也就是说OSRdyGrp[]和OSRdyTbl[]中均有可能不止一位是被置一的。由于优先级的数字越小,级数越高,所以要从这些就绪的任务中找出优先级最高的任务,就需要找出这两个数组中被置为一的最低位。
OSUnMapTbl[]的作用就是将一个8位2进制数通过数组的形式通过查表的方式知道最低的位置。
=====================================================================================
- /*----------http://blog.csdn.net/schuke2008/archive/2008/10/10/3045813.aspx---
- ucos中的OSUnMapTbl,用来快速查询优先级。这个算法在ucos里面用的较多,比如后面的任务管理、任务间通信等都用到了。
- 每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。
- 在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。
- 就绪表OSRdyTbl[]的一个元素元素对应着一组任务,这个元素的每一位对应表示这一组的那个任务是否进入就绪态。
- 算法分析:寻找最高优先级任务的所在组 , 找一组8个中的那个优先级最高的
- ----------------------------------
- 计算出总优先级。
- y = OSUnMapTbl[OSRdyGrp];
- x = OSUnMapTbl[OSRdyTbl[y]];
- prio = (y << 3) + x;
- 使任务进入就绪状态
- OSRdyGrp |= OSMapTbl[prio >> 3];
- OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
- 从就绪表中删除一个任务
- if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)
- OSRdyGrp &= ~OSMapTbl[prio >> 3];
- ----------------------------------*/
- //下面是生成OSUnMapTbl[256]的代码
- #include <stdio.h>
- int main(void)
- {
- int i,t,n;
- int tab[256]={0};
- for(i=0;i<8;i++)
- for(t=1;(t<<i)<256;t++)
- {
- tab[t<<i]=i;
- }
- //output this tab
- for(n=0;n<=0xff;n++)
- {
- if(n%0x10==0)
- printf("\n");
- printf("%3d" , tab[n]);
- }
- printf("\n");
- }