uc/os ii 就续表(被算法打败了)

写在前面:杂七杂八的看原文,直接上算法研究
当 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 中的位置,xx x是任务在 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 的工作就完成了。

跪了啊,减少了多少运算量啊。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值