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