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

本文深入探讨了UCOS实时操作系统中任务调度的具体实现方法,包括如何通过位操作高效更新任务就绪表,并介绍了如何确定最高优先级就绪任务的过程。
写在前面:杂七杂八的看原文,直接上算法研究
    当 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 的工作就完成了。

跪了啊,减少了多少运算量啊。 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值