Transcript 工作A

第4章
工作管理
‧工作是一個無限的迴圈
工作不必傳回值,
所以宣告成void
這些函式可以在
OS_TASK
檔案中找到
‧uC/OS-II 可以管理 64個工作
‧其中前四高優先權與四個最低優先權工作保
留供自己使用
‧最新版本中,工作優先權即為工作的識別
OS_PRIO_SELF
• 在程式碼中可代表該工作的優先權
• 但實際上為一個常數,值為 0xFF
4.01建立工作 OSTaskCreate(…)
• 建立工作需要傳遞四個參數:
task – 工作程式碼的指標
pdata – 工作開始執行時傳給工作的參數的
指標
ptos – 分配給工作的堆疊的堆疊頂指標
prio – 分配給工作的優先權
OSTaskCreate() 程式碼
判別分配給工作的優先權是否有效
建立工作 OSTaskCreateExt(…)
• OSTaskCreate()的擴充版本,新增5參數
id – 可將工作數超過64個的識別字
pbos – 工作堆疊底指標,用於堆疊檢驗
stk_size – 堆疊數目,用於堆疊檢驗
pext – 可指向使用者擴充資料的指標
opt – 指定是否允許堆疊檢驗、堆疊清除為
0、工作是否進行浮點操作等
4.02工作堆疊
• 每個工作都有自己的堆疊空間
• 堆疊宣告為 OS_STK 型態
• 由連續的記憶體空間組成
OS_STK_GROWTH 定義在 OS_CPU.H中
OS_STK_GROWTH=0代表堆疊由下(低位址)往上(高位址)遞增
OS_STK_GROWTH=1代表堆疊由上(高位址)往下(低位址)遞減
4.03 堆疊檢驗 OSTaskStkChk()
• OS_TASK_CREATE_EXT設為1
• 需檢驗堆疊的工作要以OSTaskCreateExt()
建立,並給予工作較多的記憶體空間。
• OSTaskCreateExt()中參數opt設定為
(OS_CFG.H)
OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR
• 可以把別的工作的優先權當參數,來檢驗
該工作的堆疊使用情況。
OSTaskStkChk() 統計堆疊空間的方式是由堆疊底
開始計算空閒的堆疊空間大小,即統計內容為0的連
續堆疊位址的空間,到不為0的位址為止。
最後將檢驗後的資訊放到 OS_STK_DATA的資料結
構中:
OS_STK_DATA 定義在 uCOS_II.h 僅含有 OSFree與 OSUsed 兩資料
OSTaskStkChk(….) 程式碼
4.04 刪除工作 OSTaskDel(…)
• 刪除工作並非工作的程式碼被刪除,而是
將工作處於休眠的狀態,不會被呼叫,直
到重新被喚醒。
確保不在ISR中刪除工作
4.05 請求刪除工作 OSTaskDelReq()
當工作A擁有記憶體緩衝區或其他資源,
而工作B想要刪除該工作,則這些資源由於
沒被釋放而一直被佔用。
‧兩者可以透過OSTaskDelReq()讓工作A使用
完資源後先釋放資源,再刪除自己。
讓工作B延遲一個時鐘節拍,使的工作A有足夠的時間釋
放資源並刪除自己,如果有需要的話可以將延遲長一點
OSTaskDelReq() 程式碼
被刪除者執
行的部分
(工作 A)
請求刪除者執
行的部分 (工
作B)
4.06 改變工作的優先權
OSTaskChangePrio()
• 允許使用者動態改變工作的優先權
若工作已經就緒,將該工
作從就緒表移除,修改優
先權後再插入
若工作尚未就緒,則
工作正等待其他事件
的發生,則將工作從
其等待表中移除,修
改新優先權後在插入
4.07暫時停止工作
OSTaskSuspend()
• 被暫時停止的工作只能透過呼叫
OSTaskResume() 恢復工作。
• 工作可以暫時停止自己或其他工作。
• OSTaskSuspend(暫停工作的優先權)
OSTaskSuspend() 程式碼
4.08 恢復工作 OSTaskResume()
4.09 工作的資訊 OSTaskQuery()
• 獲得的對應工作的資訊為該工作的
OS_TCB內容拷貝,意即需要宣告另依工
間來儲存拷貝內容。
OSTaskQuery() 程式碼