因為最近想在 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使用權而先於高優先順序的任務而執行了。解決...