uCOS II就緒表(Ready List)分析

2021-06-19 06:49:35 字數 2670 閱讀 1577

3.0 就緒表(ready list)

每個任務被賦予不同的優先順序等級,從0級到最低優先順序os_lowest_pr1o,包括0和os_lowest_pr1o在內(見檔案os_cfg.h)。當ucos ii初始化的時候,最低優先順序os_lowest_pr1o總是被賦給空閒任務idle task。注意,最多工數目os_max_tasks和最低優先順序數是沒有關係的。使用者應用程式可以只有10個任務,而仍然可以有32個優先順序的級別(如果使用者將最低優先順序數設為31的話)。

每個任務的就緒態標誌都放入就緒表中的,就緒表中有兩個變數osredygrp和osrdytbl。在osrdygrp中,任務按優先順序分組,8個任務為一組。osrdygrp中的每一位表示8組任務中每一組中是否有進入就緒態的任務。任務進入就緒態時,就緒表osrdytbl中的相應元素的相應位也置位。就緒表osrdytbl陣列的大小取決於os_lowest_pr1o(見檔案os_cfg.h)。當使用者的應用程式中任務數目比較少時,減少os_lowest_pr1o的值可以降低ucos ii對ram(資料空間)的需求量。

為確定下次該哪個優先順序的任務執行了,核心排程器總是將os_lowest_pr1o在就緒表中相應位元組的相應位置1。osrdygrp和osrdytbl之間的關係見圖3.3,是按以下規則給出的:

當osrdytbl[0]中的任何一位是1時,osrdygrp的第0位置1,

當osrdytbl[1]中的任何一位是1時,osrdygrp的第1位置1,

當osrdytbl[2]中的任何一位是1時,osrdygrp的第2位置1,

當osrdytbl[3]中的任何一位是1時,osrdygrp的第3位置1,

當osrdytbl[4]中的任何一位是1時,osrdygrp的第4位置1,

當osrdytbl[5]中的任何一位是1時,osrdygrp的第5位置1,

當osrdytbl[6]中的任何一位是1時,osrdygrp的第6位置1,

當osrdytbl[7]中的任何一位是1時,osrdygrp的第7位置1,

程式清單3.5中的**用於將任務放入就緒表。prio是任務的優先順序。

程式清單 l3.5 使任務進入就緒態 (這兩行**簡直是神來之筆啊!!!)**

/*  

這行**功能是找到列, 把列上的值置為1 

不妨假設prio的值為13, 即優先順序為13. prio>>3 右移3位後值為1, 可以查表t3.1找出 osmaptbl[1] 的值為 0000 0010. 再用 0000 0010 和 osrdygrp 進行異或運算 

*/osrdygrp |= osmaptbl[prio >> 3];    

/* */

osrdytbl[prio >> 3] |= osmaptbl[prio & 0x07];    

讀者可以看出,任務優先順序的低三位用於確定任務在總就緒表osrdytbl中的所在位。接下去的三位用於確定是在osrdytbl陣列的第幾個元素。osmaptbl是在rom中的(見檔案os_core.c)遮蔽字,用於限制osrdytbl陣列的元素下標在0到7之間,見表3.1 

表 t3.1 osmaptbl的值

index

bit mask (binary)

000000001

100000010

200000100

300001000

400010000

500100000

601000000

710000000

圖3.3 ucos ii就緒表

如果乙個任務被刪除了,則用程式清單3.6中的**做求反處理。

程式清單 l3.6 從就緒表中刪除乙個任務**

if ((osrdytbl[prio >> 3] &= ~osmaptbl[prio & 0x07]) == 0)    

osrdygrp &= ~osmaptbl[prio >> 3];   

以上**將就緒任務表陣列osrdytbl中相應元素的相應位清零,而對於osrdygrp,只有當被刪除任務所在任務組中全組任務乙個都沒有進入就緒態時,才將相應位清零。也就是說osrdytbl[prio>>3]所有的位都是零時,osrdygrp的相應位才清零。為了找到那個進入就緒態的優先順序最高的任務,並不需要從osrdytbl[0]開始掃瞄整個就緒任務表,只需要查另外一張表,即優先順序判定表osunmaptbl([256])(見檔案os_core.c)。osrdytbl中每個位元組的8位代表這一組的8個任務哪些進入就緒態了,低位的優先順序高於高位。利用這個位元組為下標來查osunmaptbl這張表,返回的位元組就是該組任務中就緒態任務中優先順序最高的那個任務所在的位置。這個返回值在0到7之間。確定進入就緒態的優先順序最高的任務是用以下**完成的,如程式清單l3.7所示。

程式清單 l3.7 找出進入就緒態的優先順序最高的任務**

y    = osunmaptbl[osrdygrp];    

x    = osunmaptbl[osrdytbl[y]];    

prio = (y <

例如,如果osrdygrp的值為二進位制01101000,查osunmaptbl[osrdygrp]得到的值是3,它相應於osrdygrp中的第3位bit3,這裡假設最右邊的一位是第0位bit0。類似地,如果osrdytbl[3]的值是二進位制11100100,則osunmaptbl[osrdytbc[3]]的值是2,即第2位。於是任務的優先順序prio就等於26(3*8+2)。利用這個優先順序的值。查任務控制塊優先順序表ostcbpriotbl,得到指向相應任務的任務控制塊os_tcb的工作就完成了。

uC OS II任務就緒表

ii任務就緒表 rel noopener noreferrer uc os ii任務就緒表 simplorer 先來了解一下uc os ii的任務狀態。uc os ii的任務共分為五種狀態 dormant 休眠 waiting 等待 running 執行 ready 就緒 以及isp 中斷 dorm...

ucos II 任務就緒表學習筆記

就緒表中有兩個變數 osrdygrp和 osrdytbl.這兩個變數的對應關係是 osrdytbl n 中任何一位是1時,osrdygrp 的第n 位 是1。相當於osrdygrp 是osrdytbl的索引。具體的對應關係如下圖 陣列osrdytbl 8 按位來算的話正好是64個位 64個優先順序。...

UCOSII原理與應用 就緒表

為系統處於就緒狀態的任務分配cpu是多工作業系統的核心工作。涉及兩項技術 1 判斷哪些任務處於就緒狀態。2 任務排程,也就是通過乙個演算法在就緒任務中確定應該,馬上執行的任務,作業系統用於負責這下工作的程式模組叫做排程器。從任務狀態轉化圖可以看到,系統總是從處於就緒狀態的任務來選擇乙個任務執行。所以...