任務建立時,任務加入就緒表的過程:
1. μc/os任務共64個優先順序,本文中乙個優先順序只對應乙個任務,最低優先順序用二進位制表示為00111111,只需占用6位,如圖1所示。
2. 建立任務時,會設定任務優先順序prio,任務優先順序被設定在任務控制塊tcb中,並且任務控制塊被加入到任務控制塊優先順序表ostcbpriotbl中,即任務控制塊優先順序表儲存指向任務控制塊的指標,如圖2所示。
任務優先順序為19的任務,指標指向任務控制塊,可以通俗理解為乙個任務控制塊代表乙個任務。
3. 任務就緒表osrdygrp採用位圖表的方式,64個優先順序分成8組,每組對應8個優先順序,優先順序0~7為一組,8~15為一組……56~63為一組。
1) 當某一優先順序有對應任務就緒時,該優先順序標誌位置1;優先順序沒有對應任務就緒,標誌位為0。
2) 當某組優先順序有至少乙個任務就緒時,即至少乙個優先順序標誌位為1,那麼這一組的優先順序標誌位為1;若某一組優先順序都沒有對應任務就緒,則這一組的優先順序標誌位為0,就緒索引表osrdygrp是乙個8位的數值,該數值的二進位制每一位即對應優先順序組的標誌位,如圖3所示。
4. 如圖4所示
1) 就緒表當前狀態下第2個任務組存在優先順序19的就緒任務、第4個任務組存在優先順序35、38的兩個就緒任務,第7個任務組中有存在優先順序60的就緒任務,那麼此時就緒索引錶值應為10010100;
2) 反過來已知就緒表索引值為10010100,表明就緒表第2個任務組、第4個任務組、第7個任務組中有就緒任務,但是此時還無法確定每個任務組具體哪乙個優先順序或哪幾個優先順序存在就緒任務。
5. 詳細介紹x,y的意義以及使用:
1) 前文提到,優先順序prio只需要6位即可表示64個優先順序,其中高3位d5d4d3組成y值表示該任務優先順序所在組序號,低3位d2d1d0組成x值表示該任務在當前任務組的位置,如圖4所示比如優先順序19的二進位制為00010011,則y=010b=2,x=011b=3,我們就能通過查表的方式輕鬆知道優先順序19位於就緒表第2任務組中的第3位;
2) 以優先順序19的任務舉例細說,假設此時就緒表乙個任務都沒有,空閒任務idle也不存在,那麼最初就緒表索引值為00000000,優先順序19任務建立後把任務放入就緒表時,我們先看該任務優先順序的y值為2,知道把他放在就緒表第2任務組,放入之後對應的就緒表索引值應該變為00000100,x值為3,那麼第2任務組裡面的第3位要置1,第2任務組的狀態即osrdytbl[2]=00001000;
3) 假設之後又有優先順序30的任務加入就緒表,其對應的就緒表索引值00001000要和之前就緒表索引值進行或運算得到索引值00001100表示此時就緒表第2、第3任務組有就緒任務, 第3個任務組的狀態osrdytbl[3]=01000000;
4) 再加入優先順序31的任務,也是在第3個任務組,就緒表索引值經過計算沒有變化,但是第3個任務組的狀態osrdytbl[3]=11000000,表示第3任務存在優先順序31,30的就緒任務。
如圖5所以,osmaptbl的作用就是將y,x值對映為對應位置,優先順序19任務的y值為2,第2任務組,表示就緒表索引值第2位為1,對映為二進位制就是00000100即十六進製制0x04,x值對映類似。
任務排程時,任務優先順序查詢的過程:這是乙個任務加入就緒表的逆過程
任務加入就緒表過程,是根據優先順序prio數值,把就緒表索引值和就緒表每個任務組的狀態改變了
任務優先順序查詢過程,則是根據就緒表索引值和就緒表每個任務組的狀態,來恢復優先順序prio的數值
如圖6所示優先順序判定表osunmaptbl[256]和3行**,你也許此時有個疑惑這個優先順序判定表好亂好雜沒有規律,不急,當你明白任務優先順序如何查詢時你也就知道優先順序判定表是怎麼樣的規律了。
1) 我們接著之前的例子繼續,之前例子中從就緒表沒有任何任務到優先順序19的任務,優先順序30的任務和優先順序31的任務加入後,就緒表索引值osrdygrp =00001100,第2任務組狀態osrdytbl[2]=00001000,第3任務組狀態osrdytbl[3]=11000000,這些你都應該理解了!
2) 現在我們查詢優先順序最高的任務,先看就緒表索引值osrdygrp的值00001100,如果你理解他的值得含義,你應該知道我們應該找就緒表第2個任務組,而不是查詢第3個任務組,因為第2個任務組任務優先順序都比第3個任務組的任務優先順序高,更不會查詢其他的任務組,因為其他的任務組都沒有就緒任務,於是我們根據就緒表索引值osrdygrp的值00001100得到了最高優先順序的y值為2,這是你的理解,如果你用00001100=0x0c,得到的也是2,是不是很巧!
3) 知道查詢第2個任務組了,就要看第2個任務組的狀態osrdytbl[2]=00001000=0x08,你應該知道這裡當前只有第3個位置的優先順序存在就緒任務,即優先順序19,如果用0x08查表,也是3,又一次巧合!倘若osrdytbl[2]=01001011=0x4b,你應該知道我們要找的是最高的優先順序是第2任務組的第0位的16,不再是19,此時我們用0x4b查表的話,答案你應該可以猜出來了,至於優先順序判定表大小為什麼是256,原因:就緒表8個任務組,每組8個優先順序,每一位都是2個狀態,所以才有優先順序判定表大小28。
至此,查詢到最高優先順序,我們再從圖2的任務控制塊優先順序表找到這個優先順序任務指標,去執行那個任務。
任務刪除過程
任務執行完畢刪除時,其對應的就緒表優先順序位要置0,如果它所在任務組優先順序位都為0了,是不是應該也要把就緒表索引值對應的任務組標誌位也置為0?任務釋放掉相應資源,任務控制塊優先順序表的對應位置存放的指標也要清空了……
任務刪除的詳細過程再次就不敘述了。
一點體會:任務就緒表演算法和優先順序查詢演算法,把計算方式改為查表方式,犧牲記憶體換取的不僅僅是執行效率,更多是執行時間的可確定性,實時作業系統的任何操作都必須可預知的,而計算和迴圈則無法確定其執行的時間。
對uC OS II查詢最高優先順序就緒任務演算法的理解
因為最近想在 stm32 上跑作業系統,所以開始學習 uc os ii。正好這學期有嵌入式實時作業系統這門課,但上課的教材內容是廣義上的嵌入式實時作業系統,所以我在圖書館借了任哲老師的這本 嵌入式實時作業系統 uc os ii 原理及應用 這本書。最近看到任務就緒表及任務排程這部分,關於對任務就緒表...
FreeRTOS 任務優先順序說明
freertos任務優先順序與unix程序優先順序不同 freertos 任務優先 任務優先順序數值越小,任務優先順序越低。unix 任務優先 程序優先順序數值越小,程序優先順序越高。下面對 freertos 優先順序相關的幾個重要知識點進行下說明,這些知識點在以後的使用中務必要掌握牢固。freer...
FreeRTOS任務優先順序說明
下面對 freertos 優先順序相關的幾個重要知識點進行下說明,這些知識點在以後的使用中務必要掌握牢固。freertos 中任務的最高優先順序是通過 freertosconfig.h 檔案中的 configmax priorities 進行 配置的,使用者實際可以使用的優先順序範圍是 0 到 co...