zoukankan      html  css  js  c++  java
  • OSUnMapTbl[]的原理

    问题描述:

        ucos任务队列中优先级获取

    问题解决:

    uCOS-II是一个多任务的操作系统,每个任务都是一个应用程序,它有自己的寄存器和堆栈空间,即任务控制块TCB(task control block),用来保存任务的状态,具体内容可以看TCB数据结构的定义OS­­_TCB。

       所有的任务控制块组成一个单向任务链表OSTCBTbl[],每个任务控制块中有指针指向相邻的控制块,当任务一旦建立,空任务控制块指针OSTCBFreeList指向的任务控制块便赋给了该任务,对堆栈和寄存器初始化,然后OSTCBFreeList的值调整为指向下链表中下一个空的任务控制块。一旦任务被删除,任务控制块就还给空任务链表。

       同任务相关的还有一个纪录任务优先级是否被占用的表OSTCBPrioTbl[],任务空闲时,放置一个非空指针在OSTCBPrioTbl[]中来保留该优先级。

    任务就绪表,纪录当前就绪的任务,就绪表中把64个优先级的任务分成8组,优先级的1-3bit表示OSRdyTbl[]中组别OSRedyGrp,优先级的4-6bit表示每组中就绪任务的位置,当任务进入就绪态时,就绪表OSRdyTbl[]和OSRedyGrp中的相应元素的相应位也置位,任务切换时,在此表中,按优先级判定表OSUnMapTbl查找已经就绪的优先级最好的任务,并执行这个任务。

    713309245

           查找优先级最高的任务,使用的是优先级判定表OSUnMapTbl[],OSUnMapTbl[]表中的数值表示的是一个8bit的数据最低位为1的位置,例如:1000 0000 最低位为1的位置是在第7位,那么OSUnMapTbl[128]的值就是7;1000 0010 最低位为1的位置是在第1位,那么OSUnMapTbl[130]的值就是1;

    OSUnMapTbl就是将0x00-0xff每个数据中最低位为1的位数一一列举出来 
    INT8U  const  OSUnMapTbl[256] = { 
        0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */ 
        //OSUnMapTbl[0]     
        //OSUnMapTbl[1]    1        bit0        
        //OSUnMapTbl[2]    2        bit1  
        //OSUnMapTbl[3]    3        bit0  
        //................ 
        4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */ 
        5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */ 
        4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */ 
        6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */ 
        4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */ 
        5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */ 
        4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */ 
        7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */ 
        4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */ 
        5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */ 
        4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */ 
        6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */ 
        4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */ 
        5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */ 
        4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */ 
    };

    注:

        以上一一列举,通过空间换取时间  

       表建立了,如何查询最高优先级呢?因为优先级的值越小,优先级越高,只需从OSRdyGrp中找到最低位置1的的那一组,再从该组中,查找最低位置1的位置,组合一下,就得到了最高的优先级。

            y = OSUnMapTbl[OSRdyGrp];             

            x = OSUnMapTbl[OSRdyTbl[y]];

            OSPrioHighRdy = (INT8U)((y << 3) + x);

    参考文章:

    http://lanxifeng.blog.163.com/blog/static/104659688200971732745966/

  • 相关阅读:
    HDU 5492 Find a path
    codeforce gym 100548H The Problem to Make You Happy
    Topcoder SRM 144 Lottery
    codeforce 165E Compatible Numbers
    codeforce gym 100307H Hack Protection
    区间DP总结
    UESTC 1321 柱爷的恋爱 (区间DP)
    HDU 4283 You Are the One (区间DP)
    HDU 2476 String painter (区间DP)
    UESTC 426 Food Delivery (区间DP)
  • 原文地址:https://www.cnblogs.com/luosongchao/p/3295545.html
Copyright © 2011-2022 走看看