浅析arm的异常、中断和arm工作模式的联系 - 宋桓公 - 博客园
别人的帖子都写得很清楚,俺就随便写写加深印象
arm有一个异常向量表,分别对应七种模式状态,大部分时候在user模式
当发生异常中断时,就会停止当前动作跳转到对应模式下的地址,执行对应的处理,结束后再跳回原来的地方继续原来的代码。
S文件中指数的异常向量地址,出现异常硬件会自动跳转,使用位置无关码
与中断异常相关的有一个重要的寄存器,cpsr程序状态寄存器。工作模式之间的切换,主要就是靠这个寄存器。
中断异常的执行流程:
1.设置好中断源,设置好中断控制器能接收判断中断源的信号,编写好中断处理函数以出来中断
2.异常/中断发生时,PC都会指向相应的向量表。异常的发生往往会导致模式的自动切换。
3.保存现场
硬件自动做:模式切换是硬件自动做的,同时cpsr的值存放到spsr,lr寄存器的值会存到当当下模式的lr'中
程序员需要做的:给新模式下的sp赋值,把原来模式的r0-r12以及lr的值保存到新的栈中,保证之前模式的值不被破坏。
4.进入中断处理函数。处理中断。
5.中断返回,将之前保存到栈里的值读回,并SPSR的值赋值给CPSR实现主动切换到之前的模式
。其中PC的值要根据各个模式进行一定的offset
中断是有arm指令集和thumb指令集两种模式,thumb是arm的子集,我也不会thumb指令集,流程是一样,就是写法有些出入。