1. 程式人生 > >ARM的異常處理

ARM的異常處理

經典ARM微處理器包括7種異常:

1、 復位異常

2、 未定義指令異常

3、 軟體中斷異常

4、 預取指令異常

5、 資料異常

6、 IRQ(中斷)

7、 FIQ(快速中斷)

異常,微控制器為中斷,籠統來講可以把異常類似的看作中斷,本質上兩者還是有區別的。異常/中斷是硬體和軟體進行非同步工作的一種方式。

經典ARM微處理器發生異常時,ARM微處理器會自動呼叫預先寫好的異常處理程式。為了讓ARM核能自動的呼叫異常處理程式,必須規定一個位置,存放異常處理程式入口。ARM微處理器設計者把7種異常的入口放到一起,稱為異常向量表,每種異常在異常向量表種佔4個位元組。如下圖所示:

圖:ARM異常向量表

異常向量表佔32個位元組,其中有一個預留的(0x14),ARM異常向量表地址預設在地址0,有些處理器可以設定為0xFFFF0000地址處,具體要看CPU手冊。由於每個異常入口在向量表中只有4個位元組,所以在異常向量表中每種異常都只放一條ARM跳轉指令(發生異常後,處理器自動切換到ARM狀體),跳轉到對應的異常處理程式處繼續執行。

當異常發生時,硬體自動做如下動作:

圖:ARM異常發生時硬體做哪些工作

看到這裡我們回想一個問題:

1、 為什麼ARM微處理器使用者和系統模式沒有SPSR暫存器,而其他5種異常模式卻有SPSR暫存器?

異常發生後,ARM微處理器會自動進入到ARM狀體,並且自動切換到異常對應的模式執行。這就需要修改CPSR暫存器(T位,Mode位),我們都知道,當異常處理程式執行完畢後我們需要恢復“現場”,即將相關暫存器恢復到異常發生前的值,以保證之前的程式碼依然能夠正確執行。同樣,CPSR也需要恢復到異常發生前的值,所以硬體在修改CPSR之前需要先儲存其值,ARM就為每種異常模式設計了一個SPSR暫存器,用於異常發生時儲存CPSR暫存器的值,保證異常處理完畢能恢復其值。

同理,使用者和系統模式只能通過指令主動切換到該模式,不會由硬體通過異常自動進入,也就不需要硬體備份CPSR暫存器的值,所以沒必要設計一個SPSR暫存器。

2、為什麼每種異常模式都有一個物理上獨立的R14/LR暫存器?

異常發生後,ARM微處理器會自動跳轉到異常入口(向量)處執行程式碼,當異常處理完畢,需要返回到之前發生異常的地方繼續執行程式碼,如何知道之前在哪個地址執行程式碼呢?

異常發生時,在跳轉到異常入口前,需要儲存PC暫存器的值,PC是取指的地址,也就間接的代表著執行位置,為了在硬體修改PC前儲存PC,所以設計者為每種異常模式設計了一個物理上獨立的R14/LR暫存器,用於儲存返回地址。

異常返回:

異常發生時,ARM微處理器會自動做些保護現場的工作,但是返回時完全靠軟體來處理。

ARM異常處理完畢,軟體需要做:

1、 恢復CPSR暫存器的值

2、 根據R14/LR暫存器恢復PC的值

異常向量表能放哪些指令?

圖:異常向量表中可以放哪些ARM指令

如上圖,異常向量表中通常存放一條ARM跳轉指令。放不同的指令,有不同的限制。比如使用mov指令,異常程式地址必須以8點陣圖立即數的形式給出,這樣異常處理程式地址必須固定;使用B指令只能相對跳轉32M Bytes的範圍內;使用LDR載入指令時,其偏移量只能使用立即數的形式,載入範圍是4K位元組。放那種指令需要根據自己系統需要。

異常發生後到異常處理程式返回的大致流程:

圖:ARM異常處理流程示例

異常優先順序:

圖:ARM異常優先順序

ARM中斷:

ARM有兩種中斷,FIQ快速中斷,IRQ中斷,FIQ優先順序高於IRQ。ARM微處理器有兩個中斷觸發腳,對應的腳上是低電平時,觸發相應的中斷,如果ARM核沒有關閉該中斷,則處理器響應該中斷,執行對應的中斷處理程式。

圖:ARM中斷框圖

FIQ vs IRQ:

圖:FIQ vs IRQ

ARM異常處理程式返回指令:

圖:ARM異常返回指令參考

相關推薦

ARM異常處理過程

恢復 width 禁止 span -c 遇到 處理程序 .com 存儲 ARM程序在正常執行中,遇到一些特殊情況,需要放下正在執行的工作,去解決異常,然後再返回原來的地方繼續工作,這樣的一套機制稱為ARM異常處理機制。 首先,程序正在正常執行,遇到異常後,不能直接去解決異常

ARM異常處理方式簡單介紹

1 什麼是異常 正常工作之外的流程都叫異常。 異常會打斷正在執行的工作,並且一般我們希望異常處理完成後繼續回來執行原來的工作。 中斷是異常的一種。 2 異常向量表 所有的CPU都有異常向

ARM異常處理(IRQ中斷處理)總結1

之間 roc 圖片 寫法 stack cat 舉例 log 地址 ARM A8的異常處理表如下可以看到vector table的基地址是不固定的但是所有異常的偏移地址是固定的。這張表也為了體現這個偏移量,還有要從硬件角度理解的是在CPU設計的時候這些異常就已經定義好了在發生

ARM異常處理過程

