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