系统学习ARM之六 --异常处理
扫描二维码
随时随地手机看文章
转载自 http://blog.csdn.net/qqliyunpeng/article/details/48791715
异常:
是一种突发情况。异常发生后,处理器要进行相应的处理(异常处理),切换到对应的异常工作模式。
(1)拷贝 CPSR 到 SPSR_
(2)设置适当的 CPSR 位:
①改变处理器状态进入 ARM 状态
②改变处理器模式进入相应的异常模式
③设置中断禁止位禁止相应中断 (如果需要)
(3)保存返回地址到 LR_
(4)设置 PC 为相应的异常向量
三、异常处理的返回: --通过异常返回指令1. 要做的:从 SPSR_
恢复CPSR 从LR_
恢复PC
①第一种方式:指令带 “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 向量位于向量表的最末端,异常处理不需要跳转
FIQ 比 IRQ 多5个私有的寄存器(r8-r12),在中断操作时,压栈出栈操作的少。