UC/OS-II 任務的狀態
uc/os是一個搶佔式多工的實時作業系統,每個任務都有各自的狀態,並且狀態之間都有一定的轉換關係。寫下此文以作記錄及幫助自己理清關係。
在uc/os-ii中,任務的狀態有5種:睡眠態、就緒態、執行態、等待態及中斷服務態。通過下圖可以有一個大致的認知:
最左邊的是睡眠態,該狀態下的任務指的是還沒交給uc/os-ii來管理,且駐留在程式空間(ROM或RAM)。把任務交給uc/os-ii管理的話需要呼叫建立任務函式,OSTaskCreate()或OSTaskCreateExt(),後者是擴充套件版本。這些呼叫只是告訴uc/os-ii,任務的起始地址在哪,任務建立時,使用者給任務賦予的優先順序是多少,任務要使用多少棧空間等。所以總結來說,沒有被建立前或者被銷燬的任務都屬於睡眠態。
當任務建立起來之後,該任務就會進入就緒態,uc/os-ii會進行任務呼叫,讓高優先順序的任務執行,即高優先順序的任務能夠獲得CPU的使用權得到執行。OSStart()可以啟動多工,它只能在啟動時呼叫一次,該函式執行使用者初始化程式碼中已經建立的、進入就緒態的優先順序最高的任務。
任何時候只能有一個任務處於執行態,即獲得了CPU的使用權,該任務可以通過呼叫OSTaskDel()將自身返回到睡眠態,或者將另一個任務進入睡眠態。
等待態顧名思義就是處於等待,等待事件的到來、時間的到來等。當處於執行態的任務呼叫OSTimeDly()或OSTimeDlyHMSM將自身延遲一段時間,該任務就會進入到等待態,或者呼叫OSSemPend()、OSQPend()等等待事件函式發生阻塞時也會使得任務進入等待態。而此時,uc/os-ii會執行任務切換,選擇優先順序最高並且處於等待狀態的任務執行。而如果等待的事件發生了或者等待超時時,被掛起的任務就會進入就緒態。
中斷服務態是正在執行的任務被中斷了而進入的狀態,響應中斷時,正在執行的任務被掛起,中斷服務子程式控制了CPU的使用權。中斷服務子程式可能會報告一個或多個事件的發生,而使一個或多個任務進入就緒態。從中斷服務子程式返回之前,uc/os-ii要判定,被中斷的任務是否還是就緒任務態中優先順序最高的。如果中斷服務子程式使得另一個優先順序更高的任務進入了就緒態,則新進入就緒態的這個優先順序更高的任務得以執行,否則,原來被中斷了的任務將繼續執行。
任務的狀態之間的關係轉換大概如上所述,有總結描述錯的地方也希望可以指出。新手一枚,還有很長的路要走。