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


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寄存器和内核寄存器,包括挂起状态寄存器(这个需要软件来清掉)和异常的活跃状态,处理器内

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值