uC/OS-2学习---OSUnMapTb[]理解

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                             */
};
X = OSUnMapTbl[OSRdyGrp]; Y = OSUnMapTbl[OSRdyTbl[X]];
最高优先级为X*8+Y 

注:

X = OSUnMapTbl[OSRdyGrp];

此句的试举例以得此推论(只找从低位起,首次出现就绪标志“1”的那个座位号,从0号数起....):

如:OSRdyGrp=0x00;%00000000,<-字节里没有出现“1”,默认OSUnMapTbl[1]表中第1号元素,位置号为0

如:OSRdyGrp=0x01;%00000001,<-字节里第0位出现“1”,即OSUnMapTbl[1]表中第1号元素,位置号为0

如:OSRdyGrp=0x02;%00000010,<-字节里第1位出现“1”,即OSUnMapTbl[2]表中第2号元素,位置号为1

如:OSRdyGrp=0x03;%00000011,<-字节里第0位出现“1”,即OSUnMapTbl[3]表中第3号元素,位置号为0

如:OSRdyGrp=0x04;%00000100,<-字节里第1位出现“1”,即OSUnMapTbl[4]表中第4号元素,位置号为2

...........

...........

以此推之便得到unUnMapTbl[]表,该表的最重要的作用:就是放进一个字符型数据(不大于255的数),就可以找到该数据  最低位是“1”的是哪个位!以此将就绪组放进去,查到的是最低就绪组,找到最低就绪组x后,再把改组的数据放进去,然后查到的是最低就绪组里的数据的最低位是“1”的是哪个位y........

那么:最高优先级为X*8+Y  解
posted @ 2013-05-16 11:35  江伟  阅读(310)  评论(0)    收藏  举报