1. 程式人生 > >UCOS_III(原子戰艦STM32)學習筆記三

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);
    }