當異常發生時(中斷也是異常的一種): 1)ARM core (即CPU)拷貝當前狀態的CPSR到對應異常模式下的SPSR,這步的目的是保護當前狀態的CPSR(每種異常模式都對應一個自己的SPSR,以便將來在異常返回時,從SPSR恢復至CPSR) 2)這個時候CPU會自動設定適當的CPSR

ARM的暫存器及異常處理機制

arm的暫存器:     普通:r0-r15         r0-r12   //儲存任何資料         r13(sp)  

3.ARM異常中斷處理及程式設計

ARM異常中斷處理概述: ARM異常中斷處理包括響應中斷、處理中斷、中斷返回等操作。 所以說當ARM異常中斷產生的時候,CPU在執行完當前指令後,PC跳轉到要執行的中斷處理程式處執行,執行完後再返回開

ARM異常處理過程分析(異常向量/工作模式)

ARM的7種工作模式:         1、使用者模式(Usr):用於正常執行程式;         2、快速中斷模式(FIQ):用於高速資料傳輸;         3、外部中斷模式(IRQ):用於通常的中斷處理;         4、管理模式(svc):作業系統使用的保

ARM異常中斷處理概述

1.中斷的概念 什麼是中斷,我們從一個生活中的例子引入。你正在家中看書,突然電話鈴響了,你放下書本,去接電話,和來電話的人交談,然後放下電話,回來繼續看你的書。這就是生活中的“中斷”的現象,就是正常的工作過程被外部的事件打斷了。 在處理器中,所謂中斷,是一個過程,即CPU在正常執行程式的過程中,遇到外部/內

ARM處理器異常處理

1.1 處理器異常處理 所謂異常就是正常的使用者程式被暫時中止,處理器就進入異常模式,例如響應一個來自外設的中斷,或者當前程式非法訪問記憶體地址都會進入相應異常模式。 1.1.1  異常分類 (1)復位異常 當CPU剛上電時或按下reset重啟鍵之後進入該異常,該異常在

Arm架構異常處理流程之中斷

arch/arm64/kernel/entry.s:    el0_sync()/el0_irq() -> ret_to_user() -> work_pending() -> do_notify_resume()               // (1) 在arm64架構中,kernel執

1.12.ARM異常處理方式簡單介紹

什麼是異常? * 正常工作之外的流程都是異常。 * 異常會打斷正在執行的工作,正常我們希望異常處理完成後繼續回來執行我們原來的工作。 * 中斷也是異常的一種。 異常向量表: * 所有的CPU都有異常

ARM中斷異常處理的返回的問題

    http://blog.chinaunix.net/uid-26215986-id-3333236.html  http://blog.csdn.net/qianlong4526888/article/details/8598524 因為ARM指令是三級流水線就是說

ARM異常處理過程分析

原文地址:http://blog.chinaunix.net/uid-20937170-id-3220124.html近來翻了翻uC/OS-II官網給出來的ARM7-ARM9移植手冊(AN-104),分析了在ARM中移植的問題,想想從來沒有認真的學習過ARM的彙編,趁著這個機

ARM異常處理

經典ARM微處理器包括7種異常: 1、 復位異常 2、 未定義指令異常 3、 軟體中斷異常 4、 預取指令異常 5、 資料異常 6、 IRQ(中斷) 7、 FIQ(快速中斷) 異常,微控制器為中斷,籠統來講可以把異常類似的看作中斷,本質上兩者還是有區別的。異常

ARM平臺上Linux異常處理程式碼簡要分析

Linux version 3.10.40 ARM處理器支援多種異常模式,如reset,irq,fiq等,發生異常後處理器根據配置跳到指定的地址執行,可以配置成從0地址開始,也可以配置成從0xFFFF0000地址開始。我們從兩個角度分析Linux上的實現,第一是負責異常處

ARM-IRQ異常處理程式碼

IRQ異常處理程式碼分析 在分析IRQ處理程式碼過程首先要說明下MACRO/MEND偽指令的用法,巨集是一段獨立的程式程式碼,它是通過偽指令定義的,在程式中使用巨集指令即可呼叫巨集。當程式被彙編時,彙編程式將對每個呼叫進行展開,用巨集定義取代源程式中的巨集指令。 MACRO、

Arm架構異常處理流程之缺頁異常

【摘要】 本文將為您介紹linux核心是如何實現缺頁異常處理的。缺頁異常、中斷和系統呼叫同屬arm異常處理,筆者計劃分三篇文件分別介紹一下,其實在彙編階段三種處理流程有很多相通之處,不過為了閱讀方便,即使相同的部分也會重新在各自文件中介紹一遍。 【背景】 本部分簡單介紹下為何要寫此文? 1開發除錯工具:

ARM中斷異常處理的返回

舉個小例子,下面是一段ARM彙編程式碼: 地址 指令 0x3000 BL add 0x3004 MOV r0,#0 0x3008 MOV r1,#1 0x300C MOV r2,#2 AREA test,CODE,READONLY     

Laravel 5.1 中的異常處理器和HTTP異常處理 abort()

錯誤日誌 exce ant upload 記錄 再次 .org splay don 原文 http://laravelacademy.org/post/1867.html 錯誤和異常是處理程序開發中不可回避的議題,在本地開發中我們往往希望能捕獲程序拋出的異常並將其顯示打印

JAVA學習第十九課(java程序的異常處理 (二))

num 函數 錯誤 style col 編譯失敗 return [] java 異常處理的捕捉形式: 這是能夠對異常進行針對性處理的方式 六、try、catch的理解 詳細格式: try { //須要被檢測異常的代碼 } catch(異常類 變量)//改變量用