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() 程式碼