對uC OS II查詢最高優先順序就緒任務演算法的理解

2021-08-09 22:44:46 字數 1326 閱讀 2062

因為最近想在 stm32 上跑作業系統,所以開始學習 uc/os-ii。正好這學期有嵌入式實時作業系統這門課,但上課的教材內容是廣義上的嵌入式實時作業系統,所以我在圖書館借了任哲老師的這本「嵌入式實時作業系統 uc/os-ii 原理及應用」這本書。

最近看到任務就緒表及任務排程這部分,關於對任務就緒表的操作主要包括登記、登出和從就緒表的就緒任務中找到優先順序最高的任務。

根據書本上的內容對任務的登記和登出的**是比較好理解的,比較難理解的是查詢優先順序最高任務的演算法。

再查詢優先順序最高的任務時,用到了 osrdygrp 這個變數,osrdytbl 這個陣列以及 osunmaptbl 這個用於查詢的陣列,前面兩個的含義書上都有講,主要是對於那個用於查詢的陣列的用法不太清楚。

用於查詢優先順序最高就緒任務的**很簡單,如下:

y = osunmaptbl[osrdygrp]

x = osunmaptbl[osrdytbl[y]]

prio = (y << 3) + x

y 是優先順序的高三位,x 是優先順序的第三位。

osunmaptbl 陣列如下:

int8u const osunmaptbl[256] =;
要理解上面三句話我覺得主要是理解這個陣列,確實通過舉例子可以驗證演算法的正確性,但是我還是想知道這個陣列是怎麼生成的,所以稍微研究了一下。

下面就說一下我的理解:

因為要找優先順序最高的任務,在 osrdygrp 裡為 1 的最低位就是優先順序最高任務所在的任務組,在 osrdytbl 的 8 個任務組裡,為 1 的最低位就是優先順序最高任務在這個任務組裡的位置。所以找優先順序最高的任務就是找他的高三位和第三位,就是找乙個 0~7 之間的數值,就是找下標。

因為這只是記錄一下自己的想法,所以說的不是那麼清楚,順便貼上自己寫的生成那個用於查詢陣列的**

#include 

#include

#define uint8 unsigned char

int main()

; map[255] = 0;

int i;

for(redgrp=1;redgrp<255;redgrp++)

else}}

for (i = 0; i<256; i++)

return

0;}

執行結果如下:

可以看到的確生成了那個陣列,理解這個**應該就理解 uc/0s-ii 是怎麼查詢優先順序最高的任務了。

uC OS II任務排程中判斷最高優先順序

uc os ii中,規定最多可以有64 個任務。每個任務的優先順序不能相同,因此,優先順序為 0 63.數字越小,優先順序越高,那麼 0就是最高優先順序,63就是最低優先順序。系統保留了優先順序最高及最低的各 4個,因此使用者不能使用這 8個優先順序作為自己的任務的優先順序。巨集 os lowest...

Ucos ii中獲取最高優先順序的原理(任務和事件)

ucos ii中獲取最高優先順序的原理 任務和事件 2009 08 02 19 12 1.任務優先順序表是按照由左至右,由上至下的順序增長的,且優先順序號越小優先順序越高。2.任務優先順序儲存在乙個位元組型陣列裡,陣列大小為8,其還有乙個行表,即乙個位元組單元,用於確定在陣列的哪行有任務。3.任務優...

UCOSii如何解決優先順序反轉

優先順序反轉時如何產生的 當出現低優先順序的任務與高優先順序的任務使用同一訊號量,而系統中還存在其他中等優先順序別的任務時,如果低優先順序的任務先獲得了訊號量,就會使高優先順序的任務處於等待狀態,而那些不使用該訊號量的中等任務卻可剝奪低優先順序的任務的cpu使用權而先於高優先順序的任務而執行了。解決...