首先梳理一下思路:
1.每种异常模式的进入地址都是固定的(硬件决定)
2.软件编写以各个异常模式的地址开始跳转到自定义的地址进行展开编写
3.发生异常,硬件会将先前模式下的下一条指令放入LR寄存器,并将CPSR的值存入SPSR
4.在异常模式下首先选择栈地址存放数据,要保存先前的环境到栈中(虽然先前硬件有保存,但是接下来的程序会使其变化,所以我们要将先前的环境数据提取出来再自己保存)
5.编写异常处理程序
6.恢复环境
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
简单代码示例:
/* sp_irq未设置, 先设置它 */
ldr sp, =0x33d00000
/* 保存现场 */
/* 在irq异常处理函数中有可能会修改r0-r12, 所以先保存 */
/* lr-4是异常处理完后的返回地址, 也要保存 */
sub lr, lr, #4
stmdb sp!, {r0-r12, lr}
/* 处理irq异常 */
bl handle_irq_c
/* 恢复现场 */
ldmia sp!, {r0-r12, pc}^ /* ^会把spsr_irq的值恢复到cpsr里 */