uCOS-II任务机制
1.任務是一個無返回的無窮循環。uc/os-ii總是運行進入就緒狀態的最高優先級的任務。
2. 任務是如何調度(切換)的?
因為uc/os-ii總是運行進入就緒狀態的最高優先級的任務。所以,確定哪個任務優先級最高,下面該哪個任務運行,這個工作就是由調度器(scheduler)來完成的。
任務級的調度是由函數OSSched()完成的,而中斷級的調度是由函數OSIntExt()完成。對于OSSched(),它內部調用的是 OS_TASK_SW()完成實際的調度(人為模仿一次中斷);OSIntExt()內部調用的是OSCtxSw()實現調度。參考:P92,P106
任務切換其實很簡單,由如下2步完成:(1)將被掛起任務的處理器寄存器推入自己的任務堆棧。(2)然后將進入就緒狀態的最高優先級的任務的寄存器值從堆棧中恢復到寄存器中。參見P92
???? (1)作為uc/os-ii的一條普通原則,調用uc/os-ii功能函數時,中斷總應當是開著的。
???? (2)任務永不返回,就算任務自我刪除,也絕對不會返回。(任務刪除并非代碼刪除,只是ucos-ii不會理會這任務。)
???? (3)OSTimeTick()函數是ucos-ii內部函數,用戶無需調用。
???? (4)ucos-ii從中斷返回之前,要判斷被中斷的任務是否還是就緒狀態任務中優先級最高的任務。
3.??? OSInit()初始化示意圖
?????? 我做了一個很好的圖示,竟然粘貼不出來,沒辦法...
4. 任務的5種狀態
睡眠態(task dormat):任務駐留于程序空間(rom或ram)中,暫時沒交給ucos-ii處理。
就緒態(task ready):任務一旦建立,這個任務就進入了就緒態。
運行態(task running):調用OSStart()可以啟動多任務。OSStart()函數只能調用一次,一旦調用,系統將運行進入就緒態并且優先級最高的任務。
等待狀態(task waiting):正在運行的任務,通過延遲函數或pend(掛起)相關函數后,將進入等待狀態。
中斷狀態(ISR running):正在運行的任務是可以被中斷的,除非該任務將中斷關閉或者ucos-ii將中斷關閉。
5. 任務控制塊(OS_TBC)
任務一旦建立,任務控制塊OS_TBC將被賦值。
OS_TBC是一個數據結構,當任務的CPU使用權被剝奪后,ucos-ii將把當前的任務狀態存放于OS-TBC數據結構中;當任務的CPU使用權得到恢復后,任務控制塊能確保任務能從被中斷點那一點絲毫不差地繼續執行。
每個任務都有自己的OS_TBC控制塊,OS_TBC的數量由OS_MAX_TASK決定,任務數量少,當然OS_TBC占用RAM的空間就少。
所有的任務控制塊OS_TBC都是放在任務控制塊列表數組OSTCBTbl[]中。在ucos-ii初始化時,所有任務控制塊OS_TBC都被鏈表連接成單向空任務鏈表。
注意:OS_TBC全部駐留于RAM中。
6.關于任務切換使用到的OS_TASK_SW()函數,其中調用軟中斷實現寄存器的保持和彈出。開始調用含軟中斷,ucos-ii強制處理器保存psw、pc的當前值,最后通過執行中斷返回指令,pc和psw的值裝回到cpu中。
總結
以上是生活随笔為你收集整理的uCOS-II任务机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国美要求员工每天浏览自家App半个小时以
- 下一篇: uCOS-II任务建立示例