异常返回
1、 从SWI和未定义 返回
内核在计算LR(返回地址)时没有更新PC 因此 MOVS PC ,LR
当前lr=pc-4 (mov pc pc-4)=movs pc.lr
2、 从FIQ IRQ和预取 返回 SUBSPC, LR ,#4
内核计算LR时更新了PC movs pc, pc-8 =movs pc , pc-4-4 =movs pc,lr-4
3、从数据异常返回(有硬件/软件产生的 为保证数据完整性) SUBS PC, LR,#8
PC movs pc, pc-12 =movs pc , pc-4-8 =movs pc, lr-8
中断处理程序
从向量表中直接跳转到中断
HandleIRQ: 跳转到中断
stmfd sp!, {r0-r12, lr} 保护现场
bl do_irq 跳过异常处理函数
ldmfd sp!, {r0-r12, pc}^ 回复现场
subs pc, lr, #4 计算返回地址
中断编程流程
• 启动代码
• 建立异常向量表
• 关闭看门过
• 初始化系统时钟
• Main函数入口
• 异常中断入口
HandleIRQ:
stmfd sp!, {r0-r12, lr}
bl do_irq
ldmfd sp!, {r0-r12, pc}^
subs pc, lr, #4