• 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 的工作就完成了。

    跪了啊,减少了多少运算量啊。 
     
  • 相关阅读:
    15.5.3 【Task实现细节】状态机的结构
    JavaWeb-EL的11个内置对象
    JavaWeb-EL入门
    JavaWeb-BeanUtils
    JavaWeb-JavaBean
    JavaWeb-JSP动作标签
    JavaWeb-include和taglib指令
    JavaWeb-pageContext对象
    JavaWeb-page指令
    JavaWeb-URL重写
  • 原文地址:https://www.cnblogs.com/notepi/p/3137082.html
Copyright © 2020-2023  润新知