OSUnMapTbl 怎么理解

阅读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”的最小下标,也就是所有就绪任务的最高优先级 。


欧了。



  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值