UCOS學習筆記——任務管理

任務與任務調度器

任務的概念

從系統的角度看,任務是競爭系統資源的最小運行單元,UCOS是一個支持多任務的操作系統。在UCOS中, 任務可以使用或等待CPU、使用內存空間等系統資源,並獨立於其他任務運行,任何數量的任務可以共享同一個優先級,處於就緒態的多個相同優先級任務將會以時間片切換的方式共享處理器。
UCOS的任務可認爲是一系列獨立任務的集合。每個任務在自已的環境中運行。

任務調度器的概念

UCOS中提供的任務調度器是基於優先級的全搶佔式調度
系統理論上可以支持無數個優先級(用戶自定義
UCOS內核中採用兩種方法尋找最高優先級的任務
通用方法:利用C語言模仿前導零指令的效果實現了快速查找到最高優先級任務的方法
特殊方法:利用硬件計算前導零指令CLZ
UCOS內核中也允許創建相同優先級的任務。相同優先級的任務採用時間片輪轉方式進行調度,時間片輪轉調度僅在當前系統中無更高優先級就緒任務存在的情況下才有效

任務狀態遷移及UCOS任務狀態

任務狀態遷移

Alt

UCOS任務狀態

UCOSIII支持的是單核CPU,不支持多核CPU,這樣在某一時刻只有一個任務會獲得CPU使用權進入運行態,其他的任務就會進入其他狀態,UCOSII 中的任務有多個狀態,如下表5.2.1所示。在這裏插入圖片描述
任務狀態標誌

就緒 (OS_ TASK_ STATE_RDY)
延時 (OS_ TASK_ STATE_DLY)
等待 (OS TASK STATE_PEND)
運行 (Running)
掛起 (OS_ TASK_ STATE_SUSPENDED)
延時+掛起 (OS_TASK_ STATE_ DLY_ SUSPENDED)
等待+掛起 (OS_TASK_STATE_ PEND_ SUSPENDED)
超時等待+掛起 (OS_ TASK_ STATE PEND_TIMEOUT SUSPENDED)
刪除 (OS TASK STATE _DEL)

注意:
1:處於運行態的任務永遠處於最高優先級
2:無論任務處於何種狀態都能調用掛起函數,將任務掛起。當任務被掛起時不處於就緒列表,且對調度器不可見。

常用任務函數

任務掛起函數OS_ TaskSuspend()
掛起指定任務。被掛起的任務絕不會得到CPU的使用權,不管該任務具有什麼優先級。
任務恢復函數OSTaskResume()
任務恢復就是讓掛起的任務重新進入就緒狀態,恢復的任務會保留掛起前的狀態信息,在恢復的時候根據掛起時的狀態繼續運行。
刪除任務函數QSTaskDel()
OSTaskDel()用於刪除一個任務。當一個任務刪除另外一個任務時,形參爲要刪除任務創建時返回的任務句柄,如果是刪除自身,則形參爲NULL。
OSTimeDly()
OSTimeDly()函數常用於停止當前任務進行的運行,延時(或阻塞)一段時間後再運行
DSTimeDlyHMSM()
OSTimeDlyHMSM()函數與OSTimeDly()函數的功能類似,但OSTimeDIlyHMSM()
函數會更加直觀,延時多少個小時、分鐘、秒、毫秒

任務設計注意事項

中斷服務函數:在這個上下文環境中不能使用掛起當前任務的操作,不允許調用任何會阻塞運行的API函數接口
普通任務:任務設計時,就應該保證任務在不活躍的時候,任務可以進入阻塞態以交出CPU使用權,將緊急的處理事件的任務優先級設置得高一些。
空閒任務:用戶可以通過空閒任務鉤子方式,在空閒任務上鉤入自己的功能函數,永遠不會掛起空閒任務,不應該陷入死循環,需要留出部分時間用於統計系統的運行狀態等。
任務的執行時間:要注意任務從開始到結束的時間和任務的週期設計的合理性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章