阅读UC/OS代码总是遇到 奇怪的OSUnMapTbl [ ],
1. 不知道它是干嘛的?
就是用来指示 0~ 255 这256个数值 分别对应的二进制01值中 出现bit“1”的最小下标。
例如,数字5的二进制为 00000101, 它出现bit “1”的最小下标就是 0。
再比如数字16的二进制位00010000,它出现bit “1”的最小下标就是4。
2. 为什么用这个数组来指示 bit “1”的最小下标
因为在UC/OS中各个就绪任务的就绪标志存放在 BYTE readyTbl[ 8 ]数组中,哪个任务就绪,那个任务的就绪标志置1.
而且任务优先级越高,对应的就绪标志位就越低。
比如, 优先级7. .......优先级1,.优先级0 分别对应 readyTbl[0].bit7, ..........readyTbl[0].bit1, readyTbl[0].bit0.
所以当组号0,readyTbl[0] > 0时,只要通过OSUnMapTbl [ readyTbl[0] ] 就可以查询到 优先级最高的任务所在的下标;
3. 怎么查询知道步骤2的组号是0呢?
readyTbl 这个表是 BYTE数组,每个数组成员包含8个bit, 每个bit都代表了一个优先级的就绪标志;
在UC/OS中还有一个readyGrp ,它是一个BYTE;
readyGrp.bit0 对应 readyTbl[0]; readyTbl[0] 至少有一个优先级就绪,则readyTbl[0]相应位置1,readyTbl[0] 大于0,同时置位 readyGrp.bit0。
readyGrp.bit1 对应 readyTbl[2]; 如上所述。
.
.
.
readyGrp.bit7 对应 readyTbl[7]; 如上所述。
所以,当需要调度优先级最高的任务时,
先通过readyGrp 来查询OSUnMapTbl [ readyGrp ],获知 readyGrp 数字的哪个最小下标的bit置位,也就是 哪个readyTbl 的BYTE成员 大于 0,就绪了;
得到readyTbl 的BYTE数组下标Y后,就得知 readyTbl[ Y ] 的值, 最高优先级的任务出现在这个BYTE成员中。
最后通过OSUnMapTbl [ readyTbl[ Y ] ]来查询 这个BYTE值中出现Bit“1”的最小下标,也就是所有就绪任务的最高优先级 。
欧了。