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