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