uTank-木头
每一个你不满意的现在,都有一个你没有努力的曾经。

【异常/中断响应】
Cortex-M3的异常/中断响应序列包括:

  • 入栈:把8个寄存器的值压入栈。
  • 取向量:从向量表中找出对应的服务程序入口地址。
  • 更新寄存器:更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC

【入栈】
响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR、PC、LR、R12以及R3~R0由硬件自动压入适当的堆栈中

响应异常时,如果当前的代码正在使用PSP,则压入PSP;如果当前的代码正在使用MSP,则压入MSP。

When the processor takes an exception, unless the exception is a tail-chained or a late-arriving exception, the processor pushes information onto the current stack. This operation is referred to as stacking and the structure of eight data words is referred as the stack frame. The stack frame contains the following information:

一旦进入了异常中断服务例程,就将一直使用主堆栈MSP。

假设入栈开始时,SP的值位N,则在入栈后,入栈顺序以及入栈后堆栈中的内容变化如图所示:

因为AHB接口上的流水线操作本性,地址和数据都是经过一个流水周期之后才进入。
在自动入栈的过程中,把寄存器写入堆栈内存的时间顺序,并不是与写入的空间顺序相对应的。但是,Cortex-M3内核会保证:正确的寄存器将被保存到正确的位置。

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

【更新寄存器】

When stacking is complete, the processor starts executing the exception handler. At the same time, the processor writes an EXC_RETURN value to the LR. 

入栈完成后,处理器开始执行异常处理,以此同时,EXC_RETURN将被写入到LR中;LR中的EXC_RETURN值将决定返回的模式和使用的堆栈指针;

在入栈和取向量操作完成之后,执行异常中断服务程序之前,还要更新一系列的寄存器:

  • 堆栈指针SP:在入栈后,会把堆栈指针(PSP或MSP)更新到新的位置。在执行异常中断服务程序时,将由MSP负责对堆栈的访问。
  • 程序状态寄存器PSR:更新IPSR位段的值为新响应的异常编号。
  • 程序计数寄存器PC:在取向量完成后,PC将指向异常中断服务程序的入口地址。
  • 连接寄存器LR:在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”。在异常进入时由系统计算并赋给LR,并在异常返回时使用它。

另外,在NVIC中,也会更新若干个相关寄存器。例如,新响应异常的悬起位将被清除,同时其活动位将被置位。

【异常/中断返回】
当异常中断服务程序执行完毕之后,需要一个“异常返回”动作序列,从而恢复先前的系统状态,使被中断的程序继续执行。
从形式上看,有3种途径可以触发异常返回序列,如:

不管使用哪一种返回指令,都需要用到先前存储到LR中的EXC_RETURN,把EXC_RETURN送往PC。

The processor saves an EXC_RETURN value to the LR on exception entry. The exception mechanism relies on this value to detect when the processor has completed an exception handler. Bits[31:4] of an EXC_RETURN value are 0xFFFFFFF. When the processor loads a value matching this pattern to the PC it detects that the operation is a not a normal branch operation and, instead, that the exception is complete. Therefore, it starts the exception return sequence. Bits[3:0] of the EXC_RETURN value indicate the required return stack and processor mode, as shows:

EXC_RETURN位段含义:

在启动了中断返回序列后,将执行以下操作:

  • 出栈:由EXC_RETURN的值决定使用哪个堆栈指针恢复先前压入堆栈的寄存器的值。内部的出栈顺序与入栈时的向对应。堆栈指针的值也恢复更新。
  • 更新NVIC寄存器:异常返回,其将于的活动位将被硬件清除。对于外部中断,如果中断输入再次被置为有效,悬起位也将再次置位,新的中断响应序列也随之再次执行。

 

 


 参考摘录:

《Cortex-M内核系列和STM32-讲座2教程.pdf》

《ARM Cortex-M3权威指南.pdf》

posted on 2019-07-26 17:23  uTank  阅读(2447)  评论(0编辑  收藏  举报