ARM的异常处理
經(jīng)典ARM微處理器包括7種異常:
1、 復(fù)位異常
2、 未定義指令異常
3、 軟件中斷異常
4、 預(yù)取指令異常
5、 數(shù)據(jù)異常
6、 IRQ(中斷)
7、 FIQ(快速中斷)
異常,單片機(jī)為中斷,籠統(tǒng)來(lái)講可以把異常類似的看作中斷,本質(zhì)上兩者還是有區(qū)別的。異常/中斷是硬件和軟件進(jìn)行異步工作的一種方式。
經(jīng)典ARM微處理器發(fā)生異常時(shí),ARM微處理器會(huì)自動(dòng)調(diào)用預(yù)先寫(xiě)好的異常處理程序。為了讓ARM核能自動(dòng)的調(diào)用異常處理程序,必須規(guī)定一個(gè)位置,存放異常處理程序入口。ARM微處理器設(shè)計(jì)者把7種異常的入口放到一起,稱為異常向量表,每種異常在異常向量表種占4個(gè)字節(jié)。如下圖所示:
圖:ARM異常向量表
異常向量表占32個(gè)字節(jié),其中有一個(gè)預(yù)留的(0x14),ARM異常向量表地址默認(rèn)在地址0,有些處理器可以設(shè)置為0xFFFF0000地址處,具體要看CPU手冊(cè)。由于每個(gè)異常入口在向量表中只有4個(gè)字節(jié),所以在異常向量表中每種異常都只放一條ARM跳轉(zhuǎn)指令(發(fā)生異常后,處理器自動(dòng)切換到ARM狀體),跳轉(zhuǎn)到對(duì)應(yīng)的異常處理程序處繼續(xù)執(zhí)行。
當(dāng)異常發(fā)生時(shí),硬件自動(dòng)做如下動(dòng)作:
圖:ARM異常發(fā)生時(shí)硬件做哪些工作
看到這里我們回想一個(gè)問(wèn)題:
1、 為什么ARM微處理器用戶和系統(tǒng)模式?jīng)]有SPSR寄存器,而其他5種異常模式卻有SPSR寄存器?
異常發(fā)生后,ARM微處理器會(huì)自動(dòng)進(jìn)入到ARM狀體,并且自動(dòng)切換到異常對(duì)應(yīng)的模式運(yùn)行。這就需要修改CPSR寄存器(T位,Mode位),我們都知道,當(dāng)異常處理程序執(zhí)行完畢后我們需要恢復(fù)“現(xiàn)場(chǎng)”,即將相關(guān)寄存器恢復(fù)到異常發(fā)生前的值,以保證之前的代碼依然能夠正確執(zhí)行。同樣,CPSR也需要恢復(fù)到異常發(fā)生前的值,所以硬件在修改CPSR之前需要先保存其值,ARM就為每種異常模式設(shè)計(jì)了一個(gè)SPSR寄存器,用于異常發(fā)生時(shí)保存CPSR寄存器的值,保證異常處理完畢能恢復(fù)其值。
同理,用戶和系統(tǒng)模式只能通過(guò)指令主動(dòng)切換到該模式,不會(huì)由硬件通過(guò)異常自動(dòng)進(jìn)入,也就不需要硬件備份CPSR寄存器的值,所以沒(méi)必要設(shè)計(jì)一個(gè)SPSR寄存器。
2、為什么每種異常模式都有一個(gè)物理上獨(dú)立的R14/LR寄存器?
異常發(fā)生后,ARM微處理器會(huì)自動(dòng)跳轉(zhuǎn)到異常入口(向量)處執(zhí)行代碼,當(dāng)異常處理完畢,需要返回到之前發(fā)生異常的地方繼續(xù)執(zhí)行代碼,如何知道之前在哪個(gè)地址執(zhí)行代碼呢?
異常發(fā)生時(shí),在跳轉(zhuǎn)到異常入口前,需要保存PC寄存器的值,PC是取指的地址,也就間接的代表著執(zhí)行位置,為了在硬件修改PC前保存PC,所以設(shè)計(jì)者為每種異常模式設(shè)計(jì)了一個(gè)物理上獨(dú)立的R14/LR寄存器,用于保存返回地址。
異常返回:
異常發(fā)生時(shí),ARM微處理器會(huì)自動(dòng)做些保護(hù)現(xiàn)場(chǎng)的工作,但是返回時(shí)完全靠軟件來(lái)處理。
ARM異常處理完畢,軟件需要做:
1、 恢復(fù)CPSR寄存器的值
2、 根據(jù)R14/LR寄存器恢復(fù)PC的值
異常向量表能放哪些指令?
圖:異常向量表中可以放哪些ARM指令
如上圖,異常向量表中通常存放一條ARM跳轉(zhuǎn)指令。放不同的指令,有不同的限制。比如使用mov指令,異常程序地址必須以8位圖立即數(shù)的形式給出,這樣異常處理程序地址必須固定;使用B指令只能相對(duì)跳轉(zhuǎn)32M Bytes的范圍內(nèi);使用LDR加載指令時(shí),其偏移量只能使用立即數(shù)的形式,加載范圍是4K字節(jié)。放那種指令需要根據(jù)自己系統(tǒng)需要。
異常發(fā)生后到異常處理程序返回的大致流程:
圖:ARM異常處理流程示例
異常優(yōu)先級(jí):
圖:ARM異常優(yōu)先級(jí)
ARM中斷:
ARM有兩種中斷,FIQ快速中斷,IRQ中斷,FIQ優(yōu)先級(jí)高于IRQ。ARM微處理器有兩個(gè)中斷觸發(fā)腳,對(duì)應(yīng)的腳上是低電平時(shí),觸發(fā)相應(yīng)的中斷,如果ARM核沒(méi)有關(guān)閉該中斷,則處理器響應(yīng)該中斷,執(zhí)行對(duì)應(yīng)的中斷處理程序。
圖:ARM中斷框圖
FIQ vs IRQ:
圖:FIQ vs IRQ
ARM異常處理程序返回指令:
圖:ARM異常返回指令參考
總結(jié)
- 上一篇: Simulink之变压器漏抗对整流电路的
- 下一篇: 动态选路协议