arm中断后,硬件会自动跳到中断向量表(这里注意是自动)。中断向量表是放在0地址开始的位置,如下表所示。
如上电时,程序会跳到0x00000000处执行,然后在该处放一条跳转指令,跳转到中断服务函数,如B Reset。然后在中断服务函数中处理。
中断发生后,当然要保存现场,否则中断处理函数会破坏被中断之前的寄存器。哪些寄存器需要保存?淡然已经使用了的寄存器需要保存,但是想要弄清楚哪些寄存器需要保存也不是件容易的事情。那么偷懒的办法就是保存所有的寄存器,下图所示是arm寄存器。如发生SWI中断,那么就保存r0~r12,r13_svc为该中断模式下专用寄存器,所以在该模式下会使用这个寄存器,不会使用中断发生前的工作模式下的r13,故原来模式下的r13就无需保存。r13要重新给一个地址,它是SVC模式下的栈地址,是独立于中断前的栈地址。r14_svc中保存了中断前下一条指令的地址,所以也要保存起来,否则,在中断处理函数中可能会被破坏。cpsr的值保存到spsr_svc中。这些寄存器的保存可以用一条指令实现:stmdb sp!,{r0-r12,lr}。中断处理完后,需要恢复这些寄存器,也可以用一条指令来实现:ldmia sp!,{r0-r12,pc}。表示将spsr_svc恢复到cpsr中。
总结两点:1发生中断或异常后,处理器自动跳到向量表中相应地址 2进入中断要保存现场,中断处理后恢复现场。