UC/OS基礎知識之任務控制塊

UC/OS基礎知識之任務控制塊

1.任務控制塊結構
用來記錄任務的堆棧指針,任務的當前狀態,任務的優先級別等一些與任務管理有關的屬性的表就叫做任務控制塊,沒有任務控制塊的任務不能被系統承認和管理
任務控制塊是一個結構類型數據,當調用OSTaskCreate()創建任務時,該函數就會對任務控制塊中的所有成員賦值,並駐留在RAM中。任務控制塊結構的定義如下

typedef struct os_tcb {
 OS_STK *OSTCBStkPtr; //當前TCB的棧頂指針
 #if OS_TASK_CREATE_EXT_EN > 0  //允許生成OSTaskCreateExt()函數
     void *OSTCBExtPtr; //指向用戶定義的任務控制塊(擴展指針)
     OS_STK *OSTCBStkBottom; //指向任務堆棧棧底指針
     INT32U OSTCBStkSize; //設定堆棧的容量
     INT16U OSTCBOpt; //創建任務時的選擇項
     INT16U OSTCBId; //目前該域未被使用
#endif
 struct os_tcb *OSTCBNext; //指向下一個任務控制塊的指針
 struct os_tcb *OSTCBPrev; //指向上一個任務控制塊的指針
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
 //當以上各種事件允許時
  OS_EVENT *OSTCBEventPtr; //定義指向事件控制塊的指針
#endif
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
 void *OSTCBMsg; //滿足以上條件,定義傳遞給任務的消息指針
#endif
 INT16U OSTCBDly; //定義允許任務等待時的最多節拍數
 INT8U OSTCBStat; //定義任務的狀態字
 INT8U OSTCBPrio; //定義任務的優先級
 INT8U OSTCBX; //定義指向任務優先級的低3位, 即=priority&0x07
 INT8U OSTCBY; //定義指向任務優先級的高3位, 即=priority>>3
 INT8U OSTCBBitX; //定義低3位就緒表對應值( 0~ 7), 即= OSMapTbl[priority&0x07]
 INT8U OSTCBBitY; //定義高3位就緒表對應值( 0~ 7), 即= OSMapTbl[priority>>3]
 #if OS_TASK_DEL_EN > 0 //允許生成 OSTaskDel() 函數代碼函數
 BOOLEAN OSTCBDelReq; //請求刪除任務時用到的標識
 #endif
 } OS_TCB;

2.任務控制塊鏈表
任務控制塊以鏈表的形式存在,任務控制塊鏈表又分爲已經給任務控制塊分配任務的任務控制塊鏈表和未給任務控制塊分配任務的空任務控制塊鏈表。UC/OS在初始化時建立的空任務控制塊鏈表一共是OS_MAX_TASKS+OS_N_SYS_TASKS個,其中OS_MAX_TASKS在OS_CFG.H中定義指明用戶任務的最大數目,OS_N_SYS_TASKS則在UCOS_II.H中定義表明系統任務的數目(值爲2,空閒任務和統計任務),空任務控制塊鏈表示意圖如下圖

每當應用程序調用系統函數OSTaskCreate()或者OSTaskCreateExt()創建一個任務時,系統就會將空任務控制塊鏈表頭指針OSTCBFreeList指向的任務控制塊分配給該任務,再給任務控制塊中的各成員賦值後,系統就按任務控制塊鏈表的頭指針OSTCBList將其加入到任務控制塊鏈表中。下圖是在空任務控制塊的基礎上創建了兩個用戶任務並使用了兩個系統任務。

注意:空任務控制塊鏈表是單向的,任務控制塊鏈表是雙向的
OSTCBPrioTbl[]數組以任務的優先級爲順序在各個元素裏存放了指向各個任務控制塊的指針,這樣在訪問一個任務的任務塊時就不必遍歷任務控制塊鏈表了。
3.任務控制塊的初始化
初始化任務控制塊函數OSTCBInit()原型如下:

INT8U  OS_TCBInit (  
INT8U prio,   //任務的優先級別,保存在OSTCBPrio中
OS_STK *ptos,  //任務堆棧棧頂指針  保存在OSTCBStkPtr中
OS_STK *pbos,    //任務堆棧棧底指針  保存在OSTCBStkBottom中
INT16U id,   //任務的標識符,保存在OSTCBId中
INT32U stk_size, //任務堆棧的長度,保存在OSTCBStkSize中
 void *pext,   //任務控制快擴展指針,保存在OSTCBExtPtr中
 INT16U opt)//任務控制塊的選擇項,保存在 OSTCBOpt中

該函數的任務主要有
1).爲被創建任務從空任務控制塊鏈表中獲取一個任務控制塊
2).把任務的屬性填入獲取的任務控制塊中
3).把這個任務控制塊鏈入到任務控制塊鏈表中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章