FIQ(Fast Interrupt Request)
FIQ異常是為了支持?jǐn)?shù)據(jù)傳輸或者通道處理而設(shè)計(jì)的。在ARM狀態(tài)下,系統(tǒng)有足夠的私有寄存器,從而可以避免對(duì)寄存器保存的需求,并減小了系統(tǒng)上下文切換的開(kāi)銷(xiāo)。
若將CPSR的F位置為1,則會(huì)禁止FIQ中斷,若將CPSR的F位清零,處理器會(huì)在指令執(zhí)行時(shí)檢查FIQ的輸入。注意只有在特權(quán)模式下才能改變F位的狀態(tài)。
可由外部通過(guò)對(duì)處理器上的nFIQ引腳輸入低電平產(chǎn)生FIQ。不管是在ARM狀態(tài)還是在Thumb狀態(tài)下進(jìn)入FIQ模式,F(xiàn)IQ處理程序均會(huì)執(zhí)行以下指令從FIQ模式返回:
SUBS PC,R14_fiq ,#4
該指令將寄存器 R14_fiq 的值減去 4 后,復(fù)制到程序計(jì)數(shù)器 PC 中,從而實(shí)現(xiàn)從異常處理程序中的返回,同時(shí)將 SPSR_mode 寄存器的內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。
IRQ(Interrupt Request)
IRQ異常屬于正常的中斷請(qǐng)求,可通過(guò)對(duì)處理器的nIRQ引腳輸入低電平產(chǎn)生,IRQ的優(yōu)先級(jí)低于FIQ,當(dāng)程序執(zhí)行進(jìn)入FIQ異常時(shí),IRQ可能被屏蔽。
若將CPSR的I位置為1,則會(huì)禁止IRQ中斷,若將CPSR的I位清零,處理器會(huì)在指令執(zhí)行完之前檢查IRQ的輸入。注意只有在特權(quán)模式下才能改變I位的狀態(tài)。
不管是在ARM狀態(tài)還是在Thumb狀態(tài)下進(jìn)入IRQ模式,IRQ處理程序均會(huì)執(zhí)行以下指令從IRQ模式返回:
SUBS PC , R14_irq , #4
該指令將寄存器 R14_irq 的值減去 4 后,復(fù)制到程序計(jì)數(shù)器 PC 中,從而實(shí)現(xiàn)從異常處理程序中的返回,同時(shí)將 SPSR_mode 寄存器的內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。
ABORT(中止)
產(chǎn)生中止異常意味著對(duì)存儲(chǔ)器的訪問(wèn)失敗。ARM微處理器在存儲(chǔ)器訪問(wèn)周期內(nèi)檢查是否發(fā)生中止異常。
中止異常包括兩種類(lèi)型:
─ 指令預(yù)取中止:發(fā)生在指令預(yù)取時(shí)。
─ 數(shù)據(jù)中止:發(fā)生在數(shù)據(jù)訪問(wèn)時(shí)。
當(dāng)指令預(yù)取訪問(wèn)存儲(chǔ)器失敗時(shí),存儲(chǔ)器系統(tǒng)向ARM處理器發(fā)出存儲(chǔ)器中止(Abort)信號(hào),預(yù)取的指令被記為無(wú)效,但只有當(dāng)處理器試圖執(zhí)行無(wú)效指令時(shí),指令預(yù)取中止異常才會(huì)發(fā)生,如果指令未被執(zhí)行,例如在指令流水線中發(fā)生了跳轉(zhuǎn),則預(yù)取指令中止不會(huì)發(fā)生。
若數(shù)據(jù)中止發(fā)生,系統(tǒng)的響應(yīng)與指令的類(lèi)型有關(guān)。
當(dāng)確定了中止的原因后,Abort處理程序均會(huì)執(zhí)行以下指令從中止模式返回,無(wú)論是在ARM狀態(tài)還是Thumb狀態(tài):
SUBS PC, R14_abt, #4 ;指令預(yù)取中止
SUBS PC, R14_abt, #8 ;數(shù)據(jù)中止
以上指令恢復(fù)PC(從R14_abt)和CPSR(從SPSR_abt)的值,并重新執(zhí)行中止的指令。
Software Interruupt(軟件中斷)
軟件中斷指令(SWI)用于進(jìn)入管理模式,常用于請(qǐng)求執(zhí)行特定的管理功能。軟件中斷處理程序執(zhí)行以下指令從SWI模式返回,無(wú)論是在ARM狀態(tài)還是Thumb狀態(tài):
MOV PC , R14_svc
以上指令恢復(fù)PC(從R14_svc)和CPSR(從SPSR_svc)的值,并返回到SWI的下一條指令。
Undefined Instruction(未定義指令)
當(dāng)ARM處理器遇到不能處理的指令時(shí),會(huì)產(chǎn)生未定義指令異常。采用這種機(jī)制,可以通過(guò)軟件仿真擴(kuò)展ARM或Thumb指令集。
在仿真未定義指令后,處理器執(zhí)行以下程序返回,無(wú)論是在ARM狀態(tài)還是Thumb狀態(tài):
MOVS PC, R14_und
以上指令恢復(fù)PC(從R14_und)和CPSR(從SPSR_und)的值,并返回到未定義指令后的下一條指令。