優先級位圖算法

算法的由來

我是在學習嵌入式操作系統這門課知道優先級位圖算法的,可能描述的囉嗦,將就着看吧!這個算法用來對操作系統的任務進行調度。在μC/OS-II中是這樣的,每一個任務都有一個優先級,但是每一個優先級只能有一個任務,那麼如何讓具有最高優先級的任務先執行。系統中每一個任務都有一個任務控制快TCB,可以將就緒的TCB放進就緒隊列,然後處理器執行的時候從就緒隊列中選擇優先級最高的執行,但是這樣的話,嵌入式系統的實時性無法保證,因爲需要遍歷就緒隊列找到最高優先級的任務,所以纔有了優先級位圖算法。

優先級位圖算法

優先級位圖算法有一個數組OSRdyTbl[8],數組中的每一值有八位,這樣就構成了一個8*8的格子,如下圖所示。
在這裏插入圖片描述
在上面的這個表格中,我們在用一個變量OSRdyGrp(八位)來對應OSRdyTb[8]的每一個元素。這個OSRdyTb中當然不是這些1~63的數字,而都只是1,0的二進制數字。如果某一個優先級有任務,那麼對應的位置標誌爲1,然後讓OSRdyGrp對應的bit也標誌爲1。
例如(如圖A):優先級35,轉成二進制00 100 011,然後將二進制分爲高三位100 = 4,低三位011 = 3,然後查看一個表如圖B,找到4對應的值與OSRdyGrp相或就能將OSRdyGrp對應的行標誌爲1,然後3對應的值與OSRdyTbl[4]的值相或,就可以確定是哪一列(如圖C)。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
當然,有一個問題,比如上面的例子OSRdyGrp初始值爲0,優先級35來了過後OSRdyGrp爲4,也就是0000 0100,我們就知道是OSRdyTbl索引爲4的值。那麼,如果是多個優先級的任務且在不同的行?那怎麼在多個任務中確認優先級做高的任務所在的行呢?於是就有了一種表記錄OSRdyGrp所有的值的二進制中第一個1的位置,這個表如圖D所示:
在這裏插入圖片描述
那這個表怎麼查呢?比如有優先級6,17,35轉化爲二進制,6:110,17:10001,35:100011,那麼經過計算過後的OSRdyGrp的值爲110111,轉化爲16進制0X37 ,找到這個數字對應的行,然後找到這個數對應的值0,說明最高優先級的在OSRdyTabl的第0行,然後以相同的方式找到所在的列就能確定最高優先級的值了。

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