阿里巴巴的笔记 https://bbs.21ic.com/?531844 [收藏] [复制] [RSS]

日志

uCOS-II中就绪表到最高优先级的查表表格解读

已有 2037 次阅读2010-2-11 03:22 |系统分类:嵌入式系统| uCOS-II, 就绪表, 最高优先级, OSUnMapTbl

    刚开始接触uCOS-II的时候,对于OSUnMapTbl[]中的数据比较模糊,害得自己折腾了一段时间才弄明白,为了方便像我这样的新手学习,现将当时的笔记整理出来,以下是整理出来的学习笔记。


 


    接触过uCOS-II的都应该知道,任务调度中的就绪表由两部分组成:OSRdyGrpOSRdyTbl[]。在需要进行任务切换时,通过:


                   y = OSUnMapTbl[OSRdyGrp];-----------(1)


                   x = OSUnMapTbl[OSRdyTbl[y]];--------(2)


                   prio = (y << 3) + x;----------------(3)


    即可以查到当前就绪态的任务中的最高优先级任务。


 


在此,便有一个疑问:为什么通过查找OSUnMapTbl[]中的数据,便能间接得到当前就绪态的任务中的最高优先级呢?


首先,来看看OSRdyGrpOSRdyTbl[]


 


    接着,再看看OSUnMapTbl[]的数据内容:


 


INT8U  const  OSUnMapTbl[] = {


    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F     */


    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     */


};


 


    我们知道,OSRdyGrpOSRdyTbl[]均为INT8U的类型,每个数据均为8bit,每一个bit均可独立设置,故存在各个位均已设置的情况,从而需要考虑的最多情况为2^8=256种,如上表所示。


    对于OSRdyGrp而言,其查表方式为:OSUnMapTbl[OSRdyGrp];易知:OSRdyGrp为奇数时(bit0 = 1),对应的有效的bit maskbit 0(OSRdyGrp=0x030x07,此时优先级最高的bit maskbit 0),所以OSUnMapTbl[]表中的所有奇数下标位置对应的值全为0(OSUnMapTbl[1]=OSUnMapTbl[3]=OSUnMapTbl[5]=0)。同理,OSRdyGrp最低有效位为bit 1(OSRdyGrp=0x0200x06,此时优先级最高的bit maskbit 1),对应的有效的bit maskbit 1,故该表中的所有0b00000010 + 0b00000100*nn=012...)的位置的下标位置的值全为1(OSUnMapTbl[2]=OSUnMapTbl[6]=OSUnMapTbl[10]=1)


    对于OSRdyTbl[]而言,其查表方式为:OSUnMapTbl[OSRdyTbl[y]] 其中y =OSUnMapTbl[OSRdyGrp];该表达式的意义为:根据查得的最高优先级对应的Group,找出该Group中的就绪态的最高优先级号,其思路跟上面完全一致。


    综上,可得:


    y = 0x01<<a+(0x01<<(a+1))*n=(0x01<<a)*(1+2n)


    a表示Group中的最低有效位(最低的非0的位)的位置,同时表示在该表中的数据,范围0-7;(n=012...)y表示表中的位置,该位置对应的值为a


    即:对于OSUnMapTbl[]中的任意位置y,其值为a,对应公式为上面的表达式。


   


    由此,我们可以清楚的看出OSUnMapTbl[]表格是如何生成的,反过来也可以发现,该表是为了满足嵌入式系统实时性的特性而使用的,这种通过查表降低运算量提高实时性的思想在做项目的时候可以进行借鉴。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)