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()函式只能呼叫一次,一旦呼叫,系統將執行進入就緒態並且優先順序最高的任務。
中斷狀態(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中。
ucosii任務切換
osctxsw 和osintctxsw osctxsw 是任務優先順序切換函式,它的作用是先將當前任務的cpu現場儲存到該任務的堆疊中,然後獲得最高優先順序任務的堆疊指標,並從該堆疊中恢復此任務的cpu現場,使之繼續執行,該函式就完成了一次任務切換。osintctxsw 是中斷級的任務切換函式。由於...
uc OS II 多工設計
uc os ii 多工設計 1 設計 開始任務 1 宣告 開始任務 任務塊 設定任務的優先順序 設定任務塊大小 編寫 任務函式 開始任務函式 在main函式中建立開始任務 ostaskcreate void 0,2 其他任務函式編寫 1 設定優先順序和任務塊大小 設定任務的優先順序 設定任務塊大小 ...
uC OS II任務就緒表
ii任務就緒表 rel noopener noreferrer uc os ii任務就緒表 simplorer 先來了解一下uc os ii的任務狀態。uc os ii的任務共分為五種狀態 dormant 休眠 waiting 等待 running 執行 ready 就緒 以及isp 中斷 dorm...