函數大致用途
OS_TASK.C是uC/OS-II有關任務管理的文件,它定義了一些函數:建立任務、刪除任務、改變任務的優先級、掛起和恢復任務,以及獲取有關任務的信息。
函數 | 用途 |
---|---|
OSTaskCreate() | 建立任務 |
OSTaskCreateExt() | 擴展建立任務 |
OSTaskStkChk() | 堆棧檢驗 |
OSTaskDel() | 刪除任務 |
OSTaskDelReq() | 請求刪除任務 |
OSTaskChangePrio() | 改變任務的優先級 |
OSTaskSuspend() | 掛起任務 |
OSTaskResume() | 恢復任務 |
OSTaskQuery() | 獲取有關任務的信息 |
狀態切換圖
OSTaskCreate() and OSTaskCreateExt()
建立任務函數,一旦任務建立就進入就緒態準備運行。
任務可以在多任務開始之前建立,也可以是動態地被一個運行著的任務建立。
如果一個任務是被另一個任務建立的,而這個任務的優先級高于建立它的那個任務,這時,這個剛剛建立的任務將立即得到CPU控制權。
OSTaskDel()
將任務轉入睡眠態。
它可以由本任務執行,也可以由另一個任務調用該函數使本任務進入睡眠態
OSTaskSuspend() and OSTaskResume()
掛起任務和恢復任務:將任務轉入掛起態、將任務從掛起態轉入就緒態。
一些延遲函數和事件函數也可以完成任務到掛起狀態的轉換。
OSTaskChangePrio()
改變任務的優先級。
它本身不改變任務狀態,但是可能會影響任務的狀態。
例:執行任務將就緒任務的優先級改的比自己高,這樣cpu的控制權就會立刻被轉到那個任務手中
OSTaskStkChk()
為了避免為任務分配過多的堆棧空間,從而減少自己的應用程序的代碼所需內存數量。這時就需要獲取任務實際所需的堆棧空間大小。
本函數的操作:順著堆棧的棧底開始計算空閑的堆棧空間大小,具體實現方法是統計存儲值為0的連續堆棧入口的數目,直到發現存儲值不為0的堆棧入口
OSTaskQuery()
該函數通過檢查對應任務的任務控制塊中的內容來得到任務的信息。
可以獲取自身或其他應用任務的信息。
OSTaskIdle()
當所有任務都不在就緒態中,操作系統將執行空閑任務的函數OSTaskIdle()。
這個函數由系統定義,不能刪除、掛起或者改變優先級。
有關中斷
如果中斷沒有被禁止,正在運行的任務是可以被中斷的。任務被中斷后,進入中斷服務態(ISR).響應中斷時,正在執行的任務處于掛起態,中斷服務子程序控制了系統的控制權。
中斷服務程序完成后,不一定返回到被中斷的任務。
因為uC/OS-II總是執行就緒態任務中優先級最高的任務。由于中斷服務程序的執行,可能使被中斷的程序不是就緒態任務中優先級最高的。
例如下面幾個情況:
1、中斷服務程序利用了時間的發生,而使得一個或讀個更高優先級任務進入就緒態
2、中斷服務程序建立或者恢復了一個新的高優先級任務
3、中斷程序掛起了被中斷的任務。
一般來說中斷服務程序不會干涉任務的調度,所以后兩種情況不會經常發生。第一種情況比較常見