系統(tǒng)學(xué)習(xí)ARM之六 --異常處理
轉(zhuǎn)載自 http://blog.csdn.net/qqliyunpeng/article/details/48791715
異常:
是一種突發(fā)情況。異常發(fā)生后,處理器要進(jìn)行相應(yīng)的處理(異常處理),切換到對(duì)應(yīng)的異常工作模式。
(1)拷貝 CPSR 到 SPSR_
(2)設(shè)置適當(dāng)?shù)?CPSR 位:
①改變處理器狀態(tài)進(jìn)入 ARM 狀態(tài)
②改變處理器模式進(jìn)入相應(yīng)的異常模式
③設(shè)置中斷禁止位禁止相應(yīng)中斷 (如果需要)
(3)保存返回地址到 LR_
(4)設(shè)置 PC 為相應(yīng)的異常向量
三、異常處理的返回: --通過(guò)異常返回指令1. 要做的:從 SPSR_
恢復(fù)CPSR 從LR_
恢復(fù)PC
①第一種方式:指令帶 “S” 后綴 + PC做為目的寄存器
movs pc,lr
②第二種方式:如果 lr之前被壓棧的話使用LDM +“ ^”
ldmfd sp!,{ pc }^
注意:有些異常處理返回值需要修正lr寄存器
所有從異常返回的情況:
a、從SWI和Undef 異常返回:
movs pc,lr
b、從FIQ, IRQ和 預(yù)取異常(Prefect Abort)返回:
SUBS pc,lr,#4 == @ pc = lr -4 和cpsr = spsr 兩句
c、從數(shù)據(jù)異常(Data Abort)返回:
SUBS pc,lr,#8
d、如果LR之前被壓棧的話:
MOVS pc,lr
四、異常源處理優(yōu)先級(jí)表:1. 表:Reset 最高
Data Abort //數(shù)據(jù)存取異常
FIQ
IRQ
Prefetch Abort
SWI
Undefined instruction
2. 向量表指令:①異常向量表:放的是不同異常源的處理地址。
②異常向量表指令:
LDR PC, [PC, #+0xFF0] 可尋址±4k
MOV PC, #0x30000000 立即數(shù)
B IRQ_handler 可尋址±32M
五、中斷控制器:1. 為什么會(huì)有中斷控制器?:ARM內(nèi)核(小核)只有兩個(gè)中斷源,用中斷控制器來(lái)擴(kuò)展中斷源
2. 中斷控制器要實(shí)現(xiàn)的功能 / 中斷控制器的作用:擇優(yōu)----(優(yōu)先級(jí))
跳轉(zhuǎn)到對(duì)應(yīng)的中斷處理函數(shù)
選擇處理該中斷源的cpu
fiq 比 irq 的優(yōu)先級(jí)高
FIQ 向量位于向量表的最末端,異常處理不需要跳轉(zhuǎn)
FIQ 比 IRQ 多5個(gè)私有的寄存器(r8-r12),在中斷操作時(shí),壓棧出棧操作的少。