当 OSRdyTbl[0]中的任何一位是 1 时,OSRdyGrp 的第 0 位置 1,
当 OSRdyTbl[1]中的任何一位是 1 时,OSRdyGrp 的第 1 位置 1,
当 OSRdyTbl[2]中的任何一位是 1 时,OSRdyGrp 的第 2 位置 1,
当 OSRdyTbl[3]中的任何一位是 1 时,OSRdyGrp 的第 3 位置 1,
当 OSRdyTbl[4]中的任何一位是 1 时,OSRdyGrp 的第 4 位置 1,
当 OSRdyTbl[5]中的任何一位是 1 时,OSRdyGrp 的第 5 位置 1,
当 OSRdyTbl[6]中的任何一位是 1 时,OSRdyGrp 的第 6 位置 1,
当 OSRdyTbl[7]中的任何一位是 1 时,OSRdyGrp 的第 7 位置 1,
分析:
ucos限制任务只有64个,任务号也就是任务的优先级 ,64二进制为00111111;yyy是任务在OSRdyGrp中的位置,xxx是任务在OSRdyTbl[]中的位置;
OSRdyGrp |= OSMapTbl[prio >> 3];
位运算时与1或的结果是1;与0或的结果是其本身;
假设prio是25;100001101;yyy为001
OSRdyGrp = OSRdyGrp | OSMapTbl[prio >> 3];
成功的讲 OSRdyGrp 的第一位置1,其他位保存不变;
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
位运算时与0与的结果是0;与1与的结果是其本身;
成功的将 OSRdyTbl[prio >> 3]也就是OSRdyTbl[1]的第5(101)位置1,其他不变;
表 T3.1 OSMapTbl[]的值 自行查阅;
跪了啊,减少了多少运算量啊。
程序清单 L3.7 找出进入就绪态的优先级最高的任务
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
3-10
prio = (y << 3) + x;
例如, 如果 OSRdyGrp 的值为二进制 01101000, 查 OSUnMapTbl[OSRdyGrp]得到的值是 3,
它相应于 OSRdyGrp 中的第 3 位 bit3,这里假设最右边的一位是第 0 位 bit0。类似地,如果
OSRdyTbl[3]的值是二进制 11100100,则 OSUnMapTbl[OSRdyTbc[3]]的值是 2,即第 2 位。于
是任务的优先级 Prio 就等于 26(3*8+2) 。利用这个优先级的值。查任务控制块优先级表
OSTCBPrioTbl[],得到指向相应任务的任务控制块 OS_TCB 的工作就完成了。跪了啊,减少了多少运算量啊。