S3C2440 異常進(jìn)入和退出
1 處理器對異常的反應
產(chǎn)生異常時(shí),處理器采取如下動(dòng)作:
本文引用地址:http://dyxdggzs.com/article/201611/320027.htm1. 將 CPSR 復制到相應的 SPSR 中。 這會(huì )保存當前模式、中斷屏蔽和條件標記。
2. 轉至ARM狀態(tài)。
3. 更改相應的 CPSR 模式位,以便:
- 更改為適當的模式,并在該模式的相應編組寄存器中進(jìn)行映射。
- 禁用中斷。發(fā)生任何異常時(shí),都會(huì )禁用 IRQ。 在復位時(shí)發(fā)生 FIQ,會(huì )禁用 FIQ。
4. 將相應 LR 設置為返回地址。
5. 將 PC 設置為異常的向量地址。
2 從異常處理程序的返回
從異常中返回的方法取決于異常處理程序是否使用堆棧操作。 無(wú)論是否使用,要返回到異常發(fā)生處繼續執行,異常處理程序必須:
- 從相應 SPSR 恢復 CPSR
- 使用相應 LR 中的返回地址恢復 PC。
對于不需要從堆棧中恢復目標模式寄存器的簡(jiǎn)單返回,異常處理程序可通過(guò)執行具有以下設置的數據處理指令來(lái)完成這些操作:
- 設置 S 標記
- PC 作為目標寄存器。
所需的返回指令取決于異常的類(lèi)型。
注意,不必從復位處理程序返回,因為復位處理程序直接執行主代碼。
處理異常時(shí),如果異常處理程序入口代碼使用了堆棧來(lái)存儲必須保留的寄存器,則可通過(guò)使用帶 ^ 限定符的加載多個(gè)指令來(lái)返回。 異常處理程序可使用一條指令返回,例如使用:
LDMFD sp!,{R0-R12,pc}^
為此,異常處理程序必須將以下內容保存到堆棧中:
- 調用處理程序時(shí)使用的所有工作寄存器
- 為產(chǎn)生與數據處理指令相同的效果而修改的鏈接寄存器。
^ 限定符指定從 SPSR 恢復 CPSR。
注意:不能使用任何 16 位 Thumb 指令從異常返回,因為這些指令無(wú)法恢復 CPSR。
3 返回地址和返回指令
產(chǎn)生異常時(shí)由程序計數器指向的實(shí)際位置取決于異常的類(lèi)型。返回地址可能不必是程序計數器指向的下一條指令。如果異常發(fā)生在 ARM 狀態(tài),處理器則將 (PC+4) 存儲在 lr_ mode。
下面較詳細地說(shuō)明了每一種異常類(lèi)型如何從處理代碼正確返回的指令。
3.1 從 SWI 和 未定義指令處理程序返回
SWI 和未定義指令異常是由指令本身造成的,因此,處理異常時(shí),程序計數器保持不變(預取指就失敗了)。處理器將 (PC+4) 存儲在 lr_ mode 中。因而使 lr_mode 指向下一條要執行的指令。要從 lr 中恢復程序計數器,則使用:
MOVS pc, lr
從處理程序返回控制權。
將返回地址推入堆中并在返回時(shí)將其彈出的處理程序入口和出口代碼為:
STMFD sp!,{reglist,lr}
;...
LDMFD sp!,{reglist,pc}^
3.2 從 FIQ 和 IRQ 處理程序返回
執行完每一條指令后,處理器檢測中斷管腳是否為 LOW(電平),以及 CPSR中斷禁用位是否為清除。結果,僅在程序計數器被更新后才發(fā)生 IRQ 或 FIQ 異常。處理器將 (PC+4) 存儲在 lr_mode 中。使 lr_mode 指向發(fā)生異常時(shí)尚未執行的指令的下一條指令。處理程序完成后,必須從 lr_mode 指向發(fā)生異常時(shí)尚未執行的指令處繼續運行。該繼續執行地址較 lr_mode 中的地址少一個(gè)字(四個(gè)字節),因此,其返回指令為:
SUBS pc, lr, #4
將返回地址推入堆中并在返回時(shí)將其彈出的處理程序入口和出口代碼為:
SUB lr,lr,#4
STMFD sp!,{reglist,lr}
;...
LDMFD sp!,{reglist,pc}^
3.3 從預取中斷處理程序返回
如果處理器試圖在非法地址取指令,則該指令被標志為無(wú)效。繼續執行已經(jīng)在流水線(xiàn)中的指令至遇到產(chǎn)生“預取中斷”處的無(wú)效指令為止。如有將虛擬存儲器位置映射到該物理存儲器的指令,異常處理程序將無(wú)映射關(guān)系的指令裝入物理存儲器并使用 MMU。然后,處理程序必須返回,再次使著(zhù)運行產(chǎn)生異常的指令?,F在裝入并執行指令。
因為發(fā)出預取中斷時(shí)程序計數器還沒(méi)有被更新,所以 lr_abt 指向產(chǎn)生異常的下一條指令。處理程序必須返回至 lr_ABT-4 的指令,請使用下列指令:
SUBS pc,lr, #4
將返回地址推入堆中并在返回時(shí)將其彈出的處理程序入口和出口代碼為:
SUB lr,lr,#4
STMFD sp!,{reglist,lr}
;...
LDMFD sp!,{reglist,pc}^
3.4 從數據中斷處理程序返回
當裝入或存儲指令試圖訪(fǎng)問(wèn)存儲器時(shí),程序計數器被更新。(PC+4) 的存儲值指向產(chǎn)生異常地址處的第二條指令。MMU(如果有)將相應地址映射至物理存儲器,處理程序必須返回到原來(lái)中斷的指令,以便進(jìn)行第二次執行嘗試。因此,返回地址較 lr_abt 中少兩個(gè)字(八個(gè)字節),使用如下返回指令:
SUBS pc, lr, #8
將返回地址推入堆中并在返回時(shí)將其彈出的處理程序入口和出口代碼為:
SUB lr,lr,#8
STMFD sp!,{reglist,lr}
;...
LDMFD sp!,{reglist,pc}^
評論