优先级就绪组:OSRdyGrp
OSRdyGrp[8]:优先级就绪组,对应OSRdyTbl[8]中的元素
优先级就绪表:OSRdyTbl
OSRdyTbl[8]:优先级就绪表,数组中每个值有8位,8*8
优先级数目为64时,对应6个二进制位,[7 6 5 4 3 2 1 0]
高三位[5 4 3]:优先级在OSRdyGrp中二进制位的位序
低三位[2 1 0]:优先级在OSRdyTbl中二进制位的位序
优先级35转换成二进制是00 100 011,高三位100=4,则行为OSRdyTbl[4],低三位011=3,则列为
OSRdyTbl[4]的位序3即35,然后在相应数字标号里写1
优先级映射表: OSMapTbl
char OSMapTbl[8] ={0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
- 数组元素下标与优先级的高3位对应时,数组元素对应的二进制值中,位为1的位表示 OSRdyGrp 的对 应位也为1
- 数组元素下标与优先级的低3位对应时,数组元素对应的二进制值中,位为1的位表示 OSRdyTbl[] 的 对应位也为1
35的高三位是100=4,4对应0010000即OSRdyGrp第4位为1,低三位是011=3,3对应00001000即OSRdyTbl[]第3位为1
优先级判定表 OSUnMapTbl[256]
- 数组中元素 OSUnMapTbl[n] 表示一个任意的8位无符号数n对应的低位为1的那个位序
- [例]例如二进制数 00000001B低位为1的是 bit0,OSUnMapTbl[1] = 0;1000000B低位为1的是 bit7,所以OSUnMapTbl[128] =7
- n为奇数时 OSUnMapTbl[n] = 0
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
prio = (y <<3) + x;
任务进入就绪态
OSRdyGrp |= OSMapTbl[priority >> 3]; //获取优先级高的3位,找到在OSMapTbl中的对应值,再与OSRdyGrp做或运算,将其 对应位置1
OSRdyTbl[priority >> 3] |= OSMapTbl[priority & 0x07]; //获取优先级低的3位,进行二进制或运算
任务退出就绪态
if((OSRdyTbl[priority >> 3] &= ~OSMapTbl[priority & 0x07]) == 0) OSRdyGrp &= ~OSMapTbl[priority >> 3];
获取进入就绪态的最高优先级
high3Bit = OSUnMapTbl[OSRdyGrp];
low3Bit = OSUnMapTbl[OSRdyTbl[high3Bit]];
priority = (high3Bit << 3) + low3Bit;
【例】假设有4个任务,优先级分别为6、10、11、17,请结合优先级位图算法中的就绪任务算法,给出优先级位图算法的具体实现过程以及优先级就绪组、优先级就绪表的最终操作结果
解答如下:
就绪算法:
OSRdyGrp |= OSMapTbl[priority >> 3];
OSRdyTbl[priority >> 3] |= OSMapTbl[priority & 0x07];
6:
二进制:00 000 110
高三位:000
通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[0]=0000 0001
低三位:110
通过OSMapTbl映射后 OSMapTbl[6]=0100 0000
OSRdyTbl[prio>>3]=OSRdyTbl[0]=0100 0000
10:
二进制:00 001 010
高三位:001
通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[1]=0000 0010
低三位:010
通过OSMapTbl映射后 OSMapTbl[2]=0100 0000
OSRdyTbl[prio>>3]=OSRdyTbl[1]=0000 0010
11:
二进制:00 001 011
高三位:001
通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[1]=0000 0010
低三位:011
通过OSMapTbl映射后 OSMapTbl[3]=0000 1000
OSRdyTbl[prio>>3]=OSRdyTbl[1]=0000 0010
17:
二进制:00 010 001
高三位:010
通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[2]=0000 0100
低三位:001
通过OSMapTbl映射后 OSMapTbl[1]=0000 0010
OSRdyTbl[prio>>3]=OSRdyTbl[2]=0000 0010
OSRdyGrp= 000 00001 |0000 0010 |0000 0010 |0000 0100 =0000 0111 = 0x07
OSRdyTbl[0]=0100 0000
OSRdyTbl[1]= 0000 0100 |0000 1000 =0000 1100OSRdyTbl[2]=0000 0010
在优先级判定表OSUnMapTbl[]中查找
OSRdyGrp=0x07
Y=OSUnMapTbl[0x07]=0 ------->最高优先级在第0组
OSRdyTbl[0]=0100 0000=0x40
X = OSUnMapTbl[0x40]=6
最高优先级为:prio= y*8+x=6
本篇博客为在理解了码之泪伤最高优先级算法后写出来的,可参考原文,整个过程讲述的更清晰。