咬尾中斷
Cortex-M3 內(nèi)核發(fā)生中斷時,硬件會自動將 XPSR、PC、LR、R12、R3、R2、R1 和 R0 這 8 個寄存器壓入棧,其余的 R4~R11、LR、XPSR 寄存器的備份則需要由 C 編譯器去做。
我們知道每次中斷操作有三部曲:入棧+ISR+出棧。**Cortex-M3 內(nèi)核支持中斷嵌套。所謂中斷嵌套就是高優(yōu)先級的中斷可以打斷低優(yōu)先級的中斷轉而去執(zhí)行高優(yōu)先級的中斷服務程序,當高優(yōu)先級中斷服務程序執(zhí)行完畢再去接著執(zhí)行低優(yōu)先級的中斷服務程序。
若在高優(yōu)先級中斷服務程序執(zhí)行過程中產(chǎn)生了低優(yōu)先級中斷,那么低優(yōu)先級中斷需要等高優(yōu)先級中斷服務程序執(zhí)行完畢才能去執(zhí)行。
對于后者兩個中斷是串行執(zhí)行的,如果按照每個中斷備份、恢復寄存器的過程,那么高優(yōu)先級中斷先將上述 8 個寄存器壓入棧中,等執(zhí)行完畢再從棧中彈出這 8 個寄存器,緊接著低優(yōu)先級中斷再將這 8 個寄存器壓入棧中,等執(zhí)行完畢再從棧中彈出,這么做對這 8 個寄存器重復入棧出棧 2 次,浪費了時間,Cortex-M3 內(nèi)核采用咬尾中斷機制避免這種問題發(fā)生,來看下圖:
Cortex-M3不會再出棧這些寄存器,而是繼續(xù)使用上一個異常已經(jīng)壓棧好的結果,消除出棧和入棧操作的耗時。這樣一來我們執(zhí)行兩次中斷只需要:入棧+ISR1+ISR2+出棧。
咬尾中斷看上去好像后一個異常把前一個的尾巴咬掉了,前前后后只執(zhí)行了一次PUSH/POP操作。這兩個異常之間的“時間溝”就變窄了很多,大大提高了效率!
與常規(guī)中斷處理(ARM7)的比較:
晚到中斷
Cortex-M3的中斷處理還有另一個機制,它強調了優(yōu)先級的作用,這就是 “晚到的異常處理” 。
這里有一種情況,低優(yōu)先級中斷先發(fā)生,而在低優(yōu)先級中斷壓棧的過程中又發(fā)生了高優(yōu)先級的中斷,這時高優(yōu)先級中斷就會搶占低優(yōu)先級中斷,如果高優(yōu)先級中斷再壓棧然后執(zhí)行,再出棧,低優(yōu)先級中斷執(zhí)行再出棧,這樣對這 8 個寄存器又是重復入棧出棧 2 次,做了無用功,Cortex-M3 內(nèi)核采用晚到中斷機制避免這種問題發(fā)生,來看下圖:
比如,若在響應某低優(yōu)先級異常#1的早起,檢測到了高優(yōu)先級異常#2,則只要#2沒有太晚,就能以“晚到中斷”的方式處理,在入棧完畢后執(zhí)行ISR#2。如圖所示:
如果異常#2來得太晚,以至于已經(jīng)執(zhí)行了ISR#1的指令,則按普通的搶占處理,這會需要更多的處理器時間和額外32字節(jié)的堆??臻g。在ISR#2執(zhí)行完畢后,則以“咬尾中斷”的方式來啟動ISR#1的執(zhí)行。
-
處理器
+關注
關注
68文章
19178瀏覽量
229200 -
寄存器
+關注
關注
31文章
5325瀏覽量
120052 -
Cortex-M3
+關注
關注
9文章
269瀏覽量
59439 -
中斷優(yōu)先級
+關注
關注
0文章
22瀏覽量
9354 -
中斷嵌套
+關注
關注
0文章
7瀏覽量
6836
發(fā)布評論請先 登錄
相關推薦
評論