用空间换时间,通过对OSRdyGrp查表找到高优先级组SRdyTbl[prio],然后把OSRdyTbl查表找到高优先级任务。
只需两次查表即可找到,时间确定。表考虑了所有的情况,通过数组编号找到相应的情况。
在程序中,可以用类似下面的代码把优先级别为prio的任务置为就绪状态:
OSRdyGrp |=OSMapTbl[prio>>3];
OSRdyTbl[prio>>3]| = OSMapTbl[prio&0x07];
如果要使一个优先级别为prio的任务脱离就绪状态则可使用如下类似代码:
if((OSRdyTbl[prio>>3]&=~OSMapTbl[prio&0x07])==0)//去除相应位后寻找是否还是零
OSRdyGrp&=~OSMapTbl[prio>>3];
优先级判定表OSUnMabTbl[],其内容如下:
INT8U const OSUnMapTbl[]= {
0, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
7, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};
因为8位参数的取值为0—255,所以它一共有256个值。数组的下标是优先级,8位正好256个状态,256个下标。每个下标对应的数字的第几个二进制数字先是一,就为几(因为这个是我们最关心的).例如
1二进制表示为00000001,第0个数字为1,就为0;
2二进制表示为00000010,第1个数字为1,就为1;
3二进制表示为00000011,第0个数字为1,就为0;
4二进制表示为00000100,第3个数字为1,就为3;
依次类推,当8位参数(n)最低位为1时,即奇数的表示都为0.
此表作用是找出8位参数中逻辑1所在的最低位,即将8位参数转换为二进制,然后从第0为开始查找,看第几位首先出现逻辑1。此表中元素的取值从0—7,用其查找最高优先级任务的算法如下:
y =OSUnMapTbl[OSRdyGrp];
x =OSUnMapTbl[OSRdyTbl[y]];
prio =(y<<3)+x;
详细内容:http://note.youdao.com/share/?id=fc8d4d97dae2a5b676a2c53ce926ed57&type=note