uCos中优先级判定表OSUnMapTbl原理

OSOSRdyTbl[0]的bit7-bit0对应于优先级7-0,
OSOSRdyTbl[1]的bit7-bit0对应于优先级15-8,
OSOSRdyTbl[2]的bit7-bit0对应于优先级23-16,
OSOSRdyTbl[3]的bit7-bit0对应于优先级31-24,
OSOSRdyTbl[4]的bit7-bit0对应于优先级39-32,
OSOSRdyTbl[5]的bit7-bit0对应于优先级47-40,
OSOSRdyTbl[6]的bit7-bit0对应于优先级55-48,
OSOSRdyTbl[7]的bit7-bit0对应于优先级63-56
OSRdyGrp确定了优先级的次低三位(bit5-bit3),OSOSRdyTbl确定了优先级的低三位(bit2-bit0),

OSRdyGrp = 0x011;  //0b00010001
OSRdyTbl[0] = 0x0a; //0b00001010
OSRdyTbl[4] = 0x01; //0b00000001
计算出存在的几个优先级为;0*8+1=1,0*8+3=3,4*8+0=32
假设OSRdyGrp最低位为1的是X位,OSRdyTbl[X]最低为1的是Y位,
则优先级=X*8+Y
因此只要知道了上述的X,Y就可算出最高优先级
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                             */
};
 
OSUnMapTbl数组中元素OSUnMapTbl[n]表示一个任意的8位无符号数n对应的最低位为1的那个最低位数,例如二进制数00000001B最低位为1的是bit0,如是OSUnMapTbl[00000001B] = 0,
又例如1000000B最低位为1的是bit7,所以OSUnMapTbl[10000000B] = 7,及OSUnMapTbl[128]也就是上面OSUnMapTbl第9行第一列为7.


X = OSUnMapTbl[OSRdyGrp];
Y = OSUnMapTbl[OSRdyTbl[X]];
最高优先级为X*8+Y
 

1.      任务优先级表是按照由左至右,由上至下的顺序增长的,且优先级号越小优先级越高。

2.      任务优先级存储在一个字节型数组里,数组大小为8,其还有一个行表,即一个字节单元,用于确定在数组的哪行有任务。

3.      任务优先级由一个字节的低6个bit组成,其最低优先级为2^6-1 = 63(优先级范围为0~63),其中高3bit对应行表,低3bit对应数组中某字节单元。

4.      位掩码OSMapTbl[8],下标0~7对应值00000001、00000010、00000100、00001000、00010000、00100000、01000000、10000000,其作用是屏蔽其他bit值,下标0~7对应行表(高3位)和优先级表(低3位)。

5.      OSUnMapTbl[]数组用于查找最高优先级,其经过精心设计。

首先,找行表值在OSUnMapTbl[]中的对应位置的值x

然后,找优先级表第x行值在OSUnMapTbl[]中对应位置的值y

—查找方法:由于行表值为8bit,则高4bit对应OSUnMapTbl[]中行值,低4bit对应OSUnMapTbl[]中列值;对应优先级表查找方法同行表查找方法。

最后,prio = x<<3 + y。

注:OSUnMapTbl[]数组构造方法:

--由优先级表的构造,即越靠左越靠上的优先级越高可知:

1.低4bit无值,那么就高4bit的最低为1值的位确定-例:0000-0, 0001-4, 0010-5,0011-4……

2.低4bit有值,那么就低4bit的最低为1值的位确定-例:00000000-0,10010001-0,00111010-1,00001011-0……

3.由1和2有第1列值为0,4,5,4,6,4,5,4,7,4,5,4,6,4,5,4;第2列全为0,第3列全为1,第4列全为0,第5列全为2,第6列全为0,第7列全为1,第8列全为0,第9列全为3,第10列全为0,第11列全为1,第12列全为0,第13列全为2,第14列全为0,第15列全为1,第16列全为0。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值