UCOS學習(4)任務調度點,任務切換

可剝奪性任務調度

UCOSIII任務調度:任務調度是中止當前正在運行的任務轉而去執行其他的任務
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()給已經上鎖的任務調度器解鎖

時間片輪轉調度:上次博客已分析,時間片輪轉調度器函數OS_SchedRoundRobin(),當一個任務再不想運行的時候可以放棄其時間片。
在這裏插入圖片描述

任務切換

當UCOSIII需要切換到另外一個任務時,他講保存在當前任務的現場到當前任務的堆棧中,主要是CPU寄存器值,然後恢復新的現場並執行新的任務,這個過程就是任務切換。

任務切換有兩種:任務級切換,中斷級切換
任務級切換函數:OSCtxSw()
中斷級切換函數:OSIntCtxSw()

UCOSIII系統初始化:使用UCOSIII得先初始化,初始化函數爲OSInit()

//將這些優先級分配給了UCOSIII的5個系統內部任務
//優先級0:中斷服務服務管理任務 OS_IntQTask()
//優先級1:時鐘節拍任務 OS_TickTask()
//優先級2:定時任務 OS_TmrTask()
//優先級OS_CFG_PRIO_MAX-2:統計任務 OS_StatTask()
//優先級OS_CFG_PRIO_MAX-1:空閒任務 OS_IdleTask()

以上優先級爲系統初始化一些任務,不要修改其優先級

發佈了74 篇原創文章 · 獲贊 65 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章