uC OS II原始碼分析(五)

2021-09-20 01:20:57 字數 2272 閱讀 7388

每個任務被賦予不同的優先順序等級,從0 級到最低優先順序os_lowest_pr1o,包括0 和

os_lowest_pr1o 在內。當μc/os-ⅱ初始化的時候,最低優先順序os_lowest_pr1o 總是被賦給空閒任務idle task 。注意,最多工數目os_max_tasks 和最低優先順序數是沒有關係的。使用者應用程式可以只有10 個任務,而仍然可以有32 個優先順序的級別(如果使用者將最低優先順序數設為31 的話)。

每個任務的就緒態標誌都放入就緒表中的,就緒表中有兩個變數osredygrp 和osrdytbl。在osrdygrp 中,任務按優先順序分組,8 個任務為一組。osrdygrp 中的每一位表示8 組任務中每一組中是否有進入就緒態的任務。任務進入就緒態時,就緒表osrdytbl 中的相應元素的相應位也置位。就緒表osrdytbl 陣列的大小取決於os_lowest_pr1o。當使用者的應用程式中任務數目比較少時,減少os_lowest_pr1o 的值可以降低μc/os-ⅱ對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,

用於將任務放入就緒表,prio 是任務的優先順序。

osrdygrp |= osmaptbl[prio >> 3]; 

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

osmaptbl 的值:

任務優先順序的低三位用於確定任務在總就緒表osrdytbl 中的所在位。接下去的三位用於確定是在osrdytbl 陣列的第幾個元素。osmaptbl 是在rom 中的遮蔽字,用於限制osrdytbl 陣列的元素下標在0 到7 之間,如果乙個任務被刪除了,則用 下面**做求反處理。

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

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

以上**將就緒任務表陣列osrdytbl 中相應元素的相應位清零,而對於osrdygrp, 只有當被刪除任務所在任務組中全組任務乙個都沒有進入就緒態時,才將相應位清零。也就是說osrdytbl[prio>>3] 所有的位都是零時,osrdygrp 的相應位才清零。為了找到那個進入就緒態的優先順序最高的任務,並不需要從osrdytbl[0] 開始掃瞄整個就緒任務表,只需要查另外一張表,即優先順序判定表osunmaptbl([256]) 。

osrdytbl 中每個位元組的8 位代表這一組的8 個任務哪些進入就緒態了,低位的優先順序高於高位。利用這個位元組為下標來查osunmaptbl 這張表,返回的位元組就是該組任務中就緒態任務中優先順序最高的那個任務所在的位置。這個返回值在0 到7 之間。確定進入就緒態的優先順序最高的任務是用以下**完成的,

y = osunmaptbl[osrdygrp]; 

x = osunmaptbl[osrdytbl[y]]; 

prio = (y << 3) + x;

例如,如果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 的工作就完成了。

int8u  const  osmaptbl   = ;

int8u  const  osunmaptbl = ; 

出處:本部落格遵從

creative commons attribution 3.0 license

uC OS II原始碼分析(五)

每個任務被賦予不同的優先順序等級,從0 級到最低優先順序os lowest pr1o,包括0 和 os lowest pr1o 在內。當 c os 初始化的時候,最低優先順序os lowest pr1o 總是被賦給空閒任務idle task 注意,最多工數目os max tasks 和最低優先順序數...

uC OS II原始碼分析(四)

核心結構 1,臨界區,os enter critical 和os exit critical 為了處理臨界區 必須關中斷,等處理完畢後,再開中斷。關中斷可以避免其他任務或中斷進入臨界區 uc os ii 定義了這兩個巨集來實現,但注意一條 呼叫 uc os ii 功能函式時,中斷應該總是開著的。1 ...

uC OS II原始碼分析(六)

c os 總是執行進入就緒態任務中優先順序最高的那乙個。確定哪個任務優先順序最高,下面該哪個任務執行了的工作是由排程器 scheduler 完成的。任務級的排程是由函式 ossched 完成的。中斷級的排程是由另乙個函式osintext 完成的,這個函式將在以後描 述。ossched 的 如下 vo...