OSUnMapTbl 怎麼理解

閱讀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”的最小下標,也就是所有就緒任務的最高優先級 。


歐了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章