天天看點

嵌入式實時作業系統uc/os-ii 原理及應用 讀書筆記

對任務就緒表的操作了解:

将優先級别為prio的任務置為就緒狀态,可使用如下代碼

OSRdyGrp |= OSMapTbl[prio >>3];//将prio任務所在的組狀态置為1,表示該組有任務就緒。

OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07];//将就緒表中prio任務對應的位置為1,表示該優先級為prio的任務就緒。

其中OSMapTbl[]是uc/os-ii為加快運算速度定義的一個數組,它的各元素值為:

OSMapTbl[0] = 00000001B

OSMapTbl[1] = 00000010B

OSMapTbl[2] = 00000100B

OSMapTbl[3] = 00001000B

OSMapTbl[4] = 00010000B

OSMapTbl[5] = 00100000B

OSMapTbl[6] = 01000000B

OSMapTbl[7] = 10000000B

要使優先級為prio的任務脫離就緒狀态,可使用如下代碼

if ((OSRdyTbl[prio>>3] &= ~OSMapTbl[prio&0x07]) == 0)

{

       OSRdyGrp &= ~OSMapTbl[prio >>3];

}

其中OSRdyTbl[prio>>3] &=~OSMapTbl[prio&0x07]是将就緒表OSRdyTbl中優先級為prio的任務所在的元素OSRdyTbl[prio>>3]對應優先級為prio的任務的位([prio&0x07)

置為0,與上面的OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]操作功能剛好相反。

改操作執行完畢後判斷就緒表元素OSRdyTbl[prio>>3]是否為0,如果等于0,表示該元素對應的組的8個任務全部沒有就緒,于是将OSRdyGrp對應的表示該組就緒狀态的位

置為0,表示該組沒有任務處于就緒狀态,與上面的OSRdyGrp |= OSMapTbl[prio >>3]操作功能剛好相反。

繼續閱讀