zoukankan      html  css  js  c++  java
  • Cortex-M3 异常中断响应与返回

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

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

    【入栈】
    响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR、PC、LR、R12以及R3~R0由硬件自动压入适当的堆栈中:如果当响应异常时,当前的代码正在使用PSP,则压入PSP,也就是使用进程堆栈;否则就压入MSP,使用主堆栈
    一旦进入了异常中断服务例程,就将一直使用主堆栈。
    假设入栈开始时,SP的值位N,则在入栈后,入栈顺序以及入栈后堆栈中的内容变化如图所示:

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

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

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

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

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

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

    不管使用哪一种返回指令,都需要用到先前存储到LR中的EXX_RETURN,把EXC_RETURN送往PC。
    在启动了中断返回序列后,将执行以下操作:

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

     参考摘录:

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

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

  • 相关阅读:
    DataType--数值类型
    Scala中List(Map1,Map2,Map3 ....) 转成一个Map
    Scala中集合类型与java中集合类型转换
    oracle查询数据库最大连接数等信息
    kafka_2.11-0.10.2.1中的auto.offset.reset
    IOS设备信息与机型对照表
    shell 后台执行脚本
    Spark的操作列表
    hive表支持中文设置
    编译Spark2.1.2源码
  • 原文地址:https://www.cnblogs.com/utank/p/11251721.html
Copyright © 2011-2022 走看看