- INT8U const OSUnMapTbl[256] = {
- 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
- };
- y = OSUnMapTal[ OSRdyGrp ]; // 取最高优先级所在的任务组
- x = OSUnMapTal[OSRdyTbl[y]] // 取该任务组中最高的优先级
- prio = (y << 3) + x; // 组合计算
很简单,就三句代码。刚开始我看到这个很诧异,为什么要浪费256个字节的空间来存放这些很奇怪的数值。用个循环不就可以确定优先级了吗?原来,在实时操作系统的任何操作都必须可预知的,而循环则无法确定其执行的时间。
我们看看OSUnMapTbl[256]数组是如何出来的。
由于处于就绪状态的任务可能有多个,也就是说OSRdyGrp和 OSRdyTbl[]中有可能不止一位是被置1的。由于优先级的数字越小,优先级就越高,所以要从这些就绪的任务中找出优先级最高的任务,只需要取OSRdyGrp和OSRdyTbl[]中被置1的最低位。
过程: 取OSRdyGrp中被置1的最低位y,得到最高优先级所在的任务组(即在OSRdyTbl[]的y元素),再取这个任务组中被置1的最低位x,得到最高优先级在OSRdyTbl[]所对于的位,再通过y与x的组合就得到了最高优先级。