uc/os-iii學習筆記-任務排程
可剝奪含義:
ucos-iii採用的是“可剝奪型”,意味著當一個事件發生,並且使得一個更高優先順序任務就緒時,ucos就會立即將CPU的控制權剝奪,轉交給更高優先順序的任務使用。當一個任務將訊號量釋放給一個更高優先順序的任務,當前任務就會掛起,而更高優先順序的任務則獲得CPU的控制權。同樣,如果是一箇中斷服務程式ISR向一個更高優先順序的任務釋出了訊息或釋放了訊號量,則被中斷的任務將會保持掛起,而新的優先順序更高的任務將會得到執行。
可剝奪型任務排程
任務排程就是中止當前正在執行的任務轉而去執行其他的任務。
UCOSIII是可剝奪型核心,因此當一個高優先順序的任務準備就緒,並且此時發生了任務排程,那麼這個高優先順序的任務就會獲得CPU的使用權!
UCOSIII中的任務排程是由任務排程器來完成的,任務排程器有2種:任務級排程器和中斷級排程器。
任務級排程器為函式OSSched()
中斷級排程器為函式
OSIntExit()
,當退出外部中斷服務函式的時候使用中斷級任務排程。
任務排程點:
1、釋放訊號量或者傳送訊息,也可通過配置相應的引數不發生任務排程。
2、使用延時函式OSTimeDly()或者OSTimeDlyHMSM()。
3、任務等待的事情還沒發生(等待訊號量,訊息佇列等)。
4、任務取消等待。
5、建立任務。
6、刪除任務。
7、刪除一個核心物件。
8、任務改變自身的優先順序或者其他任務的優先順序。
9、任務通過呼叫OSTaskSuspend()將自身掛起。
10、任務解掛某個掛起的任務。
11、退出所有的巢狀中斷。
12、通過OSSchedUnlock()給排程器解鎖。
13、任務呼叫OSSchedRoundRobinYield()放棄其執行時間片。
14、使用者呼叫OSSched()。
有時候我們並不希望發生任務排程,因為始終有一些程式碼的執行過程是不能被打斷的。此時我們就可以使用函式OSSchedLock()對排程器加鎖,當我們想要恢復任務排程的時候就可以使用函式OSSchedUnlock()給已經上鎖的任務排程器解鎖
時間片輪轉排程
UCOSIII允許一個優先順序下有多個任務,每個任務可以執行指定的時間(時間片),然後輪到下一個任務,這個過程就是時間片輪轉排程,當一個任務不想在執行的時候就可以放棄其時間片。
時間片輪轉排程器為:OS_SchedRoundRobin()
。
如圖,3個同一優先順序任務,每個任務都是4個時間片。