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異常返回指令參考
總結
- 上一篇: Simulink之变压器漏抗对整流电路的
- 下一篇: 动态选路协议