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