uC/OS-II中OSUnMapTbl[]的原理

問題描述:

ucos任務隊列中優先級獲取

問題解決:

uCOS-II是一個多任務的操作系統,每個任務都是一個應用程序,它有自己的寄存器和堆棧空間,即任務控制塊TCB(task control block),用來保存任務的狀態,具體內容可以看TCB數據結構的定義OS­­_TCB。

所有的任務控制塊組成一個單向任務鏈表OSTCBTbl[],每個任務控制塊中有指針指向相鄰的控制塊,當任務一旦建立,空任務控制塊指針OSTCBFreeList指向的任務控制塊便賦給了該任務,對堆棧和寄存器初始化,然後OSTCBFreeList的值調整爲指向下鏈表中下一個空的任務控制塊。一旦任務被刪除,任務控制塊就還給空任務鏈表。

同任務相關的還有一個紀錄任務優先級是否被佔用的表OSTCBPrioTbl[],任務空閒時,放置一個非空指針在OSTCBPrioTbl[]中來保留該優先級。

任務就緒表,紀錄當前就緒的任務,就緒表中把64個優先級的任務分成8組,優先級的1-3bit表示OSRdyTbl[]中組別OSRedyGrp,優先級的4-6bit表示每組中就緒任務的位置,當任務進入就緒態時,就緒表OSRdyTbl[]和OSRedyGrp中的相應元素的相應位也置位,任務切換時,在此表中,按優先級判定表OSUnMapTbl查找已經就緒的優先級最好的任務,並執行這個任務。

這裏寫圖片描述

   查找優先級最高的任務,使用的是優先級判定表OSUnMapTbl[],OSUnMapTbl[]表中的數值表示的是一個8bit的數據最低位爲1的位置,例如:1000 0000 最低位爲1的位置是在第7位,那麼OSUnMapTbl[128]的值就是7;1000 0010 最低位爲1的位置是在第1位,那麼OSUnMapTbl[130]的值就是1;

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 */
};

注:

以上一一列舉,通過空間換取時間  

表建立了,如何查詢最高優先級呢?因爲優先級的值越小,優先級越高,只需從OSRdyGrp中找到最低位置1的的那一組,再從該組中,查找最低位置1的位置,組合一下,就得到了最高的優先級。

    y = OSUnMapTbl[OSRdyGrp];             

    x = OSUnMapTbl[OSRdyTbl[y]];

    OSPrioHighRdy = (INT8U)((y << 3) + x);
發佈了33 篇原創文章 · 獲贊 16 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章