UCOSII原理與應用 就緒表

2021-10-23 17:38:38 字數 2059 閱讀 1232

為系統處於就緒狀態的任務分配cpu是多工作業系統的核心工作。涉及兩項技術:

1、判斷哪些任務處於就緒狀態。

2、任務排程,也就是通過乙個演算法在就緒任務中確定應該,馬上執行的任務,作業系統用於負責這下工作的程式模組叫做排程器。

從任務狀態轉化圖可以看到,系統總是從處於就緒狀態的任務來選擇乙個任務執行。所以需要乙個就緒任務登記表,來登記系統中私有處於就緒狀態的任務。

就緒表結構

在ucosii中,就緒表就是乙個位圖,系統中的每個任務都在位圖中佔據乙個二進位制位,該位置的狀態(0或1)就表示任務是否處於就緒狀態。

下圖表示最多記錄32個任務的就緒狀態的任務就緒表。實際上是乙個型別為int8u的陣列osrdytbl,只不過每乙個二進位制對應乙個任務。任務的優先級別(任務的標識)的高低為順序,為每個任務安排乙個二進位制位。1表示處於就緒狀態,0表示位處於非就緒狀態。

從上圖可以看出,osrdytbl的乙個元素可以有8個任務,本例中的4個元素可以表示32個元素。

也就是說可以把8個任務看出乙個任務組。即定義int8u的變數osrdygrp,並是該變數的每一位對應osrdytbl的乙個任務組(也就是陣列乙個元素)。如果osrdygrp = 11100101,表示osrdytbl[0]、osrdytbl[2]、osrdytbl[5]、osrdytbl[6]、osrdytbl[7]任務組中有任務就緒。變數osrdygrp的格式如圖

這樣確定了就緒表的格式,那我們如何通過任務的優先級別來確定其在就緒表中的位置呢?

由於優先級別是乙個單位元組數字,而且最大值不會超過63,所以可以把優先順序看出乙個6位的二進位制數。這樣我們通過高三位(d5d4d3)來確定osrdygrp的具體資料來確定就緒表元素的下標,通過低三位(d2d1d0)來確定中該元素下的具體資料位。

例:已知乙個已經就緒的任務的優先順序prio = 30,判斷哪一位置1。

30 = 00011110。低6位 011 110。所以osrdytbl[3]的d6位置1,同時osrdygrp的d3位置1。

就緒表的操作:

登記:把優先順序prio的任務置為就緒狀態,把就緒表的對應位置為1:

osrdygrp |= osmaptbl[prio >> 3];

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

不理解的話,可以根據上述例子代進去算一下。

osmaptbl是為了加快運算速度定義的。

osmaptbl[0] = 0000 0001b

osmaptbl[1] = 0000 0010b

osmaptbl[2] = 0000 0100b

osmaptbl[3] = 0000 1000b

osmaptbl[4] = 0001 0000b

osmaptbl[5] = 0010 0000b

osmaptbl[6] = 0100 0000b

osmaptbl[7] = 1000 0000b

登出:把優先順序prio的任務置為非就緒狀態,把就緒表的對應位置為0:

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

(osrdygrp&= -osmaptbl[prio >> 3];

最高優先順序就緒任務的查詢

前面談到的,系統排程器總是把cpu控制器交給優先順序最高的就緒任務,因此排程器必須從任務就緒表中查出最高優先順序任務的能力。ucosii排程器獲取優先順序最高的就緒任務**如下

y = osunmaptal[osrdygrp]; //獲得優先順序別的d5、d4、d3位

x = osunmaptal[osrdytbl[y]]; //獲得優先順序別的d2、d1、d0位

prio = (y << 3) + x;

改**執行後的得到的最高優先級別(即任務標識),osunmaptbl同樣是為了提高查詢速度定義的陣列。

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就緒表(Ready List)分析

3.0 就緒表 ready list 每個任務被賦予不同的優先順序等級,從0級到最低優先順序os lowest pr1o,包括0和os lowest pr1o在內 見檔案os cfg.h 當ucos ii初始化的時候,最低優先順序os lowest pr1o總是被賦給空閒任務idle task。注意...

ucos II 任務就緒表學習筆記

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