ARM中斷異常處理的返回位址

2023-01-16 20:57:05 字數 1585 閱讀 3797

舉個小例子,下面是一段arm彙編**:

area test,code,readonly

entry

start

mov r0,#1

mov r1,#1

bl add

mov r0,#0

mov r1,#1

add add r0,r0,r1

mov r0,r0,r1

end當0x3000處的bl指令執行時,會把pc(=0x3008)儲存到lr暫存器裡面,也就是lr=0x3008。接下來處理器會立即對lr進行乙個自動的更新動作:lr=lr-0x4,這樣,lr裡面的位址為0x3008 – 0x4 = 03004,它是指令」mov r0,#0」的位址,所以當從子程式add返回時,lr裡面正好是正確的返回位址。

既是下一條要執行的指令的位址。

(2)中斷異常處理函式呼叫

異常就是正在執行的指令,由於各種軟體或硬體故障被打斷,比如,在讀資料或指令時,訪問儲存器失敗、產生了乙個外部硬體中斷等。當這些情況發生時,在arm系統裡,由異常和中斷處理程式做出相應的處理,當處理完成後,要返回到被中止的指令,使被中止的指令能夠繼續正常執行下去。因此,確定異常和中斷處理程式的返回位址是乙個非常重要的問題。

1、中斷處理

當外部中斷irq和fiq(fast interrpt request,快速中斷請求)發生時,arm核完成一部分工作。當然,這些工作是任何異常發生時都必須要做的,所以arm處理器就會自動帶我們完成。其它重要的工作,必須由程式設計師來完成。

arm處理器處理的事包括從使用者模式切換到irq模式、狀態暫存器值的變化及跳轉。比如說,處理器自動跳轉到從0x0位址開始的異常中斷向量表的0x18處,在向量表的0x18處,最簡單的指令為」b handlerirq」。

那程式設計師所要關心的就是實現具體的異常處理程式(handlerirq)。當用arm組合語言實現handlerirq函式的時候,如何確定handlerirq函式正確地返回位址,使被中止的指令能夠繼續正常執行下去。

比較常用的中斷處理程式結構如下:

handlerirq ;中斷響應,從向量表直接跳來

sub r14,r14,#4 ;計算返回位址

stmfd r13, ;保護現場,一般只需要保護

bl irqhandler ;跳到具體的異常處理函式

ldmfd r13,^ ;恢復現場

由程式可以看出,通過」sub r14,r14,#4」計算中斷函式的返回位址。那有人一定會問,為什麼計算返回位址的時候要減去4呢?

我們看上個表,比如在執行位址為0x3004的move指令時,突然來了乙個irq中斷,這個中斷打斷了move指令的執行,這個時候就要去跳轉到異常處理函式,之後還要返回0x3004位址重新執行move指令。當中斷發生時,lr裡面儲存了使用者模式下pc的值,那麼當執行位址為0x3004的move指令時,pc的值應該是0x300c,前面介紹過,當發生跳轉時,處理器會對lr進行乙個自動的更新動作:lr=lr-0x4,這樣lr裡面的位址是0x300c-0x04=0x3008。

但是0x3008並不是我們要的位址,因為中斷發生在位址為0x3004的move指令執行的時候,所以中斷處理完後應該返回這個位址。這就是在計算返回位址的時候lr減去4的原因。對於fiq中斷和預取指中止異常,計算返回位址方法和irq相同。

武漢華嵌ARM異常處理小結

handlerirq 中斷響應,從向量表直接跳來sub r14,r14,4 計算返回位址stmfd r13,保護現場,一般只需要保護bl irqhandler 跳到具體的異常處理函式ldmfd r13,恢復現場 有程式可以看出,通過 sub r14,r14,4 計算中斷函式的返回位址。那有人一定會問...

1機開式水中斷的異常總結

一 汽機側處理經過 2月21日晚班一控二班按照規定輪換裝置,18 30值班長馮志強到就地輪換 1機開式水幫浦,啟動 12開式水幫浦後出口門處突然大量噴水,人員不能靠近。馮志強立即匯報並冒水強行關閉 12開式幫浦進 出口門。後經就地確認為 12開式水幫浦出口門靠母管側法蘭漏水不能隔離,值長下令 1機退...

繼電保護異常故障的處理方法

摘要 伴隨電力系統不斷發展完善,針對繼電保護,電力能源提出更高要求。不過,當電力系統處於執行狀態時,繼電保護產生一系列異常故障幾乎是不能避免的。本文以繼電保護故障處理基本原則作為基礎,對當前普遍應用於繼電保護方面故障的一系列處理方法做出介紹,然後舉例分析特殊的故障處理法。更多還原 關鍵詞 繼電保護分...