https://www.jianshu.com/p/52841b514868
ARM希望把中断处理函数也做成C函数的形式,一般C函数的处理过程类似了。
进入中断前,首先要把(R0-R3,R12,LR,PSR)保存起来,然后在中断结束后恢复它们。
这一切都是通过硬件完成的。
但是,中断的返回地址并没有像一般的C函数调用一样存储在LR中。(即LR放的不是前一个的PC,在中断发生时,当前的PC被存在了栈中,而不是LR中,LR被赋予了 新的功能;同时LR的值还是要被存入栈的,因为该函数也是要返回它自己的调用函数的)也就是说,中断过程中不但要像一般的C函数调用一样保存(R0-R3,R12,LR,PSR),还要保存中断返回地址(return address)。
中断的硬件机制会把EXC_RETURN放进LR,在中断返回时触发中断返回,而不是一般的C函数返回。
EXC_RETURN
如上文所说,LR在进入中断后通过硬件更新为EXC_RETURN。
EXC_RETURN为中断返回提供了更多的必要信息,如上表所示。
- bit4,表明了压入的是8个字,还是26个字。因为带浮点运算单元和不带浮点运算单元是有区别的。
- bit3,表明是返回到Thread模式还是Handler模式。也就是该中断之前是从线程模式进入的,还是从中断中进入的(中断嵌套)。
- bit2 返回到哪个栈,是程序栈(Process Stack)还是主栈(Main Stack)。
图8.2是一个