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。 |
|