OSOSRdyTbl[3]的bit7-bit0對(duì)應(yīng)于優(yōu)先級(jí)31-24,
OSOSRdyTbl[4]的bit7-bit0對(duì)應(yīng)于優(yōu)先級(jí)39-32,
OSOSRdyTbl[5]的bit7-bit0對(duì)應(yīng)于優(yōu)先級(jí)47-40,
OSOSRdyTbl[6]的bit7-bit0對(duì)應(yīng)于優(yōu)先級(jí)55-48,
OSOSRdyTbl[7]的bit7-bit0對(duì)應(yīng)于優(yōu)先級(jí)63-56
OSRdyGrp確定了優(yōu)先級(jí)的次低三位(bit5-bit3),OSOSRdyTbl確定了優(yōu)先級(jí)的低三位(bit2-bit0),
OSRdyGrp = 0x011; //0b00010001
OSRdyTbl[0] = 0x0a; //0b00001010
OSRdyTbl[4] = 0x01; //0b00000001
計(jì)算出存在的幾個(gè)優(yōu)先級(jí)為;0*8+1=1,0*8+3=3,4*8+0=32
假設(shè)OSRdyGrp最低位為1的是X位,OSRdyTbl[X]最低為1的是Y位,
則優(yōu)先級(jí)=X*8+Y
因此只要知道了上述的X,Y就可算出最高優(yōu)先級(jí)
OSUnMapTbl就是將0x00-0xff每個(gè)數(shù)據(jù)中最低位為1的位數(shù)一一列舉出來(lái)
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數(shù)組中元素OSUnMapTbl[n]表示一個(gè)任意的8位無(wú)符號(hào)數(shù)n對(duì)應(yīng)的最低位為1的那個(gè)最低位數(shù),例如二進(jìn)制數(shù)00000001B最低位為1的是bit0,如是OSUnMapTbl[00000001B] = 0,
又例如1000000B最低位為1的是bit7,所以O(shè)SUnMapTbl[10000000B] = 7,及OSUnMapTbl[128]也就是上面OSUnMapTbl第9行第一列為7.
X = OSUnMapTbl[OSRdyGrp];
Y = OSUnMapTbl[OSRdyTbl[X]];
最高優(yōu)先級(jí)為X*8+Y
1. 任務(wù)優(yōu)先級(jí)表是按照由左至右,由上至下的順序增長(zhǎng)的,且優(yōu)先級(jí)號(hào)越小優(yōu)先級(jí)越高。
2. 任務(wù)優(yōu)先級(jí)存儲(chǔ)在一個(gè)字節(jié)型數(shù)組里,數(shù)組大小為8,其還有一個(gè)行表,即一個(gè)字節(jié)單元,用于確定在數(shù)組的哪行有任務(wù)。
3. 任務(wù)優(yōu)先級(jí)由一個(gè)字節(jié)的低6個(gè)bit組成,其最低優(yōu)先級(jí)為2^6-1 = 63(優(yōu)先級(jí)范圍為0~63),其中高3bit對(duì)應(yīng)行表,低3bit對(duì)應(yīng)數(shù)組中某字節(jié)單元。
4. 位掩碼OSMapTbl[8],下標(biāo)0~7對(duì)應(yīng)值00000001、00000010、00000100、00001000、00010000、00100000、01000000、10000000,其作用是屏蔽其他bit值,下標(biāo)0~7對(duì)應(yīng)行表(高3位)和優(yōu)先級(jí)表(低3位)。
5. OSUnMapTbl[]數(shù)組用于查找最高優(yōu)先級(jí),其經(jīng)過精心設(shè)計(jì)。
首先,找行表值在OSUnMapTbl[]中的對(duì)應(yīng)位置的值x
然后,找優(yōu)先級(jí)表第x行值在OSUnMapTbl[]中對(duì)應(yīng)位置的值y
—查找方法:由于行表值為8bit,則高4bit對(duì)應(yīng)OSUnMapTbl[]中行值,低4bit對(duì)應(yīng)OSUnMapTbl[]中列值;對(duì)應(yīng)優(yōu)先級(jí)表查找方法同行表查找方法。
最后,prio = x<<3 + y。
注:OSUnMapTbl[]數(shù)組構(gòu)造方法:
--由優(yōu)先級(jí)表的構(gòu)造,即越靠左越靠上的優(yōu)先級(jí)越高可知:
1.低4bit無(wú)值,那么就高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。