3 使任務進入就緒態
4 使任務脫離就緒態(進入等待態)
5 從就緒表中查詢當前最高優先順序任務
6 例項
利用5個例項對ucosii的任務就緒過程進行分析,給了詳細的出**步驟。
注:假設priority最大值為63。
int8u ostcbx
:記錄任務優先順序priority 的低三位的值;
int8u ostcby
:記錄任務優先順序priority 的高三位的值;
int8u ostcbbitx
:記錄當前任務優先順序在就緒表中的第幾位;
int8u ostcbbity
:記錄當前任務優先順序在就緒組中的第幾位;
int8u osrdygrp
:就緒組,將64個優先順序分為8組,每組8個優先順序;
int8u osrdytbl[8]
:就緒表,包含8個8位元素的陣列,每位代表乙個優先順序;
int8u osmaptbl[8]
:位掩碼表,其中,osmaptbl[i]=1就緒組與就緒表的初始狀態如圖 1所示。
取出優先順序的高3位,亦即優先順序除以8得到的商,用於定位就緒表中的行
ostcbbity=osmaptbl[priority>>3]=osmaptbl[ostcby]= 1
取出優先順序的低3位,亦即優先順序除以8得到的餘數,用於定位就緒表中的列
ostcbbitx=osmaptbl[priority&0x07]= osmaptbl[ostcbx]=1<< ostcbx;
用於定位當前優先順序在就緒表中當前行中的列位置
osrdygrp |=osmaptbl[priority>>3] = osmaptbl[ostcby];
osrdytbl[priority>>3] |= osmaptbl[priority&0x07] = osmaptbl[ostcbx];
分別將就緒組與就緒表中對應的位置為1即可。
if((osrdytbl[priority>>3]&=~osmaptbl[priority&0x07])==0)
其中,(osrdytbl[priority>>3]&=~osmaptbl[priority&0x07])
,用於將指定優先順序的任務脫離就緒態。僅在當前優先順序所在就緒組中的所有優先順序都脫離了就緒態後(osrdytbl[priority>>3])
,才將就緒組對應的位設定為0(osrdygrp&=~osmaptbl[priority>>3]
)。
y=osunmaptbl[osrdygrp];
x=osunmaptbl[osrdytbl[y]];
high_priority=y<<3+x;
首先從就緒組中找到當前就緒的優先順序最高的乙個組,將其索引賦值給y。然後利用y,查詢就緒表中第y行的優先順序最高的一位,將其值賦給x。
從而,y指定了8*8的就緒表的行,x指定了8*8的就緒表的列,可以定位出當前的最高優先順序。最後利用公式:high_priority=y<<3+x
即可獲取當前就緒表在的的最高優先順序。
priority=27;
1.計算各個變數
ostcby = priority>>3=27/8=3;
ostcbbity = osmaptbl[priority>>3]=osmaptbl[ostcby]=1 <2.更新就緒組與就緒表對應位的值
osrdygrp |=osmaptbl[priority>>3]= osmaptbl[ostcby]
|= ostcbbity
|=8;
osrdytbl[3] |= osmaptbl[priority&0x07] =osmaptbl[ostcbx];
|= ostcbbitx
|=8;
3.將優先順序27設為就緒後,就緒組與就緒表的點陣圖狀態如圖 2所示
就緒組與就緒表的點陣圖狀態如圖 3所示。
y=osunmaptbl[osrdygrp]=osunmaptbl[72]=3;
x=osunmaptbl[osrdytbl[y]]=osunmaptbl[72]=3;
high_priority=y<<3+x=3*8+3=27;
計算結果為27,與先前新增的優先順序結果一致。
priority=27;
osrdytbl[priority>>3]&=~osmaptbl[priority&0x07]
osrdytbl[3]&=~osmaptbl[3]
osrdytbl[3]&=0b11110111
osrdytbl[3]=64;
因為osrdytbl[3]=64
,不等於0表示當前就緒組中仍有優先順序處於就緒態,故不對就緒組對應的位清0。(參考如下**)
if((osrdytbl[priority>>3]&=~osmaptbl[priority&0x07])==0)
使優先順序為27的任務脫離就緒態後的就緒表位圖如圖 4所示。
計算結果為30,與先前新增的優先順序結果一致。
uC OS II任務就緒表
ii任務就緒表 rel noopener noreferrer uc os ii任務就緒表 simplorer 先來了解一下uc os ii的任務狀態。uc os ii的任務共分為五種狀態 dormant 休眠 waiting 等待 running 執行 ready 就緒 以及isp 中斷 dorm...
uC OS II就緒任務的管理
uc os ii就緒任務的管理 uc os ii總是在已就緒的任務中選擇乙個任務來執行。為了了解系統中的任務哪些是就緒任務,uc os ii在系統初始化時間裡了乙個供就緒任務登記的表,整個表就叫做就緒任務表。uc os ii的就緒任務表實質上是乙個型別為int8u的陣列osrdytbl 其中的每一位...
uC OS II就緒任務的管理
uc os ii就緒任務的管理 uc os ii總是在已就緒的任務中選擇乙個任務來執行。為了了解系統中的任務哪些是就緒任務,uc os ii在系統初始化時間裡了乙個供就緒任務登記的表,整個表就叫做就緒任務表。uc os ii的就緒任務表實質上是乙個型別為int8u的陣列osrdytbl 其中的每一位...