uCOS-II最多可以64個優先權。
- 每個Task必須被指定一個獨立的優先權,因此最多只能有64個Task同時存在再系統裡。
- 63和62被保留為Idle和Statistic Task。
Task States
Dormant: 程序會在RAM/ROM上,只是程式碼,還不能被稱作是Task,除非被用OSTaskCreate()系列的函數去創造他。
Ready: 一個Task沒有延遲或在等某個event發生。
Running: 一個Task被排程器排到正好取得CPU的執行時間。
Waiting: 一個Task正在等待某個特定的event發生。
ISR: 一個Task被ISR給搶走CPU時間。

Task Control Block(TCB)
一個存在在主記憶體上面的資料結構用來維護Task的狀態,特別是當他被搶先時。
每個Task都有自己對應的TCB。
- TCB是用一個雙向鏈結來實作的。 => 方便刪除
- Free的TCB會被鏈結在一個free list裡。
- Task的優先權、delay的計數、等待的event、stack的位置。
- CPU的暫存器會被存在Stack裡,而非TCB裡。
以下是uCOS-II的TCB結構程式碼
typedef struct os_tcb {OSTCBY、OSTCBX、OSTCBBitY、OSTCBBitX這四個是在一個Task的TCB建立時預先算好的值,以便之後可以快速對ReadyList作修改。
OS_STK *OSTCBStkPtr; /*指向stack位置的指標*/
#if OS_TASK_CREATE_EXT_EN > 0
void *OSTCBExtPtr; /*指向使用者定義的延伸資料結構 */
OS_STK *OSTCBStkBottom; /*指向stack底部的指標*/
INT32U OSTCBStkSize; /*Stack的大小*/
INT16U OSTCBOpt; /* OSTaskCreateExt() 參數傳進來的Task的選項 */
INT16U OSTCBId; /* Task ID (0..65535) */
#endif
struct os_tcb *OSTCBNext; /*指標,指向下一個在TCB list裡的TCB*/
struct os_tcb *OSTCBPrev; /*指標,指向前一個在TCB lsit裡的TCB*/
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
OS_EVENT *OSTCBEventPtr; /* 指向正在等待的ECB*/
#endif
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
void *OSTCBMsg; /* 從OSMboxPost() 或 OSQPost() 收到的訊息 */
#endif
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
#if OS_TASK_DEL_EN > 0
OS_FLAG_NODE *OSTCBFlagNode; /* 指向event flag node*/
#endif
OS_FLAGS OSTCBFlagsRdy; /* 讓task準備開始執行的Event flags*/
#endif
INT16U OSTCBDly; /*task要delay的tick數,或是等待enevt的time out*/
INT8U OSTCBStat; /* Task狀態*/
INT8U OSTCBPrio; /* Task優先權(0 == 最高, 63 == 最低) */
INT8U OSTCBX; /* 根據task的優先權決定的在group裡的bit位置(0..7) */
INT8U OSTCBY; /*對應到優先權在ready table裡的索引*/
INT8U OSTCBBitX; /* Bit mask用來去存取到task在ready list裡的bit位置*/
INT8U OSTCBBitY; /* Bit mask用來去存取到task在ready group裡的bit位置 */
#if OS_TASK_DEL_EN > 0
BOOLEAN OSTCBDelReq; /*暗示是否一個Task需要刪除掉自己 */
#endif
} OS_TCB;
沒有留言:
張貼留言