一、简介:
异常:
是一种突发情况。异常发生后,处理器要进行相应的处理(异常处理),切换到对应的异常工作模式。
二、四大步三小步:(异常处理的硬件完成的事项)
(1)拷贝 CPSR 到 SPSR_<mode>
(2)设置适当的 CPSR 位:
①改变处理器状态进入 ARM 状态
②改变处理器模式进入相应的异常模式
③设置中断禁止位禁止相应中断 (如果需要)
(3)保存返回地址到 LR_<mode>
(4)设置 PC 为相应的异常向量
三、异常处理的返回: --通过异常返回指令
1. 要做的:
- 从 SPSR_<mode>恢复CPSR
- 从LR_<mode>恢复PC
2. 返回的具体实现指令:
①第一种方式:
指令带 “S” 后缀 + PC做为目的寄存器
movs pc,lr
②第二种方式:
如果 lr之前被压栈的话使用LDM +“ ^”
ldmfd sp!,{ pc }^
注意:有些异常处理返回值需要修正lr寄存器
所有从异常返回的情况:
a、从SWI 和Undef 异常返回:
movs pc,lr
b、从FIQ, IRQ 和 预取异常(Prefect Abort)返回:
SUBS pc,lr,#4 ==
@ pc = lr -4 和 cpsr = spsr 两句
c、
从数据异常( Data Abort)返回:
SUBS pc,lr,#8
d、如果LR之前被压栈的话:
MOVS pc,lr
四、异常源处理优先级表:
1. 表:
Reset 最高
Data Abort //数据存取异常
FIQ
IRQ
Prefetch Abort
SWI
Undefined instruction
2. 向量表指令:
①异常向量表:放的是
不同异常源的处理地址。
②异常向量表指令:
LDR PC, [PC, #+0xFF0]
可寻址±4k
MOV PC, #0x30000000
立即数
B IRQ_handler
可寻址±32M
五、中断控制器:
1. 为什么会有中断控制器?:
ARM内核(小核)只有两个中断源,
用中断控制器来扩展中断源
2. 中断控制器要实现的功能 / 中断控制器的作用:
- 择优----(优先级)
- 跳转到对应的中断处理函数
- 选择处理该中断源的cpu
六、FIQ 比 IRQ快的原因:
- fiq 比 irq 的优先级高
- FIQ 向量位于向量表的最末端,异常处理不需要跳转
- FIQ 比 IRQ 多5个私有的寄存器(r8-r12),在中断操作时,压栈出栈操作的少。