教材:嵌入式系统及应用,罗蕾、李允、陈丽蓉等,电子工业出版社
都是从0开始算
char OSRdyGrp;
OSRdyGrp 的每个二进制位对应一个 OSRdyTbl 的数组元素,第 i 位对应 OSRdyTbl[i]
若 OSRdyTbl[i] 对应的8个优先级中有就绪的任务,则 OSRdyGrp 的第 i 位置1,不然为0
优先级数目为64时,对应6个二进制位
表示优先级的6个二进制位中
例如优先级36,二进制表示为为00100101
OSRdyGrp = 0x011; //0b00010001
OSRdyTbl[0] = 0x0a; //0b00001010
OSRdyTbl[4] = 0x01;//0b00000001
存在的几个优先级为 0×8+1=1,0×8+3=3,4×8+0=32
char OSMapTbl[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
数组元素的下标与任务优先级的高3位对应时,数组元素对应的二进制值中,位为1的位表示 OSRdyGrp 的对应位也为1
数组元素的下标与任务优先级的低3位对应时,数组元素对应的二进制值中,位为1的位表示 OSRdyTbl[] 的对应位也为1
char OSUnMapTbl[256]
INT8U const OSUnMapTbl[256] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x00 to 0x0F */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x10 to 0x1F */
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x20 to 0x2F */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x30 to 0x3F */
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x40 to 0x4F */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x50 to 0x5F */
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x60 to 0x6F */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x70 to 0x7F */
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x80 to 0x8F */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x90 to 0x9F */
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xA0 to 0xAF */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xB0 to 0xBF */
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xC0 to 0xCF */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xD0 to 0xDF */
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xE0 to 0xEF */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* 0xF0 to 0xFF */
};
以 OSRdyGrp 或是 OSRdyTbl[] 数组元素的值为索引,获取该值对应二进制表示中1出现的最低二进制位的序号(0-7)
数组中元素 OSUnMapTbl[n] 表示一个任意的8位无符号数n对应的最低位为1的那个位序
例如二进制数 00000001B 最低位为1的是 bit0,OSUnMapTbl[1] = 0;1000000B最低位为1的是bit7,所以OSUnMapTbl[128] = 7
n为奇数时 OSUnMapTbl[n] = 0
OSRdyGrp |= OSMapTbl[priority >> 3]; //进行二进制或运算
OSRdyTbl[priority >> 3] |= OSMapTbl[priority & 0x07]; //进行二进制或运算
priority >> 3
获取优先级的高3位
就绪任务的优先级为 priority,右移3位后找到在 OSMapTbl 中的对应值,再与 OSRdyGrp 做或运算,将对应位置1
priority & 0x07
获取优先级的低3位
if((OSRdyTbl[priority >> 3] &= ~OSMapTbl[priority & 0x07]) == 0)
OSRdyGrp &= ~OSMapTbl[priority >> 3];
把相应的二进制位清除
优先级组中不存在就绪任务时清对应的 OSRdyGrp
high3Bit = OSUnMapTbl[OSRdyGrp];
low3Bit = OSUnMapTbl[OSRdyTbl[high3Bit]];
priority = (high3Bit << 3) + low3Bit;
通过优先级判定表 OSUnMapTbl 操作
数字越小,优先级越大