μC/OS-II中最高优先级任务的判定

假设最多支持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];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tilblackout

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值