ARM中斷異常處理的返回

2021-09-30 09:51:22 字數 1909 閱讀 2347

arm中斷異常處理的返回

2010-07-30 17:58:13

標籤:arm

華清遠見嵌入式學院

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

位址指令

0x3000

bl add

0x3004

mov r0,#0

0x3008

mov r1,#1

0x300c

mov r2,#2

area test,code,readonly

entry

start

mov r0,#1

mov r1,#1

bl add

mov r0,#0

mov r1,#1

addadd 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呢?

位址指令

0x3000

bl add

0x3004

mov r0,#0

0x3008

mov r1,#1

0x300c

mov r2,#2

我們看上個表,比如在執行位址為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中斷異常處理的返回的問題

因為arm指令是 流水線就是說取指,譯指,執行時同時執行的 這樣說吧,現在pc指向的是正在取指的位址,那麼cpu正在譯指的指令位址是pc 4 假設在arm狀態下,乙個指令佔4個位元組 cpu正在執行的指令位址是pc 8.也就是說pc所指向的位址和現在所執行的指令位址相差8,儘管以後版本的指令流水線擴...

ARM 異常中斷處理

在arm體系中,程式執行的流程有三種 要了解arm處理異常中斷的流程原理,就要先熟悉一下arm的工作模式與暫存器。如圖,arm有七種工作模式,大多數程式是工作在使用者模式usr下的,其他六種工作模式屬於特權模式,特權模式的存在是為了處理中斷 異常,或者訪問被保護的系統資源。不同模式之間的轉換可以通過...

arm中斷保護和恢復 ARM異常中斷返回的幾種情況

重要基礎知識 r15 pc 總是指向 正在取指 的指令,而不是指向 正在執行 的指令或正在 解碼 的指令。一般來說,人們習慣性約定將 正在執行的指令作為參考點 稱之為當前第一條指令,因此 pc總是指向第三條指令。當 arm 狀態時,每條指令為 4 位元組長,所以 pc 始終指向該指令位址加 8 位元...