Cortex-M3中断具体行为

文章目录

      • 中断响应顺序
      • 入栈
      • 取向量
      • 更新寄存器
      • 异常返回
      • EXC_RETURN

中断响应顺序

  • 入栈:把8个寄存器的值压入栈
  • 取向量:从向量表中找出对应的服务程序入口地址
  • 更新堆栈指针sp,链接寄存器lr,程序指针pc

入栈

响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR, PC, LR, R12以及R3‐R0由硬件自动压入适当的堆栈中:如果当响应异常时,当前的代码正在使用PSP,则压入PSP,即使用线程堆栈;否则压入MSP,使用主堆栈。一旦进入了服务例程,就将一直使用主堆栈MSP。

取向量

当数据总线执行入栈操作的时候,指令总线正在执行取向量操作;即从向量表中找出正确的中断向量,然后在服务例程入口处预取指令;取向量和入栈是同时进行的;

更新寄存器

在中断开始响应之后,执行服务例程之前,更新了一系列寄存器:
SP:入栈会把SP(MSP或PSP)更新到新的位置,中断服务例程由MSP负责堆栈的访问;
PSR:IPSR位段(处于PSR的最低部分)会更新为新响应的异常编号;
PC:PC将指向服务例程的入口地址;
LR:LR的用法将被重新解释,其值将更新为一种特殊的值,称为“EXC_RETURN”,并在异常返回时使用;
在中断响应时,NVIC也更新了一些寄存器,例如,新响应异常的悬起位被清除,其活动位被激活;

异常返回

当异常服务例程执行完毕后,需要很正式地做一个“异常返回”动作序列,从而恢复先
前的系统状态,才能使被中断的程序得以继续执行。从形式上看,有3种途径可以触发异常返回序列,如表9.2所示;不管使用哪一种,都需要用到先前储的LR的值。
Cortex-M3中断具体行为_第1张图片
有些处理器使用特殊的返回指令来标示中断返回,例如8051就使用reti。但是在CM3中,是通过把EXC_RETURN往PC里写来识别返回动作的。

在启动了中断返回序列后,下述的处理就将进行:

  1. 出栈:先前压入栈中的寄存器在这里恢复。内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回去。
  2. 更新NVIC寄存器:伴随着异常的返回,它的活动位也被硬件清除。对于外部中断,倘若中断输入再次被置为有效,悬起位也将再次置位,新一次的中断响应序列也可随之再次开始。

EXC_RETURN

在进入异常服务程序后, LR的值被自动更新为特殊的EXC_RETURN,这
是一个高28位全为1的值,只有[3:0]的值有特殊含义,如表9.3所示。当异常服务例程把这个值送往PC时,就会启动处理器的中断返回序列。因为LR的值是由CM3自动设置的,所以只要没有特殊需求,就不要改动它。
Cortex-M3中断具体行为_第2张图片
如果在线程模式,且使用MSP时被中断,中断服务例程中EXC_RETURN=0xFFFF_FFF9;
如果在线程模式,且使用PSP时被中断,中断服务例程中EXC_RETURN=0xFFFF_FFFD;
如果在handler模式时被中断,中断服务例程中EXC_RETURN=0xFFFF_FFF1;
注意EXC_RETURN只能是这3个值,否则会产生硬fault,此时,用法Fault状态寄存器(UFSR,地址: 0xE000_ED2A)中的INVPC位(位偏移: 2),或者是INVSTATE位(位偏移: 1)置位。

你可能感兴趣的:(cortex-m3,EXC_RETURN)