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中的位置,xxx是任务在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 的工作就完成了。

跪了啊,减少了多少运算量啊。 
 
posted @ 2013-06-15 01:39  notepi  阅读(301)  评论(0)    收藏  举报