STM32的中断处理流程是怎样的?与ARM7 ARM9相同吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32的中断处理流程是怎样的?与ARM7 ARM9相同吗?相关的知识,希望对你有一定的参考价值。

我有一个疑问,在STM32启动代码中,复位中断向量地址处用的是DCD Reset_Handler,并不是跳转指令 b Reset_Handler或LDR PC,=Reset_Handler。那么启动时是怎么会跳转执行Reset_Handler子程序的呢?
请各位大虾帮忙解惑!
其它中断也是同样的,都是在向量表中放的DCD XXXX_Handler ,不知道是怎样跳转到中断入口函数的。
ARM9的启动代码就不是这样的,在中断向量处直接用的跳转指令诸如“LDR PC,=Reset_Handler”之类。

是否CM3与ARM7/9的异常处理机制不同呢?

我暂时是这样理解的:

中断向量地址处用DCD伪指令来存放ISR的入口地址,在发生异常时CM3自动跳转到相应的中断向量地址处存放的ISR入口地址,执行相应的ISR。不需要用跳转指令--不知道这样理解对不对???

请各位大虾不吝指教!!!

你的理解是对的,stm32的中断向量表不是跳转指令,而是地址,包括刚开始的时候得到的msp指针,都是硬件来完成,B 跳转,实际也是纯粹修改PC的值,stm32把这一步交给硬件来处理,但是按照跳转指令的思维理解比较习惯。 参考技术A 从未研究过启动代码,STM32中断倒是研究了一下。呵呵 向你致敬。。 参考技术B 我也是刚刚学习STM32,我会关注你的问题,虽然我也帮不了你。

SylixOS 中断流程

  1. 说明

    本文章分析了ARM架构下SylixOS内核中断流程,共包含三部分:

  • 分析SylixOS运用数组和双向链表实现中断服务函数的注册

  • 阐述ARM硬件中断机制

  • 分析SylixOS中断处理流程

     

  1. SylixOS中断注册

    SylixOS中断注册是通过数组和双向链表实现的。

  2. 系统中断向量结构索引数组

    _K_idescTable [256]是SylixOS内核中的系统中断向量结构索引数组,用于索引注册的中断服务函数,其类型如清单 21所示

    清单 21


    typedef struct {
        LW_LIST_LINE_HEADER   IDESC_plineAction;                            /*  判断中断服务函数列表        */
        ULONG                 IDESC_ulFlag;                                 /*  中断向量选项                */
        LW_SPINLOCK_DEFINE   (IDESC_slLock);                                /*  自旋锁                      */
    } LW_CLASS_INTDESC


    第一个成员是双向链表的头指针,用于指向将来注册的中断向量结构链表。


  3. 中断向量结构链表

    每进行一次中断注册,内核创建一个中断向量结构。如果有多个中断源共享一个中断号,内核将这些中断源的各个中断向量结构链接成双向链表。中断向量结构类型如清单 22所示:

    清单 22


    typedef struct {
        LW_LIST_LINE          IACT_plineManage;                             /*  管理链表                    */
        INT64                 IACT_iIntCnt[LW_CFG_MAX_PROCESSORS];          /*  中断计数器                  */
        PINT_SVR_ROUTINE      IACT_pfuncIsr;                                /*  中断服务函数                */
        VOIDFUNCPTR           IACT_pfuncClear;                              /*  中断清理函数                */
        PVOID                 IACT_pvArg;                                   /*  中断服务函数参数            */
        CHAR                  IACT_cInterName[LW_CFG_OBJECT_NAME_SIZE];
    } LW_CLASS_INTACT


    当进行一次中断注册,内核依次完成如下事务:


  • 构建一个中断向量结构

  • 在此中断向量结构中记录中断服务函数地址和中断服务函数名等信息

  • 将此中断向量结构插入到此中断号的中断向量结构链表

  • 以中断向量号为下标索引_K_idescTable数组,将其中的头指针指向上一步构建的双向链表

    如图 21所示,中断注册实质是构建中断向量结构双向链表。

    技术分享

    21中断注册

     

  1. ARM硬件中断机制

    当中断发生后,ARM内核自动完成如下事务:

  • 保存执行状态:保存CPSR到中断模式的SPSR中

  • 模式切换:处理器进入中断模式,并关闭中断,防止中断嵌套

  • 保存返回地址:保存PC-4到中断模式的LR中

  • 跳入中断向量表:强制设置PC为中断向量地址,跳转到中断处理程序中

  1. 保存执行状态

    当前程序的执行状态是保存在CPSR中的,中断发生时,要保存当前CPSR中的执行状态到中断模式的SPSR中,将来中断返回时,恢复到CPSR,恢复执行状态。

  2. 模式切换

    硬件自动将中断异常码写入CPSR中的模式位,CPU进入中断模式。同时硬件自动切换处理器到ARM状态下执行指令,并且CPU通过设置CPSR相应位来关闭中断。

  3. 保存返回地址

    当前程序被中断打断,切换到中断处理程序里,中断处理完后,返回当前被打断模式继续执行,因此必须要保存当前指令的下一条指令的地址到中断模式下的LR中。由于ARM异常模式不同以及ARM内核采用流水线技术,中断处理程序需要重新计算正确的返回地址。

  4. 跳入中断向量表

    该操作是CPU硬件自动完成的,当异常发生时,CPU强制将PC的值改为一个固定内存地址,并跳到此地址处执行。

     

  5. SylixOS中断处理流程

  6. 中断处理程序

    SylixOS中断处理程序完成如下事务:

  • 修正返回地址,LR=LR-4

  • 保存现场寄存器

  • 中断处理阶段1

  • 恢复现场寄存器

  • 返回现场,PC=LR,回到返回地址处继续执行

  1. 中断处理阶段1

    中断处理阶段1完成了3件事务:

  • 获得中断源的中断向量号

  • 中断处理阶段2

  • 中断结束处理

    获得中断向量号一般都是通过读取中断控制器的某个寄存器来获得;中断处理结束后需要通知中断控制器中断处理已经完成,一般都是向某个寄存器写入任意值即可。

  1. 中断处理阶段2

    此阶段是真正的进行中断处理,完成以下事务:

  • 以中断向量号作为索引,通过_K_idescTable数组找到此中断向量号的中断结构链表

  • 依次遍历之前注册的中断服务函数,并根据返回值判断是否已经执行了相应中断源的中断服务函数。如果已经执行则退出遍历,否则继续遍历直到找到相应的服务函数或者找不到退出。

  1. 总结

  • 通过中断注册构建中断向量结构链表

    中断发生时通过中断向量号索引_K_idescTable数组找到此中断向量号的中断结构链表,然后遍历之前注册在其中的中断服务函数,直到找到相应的服务函数或者找不到退出。

本文出自 “深山野老” 博客,请务必保留此出处http://11080845.blog.51cto.com/11070845/1916783

以上是关于STM32的中断处理流程是怎样的?与ARM7 ARM9相同吗?的主要内容,如果未能解决你的问题,请参考以下文章

stm32中断怎样pending

STM32 USART接收中断程序问题

STM32 USART接收中断程序问题

STM32与ARM7ARM9ARM11

STM32基于HAL库的中断详细学习

STM32外部中断用一根中断线怎样配置两个中断口,优先级设置