uCO/OS-ii OSUnMapTbl、OSRdyGrp、OSRdyTbl用法

原博客地址:http://blog.csdn.net/d521000121/article/details/53678252

變量定義

//OSUnMapTbl 表
INT8U const OSUnMapTbl[256] = {  
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */  
    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                             */  
};  

INT8U OSRdyGrp;     /* Ready list group                         */
INT8U OSRdyTbl[8];  /* Table of tasks which are ready to run    */

實例分析

他們3個用的都是INT8U的變量,也就是無符號的8bit變量。
那麼現在來一個個解釋它們代表的意思:
OSRdyGrp,它將64個優先級分爲8組,恰好就是與這個變量的8bit一一對應;

任務就緒表

任務就緒表

舉個例子,假設OSRdyGrp = 00000100B 那麼就可以說明第2組存在一個就緒任務,也就是說優先級爲16~23中有一個或多個任務已就緒。

OSRdyTbl[8],就是對應的8個分組了;
繼續剛剛的例子,在OSRdyGrp = 00000100B 的情況下,我們可以肯定OSRdyTbl[2] 中一定有一位或者多位爲1。

那麼OSRdyTbl[2]的作用就是記錄究竟哪一個優先級的任務已就緒,假設OSRdyTbl[2] = 10000001B,結合任務就緒表,那麼我們就可以知道,應該是這一組第0和7的任務就緒了。

最後就剩下 OSUnMapTbl[256],它其實就是用於查找爲1的最低位,他是一個數組,而數組記錄的數字是事先寫好的,那麼它有什麼意義呢?

我們繼續剛剛的例子,已知OSRdyGrp = 00000100B ,OSRdyTbl[2] = 10000001B ,現在有一段這樣的查表代碼

y = OSUnMapTbl[OSRdyGrp];  
x = OSUnMapTbl[OSRdyTbl[y]];  
prio = (y << 3) + x;  

y = OSUnMapTbl[OSRdyGrp]; 將 00000100B 轉換爲十進制後是4,也就是 y = OSUnMapTbl[4] , 即 y = 2(結合OSUnMapTbl表);其代表的含義就是 4 轉換爲二進制後爲1的最低位在第二位。
這就告訴了我們,第二組是有就緒任務的組中的最高優先級的組。
然後x = OSUnMapTbl[OSRdyTbl[y]]; , x = OSUnMapTbl[OSRdyTbl[3]], 即 x = OSUnMapTbl[10000001B] -> x = OSUmMapTbl[129] -> x = 0(結合OSUnMapTbl表)

這又告訴了我們,第二組中,就緒的最高優先級任務是第二組的第0個任務。

prio = y << 3 + x 就是 y * 8 + x, 就是我們想要找的所有任務中已就緒的最高優先級任務

小結

其實歸根結底這是一種典型的用空間換取時間的方法,在設置就緒任務時設置一個標記,就能以O(1)的時間查找出已就緒的最高優先級任務,這個方法在這個系統裏其他地方還有應用,以切合系統的實時性。

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