uC OS II就緒任務的管理

2021-04-18 18:16:33 字數 2698 閱讀 7070

uc/os-ii就緒任務的管理

uc/os-ii總是在已就緒的任務中選擇乙個任務來執行。為了了解系統中的任務哪些是就緒任務,uc/os-ii在系統初始化時間裡了乙個供就緒任務登記的表,整個表就叫做就緒任務表。

uc/os-ii的就緒任務表實質上是乙個型別為int8u的陣列osrdytbl[ ]。其中的每一位對應乙個任務。osrdytbl陣列的乙個元素就可以表示8個任務的就緒狀態。為了方便對就緒表的查詢,uc/os-ii又定義了乙個資料型別為int8u的變數osrdygrp,並使該變數的每乙個位都對應osrdytbl的乙個任務祖(即陣列的乙個元素)。如果某任務組中有任務就緒,則在變數osrdygrp裡把該任務組所對應的位置為1;否則置為0。

由於優先級別是乙個單位元組的數字,而且其最大值不會超過63,即二進位制形式的00111111,因此可把優先順序看成是乙個6位的二進位制數。這樣高3位(d5,d4,d3)來指明變數osrdygrp的具體資料位,並用來確定就緒表陣列元素的下標。低3位(d2,d1,d0)來指明該陣列元素的具體資料位。

例如prio=30的就緒任務,其二進位制形式為00011110,其低6位為011110,於是d5,d4,d3為011,故任務在osrdytbl[3]上,因此osrdygrp的d3位置1,d2,d1,d0為110,故osrdytbl[3]上的d5位上要置1。

就緒任務表的操作

對就緒任務表的操作有兩項:一是把應就緒的任務在就緒表中進行登記;二是在需要時把任務從就緒表中刪除。

1.

在程式中可以用類似下面的**把優先級別為prio的任務置為就緒狀態;

osrdygrp |= o**aptbl[prio >> 3];

osrdytbl[prio >> 3] |= o**aptbl[prio & 0x07];

其中o**aptbl是uc/os-ii為加快運算速度定義的乙個陣列,其各元素的值為:

int8u const o**aptbl= ;(在檔案os_core.c中定義)

2.

從就緒表中刪除任務

如果要使乙個優先級別為prio的任務脫離就緒狀態,則可使用如下**:

if ((osrdytbl[prio >> 3] &= -o**aptbl[prio & 0x07] == 0)

//將osrdytbl對應位清0後,作判斷

3.

從就緒表中獲取優先級別最高的就緒任務

由於uc/os-ii是以優先級別來對任務進行標識的,所以也就是要獲得就緒任務中優先級別最高任務的優先級別。從就緒表中獲取優先級別最高的就緒任務可用如下**:(在檔案os_core.c中定義)

y= osunmaptbl[osrdygrp];/* find highest priority's task priority number*/

x= osunmaptbl[osrdytbl[y]];

ospriohighrdy = (int8u)((y << 3) + x);

該**執行後得到的最高優先順序就緒任務的優先級別(即任務的標識),其中osunmaptbl同樣是uc/os-ii為提高查詢速度定義的乙個陣列,它共有256個元素,其定義如下

int8u const osunmaptbl = ;

由於在使用陣列osunmaptbl時是以osrdygrp為下標的因此這個陣列一共有256個元素。也就是說,無論osrdygrp是多少,在陣列osunmaptbl中總能找到對應的元素值,而且這個元素值就是最高端就緒任務優先順序別的y。因為陣列osunmaptbl各個元素的值是基於這樣乙個思想來設定的:表示任務組的變數osrdygrp是乙個8位二進位制數,從這個數的最低位向高位查詢,碰到的第乙個為1的位所對應的就緒任務足一定是最高優先級別任務所在的組,所以它的組號一定是最高優先級別就緒任務的級別(6位數)的高3位。例如:osrdygrp中第乙個為1的位為d3,那麼最高優先級別就緒任務級別的高3位一定為011(十進位制的3),於是在陣列osunmaptbl德256個元素中,凡是其下標的d3位1,且d2,d1,d0都為0的元素值均定義為3。

所以有了這樣乙個陣列,在查詢最高端就緒任務時,只要以變數osrdygrp為下標,就可直接在陣列osunmaptbl得到就緒任務的y值了;否則,就要編寫乙個迴圈程式在就緒表中進行查詢。這樣不但耗時,而且犯了實時系統的大忌——運算時間不可**。

同樣,這個陣列也用來查詢最高端就緒任務的x值。當然,這時是以osrdytbl[y]為下標來進行查詢的。

uC OS II就緒任務的管理

uc os ii就緒任務的管理 uc os ii總是在已就緒的任務中選擇乙個任務來執行。為了了解系統中的任務哪些是就緒任務,uc os ii在系統初始化時間裡了乙個供就緒任務登記的表,整個表就叫做就緒任務表。uc os ii的就緒任務表實質上是乙個型別為int8u的陣列osrdytbl 其中的每一位...

uC OS II任務就緒表

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

uCOSII任務就緒過程分析

3 使任務進入就緒態 4 使任務脫離就緒態 進入等待態 5 從就緒表中查詢當前最高優先順序任務 6 例項 利用5個例項對ucosii的任務就緒過程進行分析,給了詳細的出 步驟。注 假設priority最大值為63。int8u ostcbx 記錄任務優先順序priority 的低三位的值 int8u ...