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