有些操作系統(tǒng)在“心跳”中斷(SysTick中斷)里進行線程切換,如果處理器正在執(zhí)行一個ISR,此時SysTick異常到來,且SysTick優(yōu)先級高,搶占了正在運行的用戶ISR,SysTick ISR是不能進行線程切換的,因為SysTick ISR運行完后要返回上一層用戶ISR,此時仍然處于異常模式,不能進入線程模式,強行進入線程模式會導致Fault異常。如下圖,延時到了第二個SysTick ISR才線程切換,實時性降低。在這種情況下,SysTick ISR中切換任務,這會導致任務切換延后。
極端的情況下,SysTick中斷和用戶中斷步調一致,會導致任務切換嚴重滯后。如下圖所示:
有朋友說了,既然SysTick中斷搶占了用戶中斷不能調度線程,那么在用戶ISR即將退出時進行調度就好了呀,確實比上面的情況要好一些,但這就需要在所有中斷的末尾都要檢查是否需要切換,增加用戶中斷程序復雜度。
也有朋友說了,把SysTick中斷優(yōu)先級調到最低是不是也可以呢,當然可以,調低了優(yōu)先級,避免了嵌套,就算用戶中斷期間產(chǎn)生SysTick中斷,但是SysTick中斷不能運行,用戶中斷結束后,SysTick中斷“咬尾”,這樣是沒問題的,可是有一點SysTick的優(yōu)先級就無法提高了。
鑒于上述原因,我們想到了PendSV異常,這個異常比較特殊,可以理解為一個軟中斷(軟異常),代碼中操作寄存器就可以觸發(fā)此中斷,我們把它的優(yōu)先級調整到最低,當SysTick ISR搶占了用戶中斷后,發(fā)現(xiàn)需要任務調度,就設置寄存器觸發(fā)PendSV異常,因為它優(yōu)先級最低,不能響應,等到用戶中斷執(zhí)行完立即自動響應,進行任務切換,如下圖所示。
一般情況下:
1、PendSV中斷優(yōu)先級設置為最低,用于線程調度。
2、SysTick中斷優(yōu)先級根據(jù)自己需求設置,如果想讓心跳更準確就調高一些,如果想讓用戶中斷相應更迅速就調低一些。
3、可以和PendSV一樣都設置為最低。
-
操作系統(tǒng)
+關注
關注
37文章
7114瀏覽量
125142 -
中斷
+關注
關注
5文章
904瀏覽量
42587 -
RTOS
+關注
關注
24文章
845瀏覽量
120875 -
線程
+關注
關注
0文章
507瀏覽量
20112 -
Systick
+關注
關注
0文章
63瀏覽量
13522
發(fā)布評論請先 登錄
RTOS中的線程、進程和協(xié)程詳解

RTOS如何在FX3中工作?
如何合理的進行線程切換與調度
RT-Thread的線程簡介
對RTOS進行講解
RT-Thread代碼啟動與線程切換過程的實現(xiàn)
用實現(xiàn)OSEK/VDX的RTOS進行汽車電控單元開發(fā)
RTOS應用中的調度策略

SCP線程模型特點

基于RTOS的應用進程中的典型線程

評論