假设最多支持64个任务,先来看看判断最高优先级任务所用到的相关变量:
uint8 OSRdyGrp
:将64个任务分成了8组,该变量表示哪一组有就绪任务uint8 OSRdyTbl[8]
:即上面的8组任务,对应每一组有8个任务,为1表示该任务就绪uint8 OSUnMapTbl[256]
:μC/OS-II中优先级数字越低表示优先级越高。这里就是要获得最低位开始,第一位为1所在的位数。每次都要一位一位的判断很麻烦,干脆将结果做成一个表格,通过索引来获取
寻找最高优先级任务相关代码:
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
prio = (y << 3) + x;
如下图所示,先找出最高优先级所在的组y
,取出该组对应的8位数OSRdyTbl[y]
,最后再获得该组中最高优先级所在的位x
。最终的优先级即为(y << 3) + x
。
例1:寻找最高优先级任务:
假设OSRdyGrp = 01101000b
,此时获得y=3
,即从第0位往上数,第一位为1的位为第3位。此时去获取OSUnMapTbl[3]
的内容,假设为11100100b
,同样的获取其最低位为1的所在位x
,得到x=2
。此时得出当前最高优先级任务为y<<3+x=3<<3+2=26
。
例2:添加一个优先级为prio
的任务
y = prio >> 3;
x = prio & 0x07;
OSRdyGrp |= OSMapTbl[y];
OSRdyTbl[y] |= OSMapTbl[x];
- 其中
OSMapTbl[i]
,i∈[0,7]
的值为1<<i
。
例3:删除一个优先级为prio
的任务
y = prio >> 3;
x = prio & 0x07;
OSRdyTbl[y] &= ~(1<<x); //将OSRdyTbl中优先级为prio的对应的位清零
/* 如果去掉该任务后该组没有其它就绪任务,也要将OSRdyGrp中该组对应的位置0 */
if ((OSRdyTbl[y] &= ~OSMapTbl[x]) == 0)
OSRdyGrp &= ~OSMapTbl[y];