Cortex-M系列中断和异常(二)

本文深入探讨Cortex-M4处理器的中断处理流程,包括异常的接受条件、进入和退出流程,以及NVIC中断控制器的寄存器详细解析,如中断使能/失能、挂起/清除挂起、活跃状态、优先级以及软件触发中断寄存器的使用。
摘要由CSDN通过智能技术生成


1. 中断与异常

    上一篇文章解析了中断和异常的意义,基本属性和中断输入和挂起的流程,这篇文章接着介绍中断具体的执行流程,中断向量控制器NVIC的具体寄存器和系统控制块SCB中的寄存器。

1.1 异常的处理流程

    此处中断和异常是同一个概念,下面统称为异常。

1.1.1 接受异常请求

    处理器能够接受异常并执行异常的条件有如下几个(此处的接受异常是指能够执行中断处理函数):
    (1)处理器处于运行的状态(没有被hold住,没有处于reset状态);
    (2)异常是处于使能状态的,即中断使能控制寄存器的相应bit位被置位,但是NMI和HardFault异常位特殊情况,他们总是被使能的;
    (3)如果当前处理器正在处理异常,此时又来了一个异常,又来了这个异常一定要高于当前优先级才会被立即执行,但是如果低于当前优先级,就会将Pending位置位,处理完当前优先级后,有了空余机会就会处理新来c的这个异常;
    (4)异常没有被异常屏蔽寄存器(如PRIMASK)屏蔽,如果被屏蔽了但中断请求还是来了,那么会将Pending位置位,使能中断之后才会去执行。
    注:SVC异常比较特殊,若SVC指令被意外用在某异常处理过程中,即在其他异常处理过程中call SVC异常,而且该异常的优先级小于SVC,它就会引起HardFault异常。

1.1.2 异常进入的流程

    当系统进入异常,硬件回去做一系列的操作,保证处理完中断处理函数(ISR)之后仍然回到常规业务上,具体的流程如下:
    (1)当处理器决定执行中断,首先会把当前正在运行的线程或者主业务的状态信息保存到栈中(压栈),具体就是将CPU相关寄存器和返回的地址压入当前使用的栈中,这个栈可能是进程栈PSP也可能是主栈MSP,如果处理器处于线程模式且正在使用PSP,那么压栈就会选择进程栈,否则就选MSP。
    (2)压栈之后,处理器要获得中断处理函数的入口地址才能执行中断处理函数,这时从中断向量表中获取ISR的起始地址,通常获取地址的操作和压栈的操作是同时进行的。
    (3)获取到中断处理函数的地址之后就开始执行中断处理函数。
    (4)更新多个NVIC寄存器和内核寄存器,包括挂起状态寄存器(这个需要软件来清掉)和异常的活跃状态,处理器内核寄存器中的寄存器包括程序状态寄存器(PSR),链接寄存器(LR),程序计数器(PC)以及栈指针(SP)。
    由于压栈的过程,PSP或MSP肯定会发生变化,PC也会被更新为异常处理的起始地址,链接寄存器LR会被更新为EXC_RETURN的特殊值。该数值为32为,且高27位为1。低5位中有些部分用于保存异常流程的状态信息(如压栈时使用哪个栈),知道压栈时使用的那个栈,从异常退出之后才知道从哪里恢复数据。

1.1.3 异常处理流程

     所谓异常处理就是执行异常处理函数,在执行函数期间处理器就会处于处理模式。处理模式下栈操作使用主栈指针(MSP),同时处理器运行在特权访问等级。
     处理异常的过程中如果又来了一个异常,如果这个异常的优先级比当前的中断更高,那么就去执行更高优先级的中断,这就叫中断嵌套,如果来的中断优先级和现在的中断优先级一样或者是更低,那么新来的这个中断就会被pending住,直到当前的中断执行完再去相应这个新来的中断。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值