生活随笔
收集整理的這篇文章主要介紹了
uc/os中对任务的总体理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文:點擊打開鏈接
一. 任務的基本概念
1. 任務分三個部分
:任務控制塊,任務堆棧,任務程序代碼。
任務控制塊:關聯了任務代碼的程序控制塊,它記錄了任務的各個屬性;
任務堆棧:用來保存任務的工作環境。
任務程序代碼:就是任務的執行部分。
2. 任務的狀態
睡眠狀態:任務在沒有配備任務控制塊或被剝奪了作務控制塊時的狀態。
就緒狀態:配備了任務控制塊并在任務就緒表中進行了就緒登記。
運行狀態:處于就緒狀態的任務如果經調試器判斷獲得了CPU的使用權。
等待狀態:正在運行的任務,需要等待一段時間,會把CPU讓出來,從而進入等待狀態。
中斷服務狀態:正在運行的任務響應中斷申請就會中止運行而去執行中斷服務程序,這時的狀態叫做中斷服務狀態。
3. 任務的優先級
最多64個任務,也就是最多有64個優先級。0~63
在配置文件OS_CFG.H中定義了一個用來表示最低優先級別的常數OS_LOWEST_PRIO,所以系統可用的優先級別為0~OS_LOWEST_PRIO。
但是一般OS_LOWEST_PRIO會自動賦給空閑任務,OS_LOWEST_PRIO - 1會自動賦給統計任務。
二. 任務的堆棧
為了滿足任務切換和響就中斷時保存CPU寄存器中的內容及任務調用其他函數時的需要。
注意處理器所支持的堆棧增長的方向:
[cpp]?view plain
?copy??OSTaskCreate(Task1,?(void?*)?0,?&Task1_Stk[TASK_STK_SIZE?-?1],?TASK1_PRIO);????OSTaskCreate(Task1,?(void?*)?0,?&Task1_Stk[0],?TASK1_PRIO);??
三. 任務控制塊及其鏈表
數據結構如下:
[cpp]?view plain
?copytypedef?struct?os_tcb?{??????OS_STK????????*OSTCBStkPtr;????????????#if?OS_TASK_CREATE_EXT_EN?>?0??????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????#if?(OS_VERSION?>=?251)?&&?(OS_FLAG_EN?>?0)?&&?(OS_MAX_FLAGS?>?0)??#if?OS_TASK_DEL_EN?>?0??????OS_FLAG_NODE??*OSTCBFlagNode;????????#endif??????????OS_FLAGS???????OSTCBFlagsRdy;????????#endif????????INT16U?????????OSTCBDly;?????????????????INT8U??????????OSTCBStat;????????????????INT8U??????????OSTCBPrio;??????????????????INT8U??????????OSTCBX;???????????????????INT8U??????????OSTCBY;???????????????????INT8U??????????OSTCBBitX;????????????????INT8U??????????OSTCBBitY;??????????????#if?OS_TASK_DEL_EN?>?0??????BOOLEAN????????OSTCBDelReq;??????????#endif??}?OS_TCB;??
ucos需要兩個鏈表:
一條空任務塊鏈表,其中所有任務控制塊還未分配給任務。由OSInit()創建。
一個任務塊鏈表,其中所有任務控制塊已分配給任務。由OSTaskCreate()創建。
創建時,系統會將空任務控制塊鏈表頭指針OSTCBFreeList指向的任務控制塊分配給該任務。
圖3-6是在圖3-5所示的空任務控制塊鏈表甚而上,應用程序創建了兩個用戶任務并使用了兩個系統任務的情況。
四. 任務就緒表及任務調度
1. 任務就緒表的結構
是一個位圖,每一位代表一個任務,1表示就緒,0表示非就緒。
可以看出一個元素可以表達8個任務的就緒狀態。
還有一個變量表示哪個組個元素就緒了:
優先級也就緒表的位置關系:
2. 對任務就緒表的操作
登記:指的是當某個任務處于就緒狀態時,把就緒表中對應的位置置1。
注銷:把就緒表中對應的位置清0。
最高優先級任務的查找:從表中查找出最高優先級
3. 任務調度
調度的思想
是:近似地每時每刻讓優先級最高的就緒任務處于運行狀態。
具體做法是:在系統或用戶任務調用系統函數及執行中斷服務程序結束時來調用調度器(OS_Sched())。
調度器先在任務就緒表中查找具有最高優先級別就緒任務的代碼,然后進行任務切換。
任務切換的工作分成兩步:第一步是獲得待運行任務的TCB指針;第二步是進行斷點數據的切換。
任務切換的工作是靠OSCtxSw()來完成的。
五. 任務的創建
OSTaskCreate()
OSTaskCreateExt()
六. 任務的掛起和恢復
掛起任務:
INT8U OSTaskSuspend(INT8U prio);
恢復任務:
INT8U? OSTaskResume (INT8U prio);
任務的刪除:
INT8U? OSTaskDel (INT8U prio);
也就是把該任務置于睡眠狀態,把任務控制塊鏈表中刪除,并歸還給空任務控制鏈表。
總結
以上是生活随笔為你收集整理的uc/os中对任务的总体理解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。