UCOS_III(原子戰艦STM32)學習筆記三
- 1、任務排程
-(1) UCOS_III為可剝奪型核心
當一個高優先順序的任務準備就緒,並且此時發生了任務排程,那麼這個高優先順序的任務就會獲得CPU的使用權!
UCOSIII中的任務排程是由任務排程器來完成!
任務排程器有2種:
①任務級排程器為函式OSSched()。
②中斷級排程器為函式OSIntExit(),當退出外部中斷服務函式的時候使用中斷級任務排程。
(2)任務排程點:要排程上面兩個函式的時刻。
1、釋放訊號量或者傳送訊息,也可通過配置相應的引數不發生任務排程。
2、使用延時函式OSTimeDly()或者OSTimeDlyHMSM()。
3、任務等待的事情還沒發生(等待訊號量,訊息佇列等)。
4、任務取消等待。
5、建立任務。
6、刪除任務。
7、刪除一個核心物件。
8、任務改變自身的優先順序或者其他任務的優先順序。
9、任務通過呼叫OSTaskSuspend()將自身掛起。
10、任務解掛某個掛起的任務。
11、退出所有的巢狀中斷。
12、通過OSSchedUnlock()給排程器解鎖。
13、任務呼叫OSSchedRoundRobinYield()放棄其執行時間片。
14、使用者呼叫OSSched()。
(3)排程器上鎖
有一些程式碼的執行過程是不能被打斷的。
使用函式OSSchedLock()對排程器加鎖,當我們想要恢復任務排程的時候就可以使用函式OSSchedUnlock()給已經上鎖的任務排程器解鎖。
通過進入程式碼臨界區,來實現對不能被打斷程式碼的保護:巨集OS_CFG_ISR_POST_DEFERRED_EN:
0:UCOSIII使用關中斷的方式來保護臨界段程式碼
1:採用給排程器上鎖的方式來保護臨界段程式碼。
(4)時間片輪轉排程(同一優先順序任務)
UCOSIII允許同一個優先順序下有多個任務,每個任務可以執行指定的時間(時間片),然後輪到下一個任務,這個過程就是時間片輪轉排程,當一個任務不想在執行的時候就可以放棄其時間片。
- 2UCOS_III系統初始化
- 函式OSInit()用來完成UCOSIII的初始化。
主要是一些UCOS_III將要使用變數的定義。
程式碼流程:
int main(void)
{
OS_ERR err;
……
//其他函式,一般為外設初始化函式
……
OSInit(&err);
……
//其他函式,一般為建立任務函式
……
OSStart(&err);
}