ARM 中斷處理過(guò)程
每一種運行模式下又都有一個(gè)專(zhuān)用的物理狀態(tài)寄存器,稱(chēng)為SPSR(Saved Program Status Register,備份的程序狀態(tài)寄存器),當異常發(fā)生時(shí),SPSR用于保存CPSR的當前值,從異常退出時(shí)則可由SPSR來(lái)恢復CPSR。
由于用戶(hù)模式和系統模式不屬于異常模式,他們沒(méi)有SPSR,當在這兩種模式下訪(fǎng)問(wèn)SPSR,結果是未知的
當中斷產(chǎn)生的時(shí)候,把CPSR保存在SPSR是自動(dòng)完成的。
對異常的響應
當一個(gè)異常出現以后,ARM微處理器會(huì )執行以下幾步操作:(自動(dòng)處理的)1、將下一條指令的地址存入相應連接寄存器LR,以便程序在處理異常返回時(shí)能從正確的位置重新開(kāi)始執行。若異常是從ARM狀態(tài)進(jìn)入,LR寄存器中保存的是下一條指令的地址(當前PC+4或PC+8,與異常的類(lèi)型有關(guān));若異常是從Thumb狀態(tài)進(jìn)入,則在LR寄存器中保存當前PC的偏移量,這樣,異常處理程序就不需要確定異常是從何種狀態(tài)進(jìn)入的。例如:在軟件中斷異常SWI,指令MOV PC,R14_svc總是返回到下一條指令,不管SWI是在A(yíng)RM狀態(tài)執行,還是在Thumb狀態(tài)執行。
2、將CPSR復制到相應的SPSR中。
3、根據異常類(lèi)型,強制設置CPSR的運行模式位。
4、強制PC從相關(guān)的異常向量地址取下一條指令執行,從而跳轉到相應的異常處理程序處。
還可以設置中斷禁止位,以禁止中斷發(fā)生。
如果異常發(fā)生時(shí),處理器處于Thumb狀態(tài),則當異常向量地址加載入PC時(shí),處理器自動(dòng)切換到ARM狀態(tài)
從異常返回(手動(dòng)處理的)
異常處理完畢之后,ARM微處理器會(huì )執行以下幾步操作從異常返回:1、將連接寄存器LR的值減去相應的偏移量后送到PC中。
2、將SPSR復制回CPSR中。
3、若在進(jìn)入異常處理時(shí)設置了中斷禁止位,要在此清除。
可以認為應用程序總是從復位異常處理程序開(kāi)始執行的,因此復位異常處理程序不需要返回。
幾種CPU工作模式
用戶(hù)模式(User,usr) | 正常程序執行的模式 |
快速中斷模式(FIQ,fiq) | 用于高速數據傳輸和通道處理 |
外部中斷模式(IRQ,irq) | 用戶(hù)通常的中斷使用 |
特權模式(Supervisor,sve) | 供操作系統使用的一種保護模式 |
數據訪(fǎng)問(wèn)中止模式(Abort,abt) | 用于虛擬存儲及存儲保護 |
未定義指令中止模式(Undefin- ed,und) | 用于支持通過(guò)軟件仿真硬件的協(xié)處理器 |
系統模式(System,sys) | 用于運行特權級的操作系統任務(wù) |
除用戶(hù)模式外都是特權模式(任意地進(jìn)行處理器模式的切換)。。
除用戶(hù)模式和系統模式外都是異常模式。
對不同的中斷模式都有獨立的堆棧和獨立的堆棧指針(SP)和(LR)
從SWI和Undef異常返回時(shí)使用
movs pc,LR
從FIQ,IRQ和預取終止返回時(shí)使用
SUBS PC, LR, #4
從數據異常返回時(shí)使用
SUBS PC, LR, #8
在使用上述指令異常返回時(shí),如果LR之前被壓棧的話(huà)使用LDM
LDMFD SP! {PC}^
評論