Cortex-M3 异常响应具体行为

响应中断三个步骤:

1.入栈:将8个寄存器的值压入栈

2.取中断向量:从向量表找出服务程序入口地址

3.选择堆栈指针MSP/PSP,更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC


入栈操作如下所示

Cortex-M3 异常响应具体行为_第1张图片

注意这里为啥只压入R0-R3以及R12呢?原来,在ARM上,有一套的C函数调用标准约定(《C/C++ Procedure Call Standard for the ARM Architecture》,AAPCS, Ref5)。个中原因就在它上面:它使得中断服务例程能用C语言编写,编译器优先使用入栈了的寄存器来保存中间结果(当然,如果程序过大也可能要用到R4-R11,此时编译器负责生成代码来push它们。但是,ISR应该短小精悍,不要让系统如此操心——译者注)。

取指

当数据总线(系统总线)正在为入栈操作而忙得风风火火时,指令总线(I-Code总线)可不是凉快地坐那儿看热闹——它正在为响应中断紧张有序地执行另一项重要的任务:从向量表中找出正确的异常向量,然后在服务程序的入口处预取指。


更新寄存器

在入栈和取向量操作完成之后,执行服务例程之前,还要更新一系列的寄存器:
 SP:在入栈后会把堆栈指针(PSP或MSP)更新到新的位置。在执行服务例程时,将由MSP负责对堆栈的访问。
 PSR:更新IPSR位段(地处PSR的最低部分)的值为新响应的异常编号。
 PC:在取向量完成后,PC将指向服务例程的入口地址,
 LR:在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”,在异常进入时由系统计算并赋给LR,并在异常返回时使用它。EXC_RETURN的二进制值除了最低4位外全为1,而其最低4位则有另外的含义(后面讲到,见表9.3和表9.4)。
以上是在响应异常时通用寄存器的变化。另一方面,在NVIC中,也会更新若干个相关有寄存器。例如,新响应异常的悬起位将被清除,同时其活动位将被置位。


你可能感兴趣的:(Cortex-M3 异常响应具体行为)