閱讀UC/OS代碼總是遇到 奇怪的OSUnMapTbl [ ],
1. 不知道它是幹嘛的?
就是用來指示 0~ 255 這256個數值 分別對應的二進制01值中 出現bit“1”的最小下標。
例如,數字5的二進制爲 00000101, 它出現bit “1”的最小下標就是 0。
再比如數字16的二進制位00010000,它出現bit “1”的最小下標就是4。
2. 爲什麼用這個數組來指示 bit “1”的最小下標
因爲在UC/OS中各個就緒任務的就緒標誌存放在 BYTE readyTbl[ 8 ]數組中,哪個任務就緒,那個任務的就緒標誌置1.
而且任務優先級越高,對應的就緒標誌位就越低。
比如, 優先級7. .......優先級1,.優先級0 分別對應 readyTbl[0].bit7, ..........readyTbl[0].bit1, readyTbl[0].bit0.
所以當組號0,readyTbl[0] > 0時,只要通過OSUnMapTbl [ readyTbl[0] ] 就可以查詢到 優先級最高的任務所在的下標;
3. 怎麼查詢知道步驟2的組號是0呢?
readyTbl 這個表是 BYTE數組,每個數組成員包含8個bit, 每個bit都代表了一個優先級的就緒標誌;
在UC/OS中還有一個readyGrp ,它是一個BYTE;
readyGrp.bit0 對應 readyTbl[0]; readyTbl[0] 至少有一個優先級就緒,則readyTbl[0]相應位置1,readyTbl[0] 大於0,同時置位 readyGrp.bit0。
readyGrp.bit1 對應 readyTbl[2]; 如上所述。
.
.
.
readyGrp.bit7 對應 readyTbl[7]; 如上所述。
所以,當需要調度優先級最高的任務時,
先通過readyGrp 來查詢OSUnMapTbl [ readyGrp ],獲知 readyGrp 數字的哪個最小下標的bit置位,也就是 哪個readyTbl 的BYTE成員 大於 0,就緒了;
得到readyTbl 的BYTE數組下標Y後,就得知 readyTbl[ Y ] 的值, 最高優先級的任務出現在這個BYTE成員中。
最後通過OSUnMapTbl [ readyTbl[ Y ] ]來查詢 這個BYTE值中出現Bit“1”的最小下標,也就是所有就緒任務的最高優先級 。
歐了。