ucosii中优先级查找原理

来源:互联网 发布:上瘾网络剧拍摄时间 编辑:程序博客网 时间:2024/06/05 05:51

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

 

OSUnMapTbl[]的原理  

2009-08-17 15:27:45|  分类:μC/OS |  标签:|字号 订阅

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查找已经就绪的优先级最好的任务,并执行这个任务。

 OSUnMapTbl[]的原理 - lanxifeng - 蓝西枫

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

 

OSUnMapTbl[] =

{

    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0

};

   

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

        y = OSUnMapTbl[OSRdyGrp];              

        x = OSUnMapTbl[OSRdyTbl[y]];

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

原创粉丝点击