优先级判定表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;