0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解

jf_pJlTbmA9 来源:cathy 作者:cathy 2023-09-27 15:29 次阅读

问题

最近在使用 STM32F3 芯片的时候,遇到这样一个问题:如果外部中断来的频率足够快,上一个中断没有处理完成,新来的中断如何处理? 在调试时,发现有中断有 挂起、激活、失能等状态,考虑这些状态都是干啥用的呢!他们是 Cortex-M 核所共有的,因此,这里不针对与具体用的 STM32 MCU,直接上升到 Cortex-M 内核来了解一下!

简介

中断(也称为“异常”)是微控制器一个很常见的特性。中断一般是由硬件(例如外设、外部引脚)产生,当中断产生以后 CPU 就会中断当前的程序执行流程转而去处理中断服务中指定的操作。

所有的 Cortex-M 内核都会包含一个用于中断处理的组件:NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)。它处理处理中断,还处理其他需要服务的事件(例如 SVC 指令),通常称为异常(按照 ARM 的说法,中断也是一种异常)。

1.png

Cortex-M3 和 Cotex-M4 的 NVIC 最多支持 240 个 IRQ(中断请求)、1 个不可屏蔽中断(NMI)、1 个 Systick(滴答定时器)定时器中断和多个系统异常。而 Cortex-M0 最多支持 32 个 IRQ、1 个不可屏蔽中断(NMI)、1 个 Systick(滴答定时器)定时器中断和多个系统异常。

  • IRQ: 多数由定时器、IO 端口通信接口等外设产生

  • NMI: 通常由看门狗定时器或者掉电检测器等外设产生

  • 其他: 主要来自系统内核

注意,本文所说的 Cortex-M 主要指定是 Cotex-M3 和 Cotex-M4。

2.png

Cortex-M0、Cortex-M0+、Cortex-M1 基于 ARMv6-M。与 Cotex-M3 和 Cotex-M4 相比,他们的指令集较小。而且,Cortex-M1 是专门为FPGA 应用设计的,没有独立 MCU。

异常类型

Cortex-M 处理器的异常中,编号 1~15 的为系统异常,16 及以上的则为中断输入。所有中断级别的异常都具有可编程的优先级。部分系统异常具有固定优先级。ARM 给出了以下一张表:

未标题-1.jpg

针对 Cortex-M 系列的内核,ARM 提供了一套叫做 CMSIS 的东西。目前,所有的 MCU 均使用 CMSIS 作为编程基础。在 CMSIS-Core 中,中断标识有中断枚举实现,从数值 0 开始(代表中断 #0)。其中,系统异常的编号为负数。具体如下:

3.png

CMSIS-Core 之所以使用另外一种编号系统,是因为这样可以稍微提高部分 API 的效率。中断的编号和枚举定义是同设备相关的,他们位于微控制器供应商提供的头文件中,在一个名为 IRQn 的 typedef 段中。

中断处理(异常处理)

当某种内部或外部事件发生时,MCU 的中断系统将迫使 CPU 暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去。

主程序正在执行,当遇到中断请求(Interrupt Request)时,暂停主程序的执行转而去执行中断服务例程(Interrupt Service Routine,ISR),称为响应,中断服务例程执行完毕后返回到主程序断点处并继续执行主程序。多个中断是可以进行嵌套的。正在执行的较低优先级中断可以被较高优先级的中断所打断,在执行完高级中断后返回到低级中断里继续执行。

4.png

中断管理

管理中断所使用的大部分寄存器都位于 NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)和 SCB(System Control Block,系统控制块)中。实际上,SCB 是作为 NVIC 的一部分来实现的,不过在 CMSIS-Core 中,将其定义在了独立的结构体中。除此之外,处理器内核中还有用于中断屏蔽寄存器:PRIMASK、FAULTMASK、BASEPRI。

NVIC 和 SCB 位于系统控制空间,地址从 0xE000E00 开始,大小 4KB。SCB 中还有 SysTick 定时器,存储器保护单元等。

优先级

这部分暂且不说!

中断输入和挂起

在 Cortex-M 内核中,每个中断都具有多个属性:

  • 每个中断都可以被禁止(默认)或者使能

  • 每个中断都可以别挂起或者解除挂起

  • 每个中断都可以处于活跃或者非活跃

这些状态属性具有多种可能的组合。例如,在处理中断时,可以将其禁止,若在中断退出前产生了同一个中断的新请求,由于该活跃中断被禁止了,那就会处于挂起状态。

NVIC 在设计上既支持产生 脉冲中断请求 的外设,也支持产生 高电平中断请求 的外设。无需配置任何一个 NVIC 寄存器以选择其中一种中断类型。对于脉冲中断请求,脉冲宽度至少要为一个时钟周期;而对于电平触发的请求,在 ISR 中的操作清除请求之前,请求服务的外设要一直保持电平信号(如写入寄存器以清除中断请求) 。尽管外部中断请求在 I/O 引脚上的电平可能是低电平有效,但是 NVIC 收到的请求信号为高有效!

中断的挂起状态被存储在 NVIC 的可编程寄存器中,当 NVIC 的中断输入被确认后,它就会引发该中断的挂状态。即便中断请求被取消,挂起状态仍会为高。这样,NVIC 就可以处理脉冲中断请求了。

挂起状态的意思是,中断被置于一种等待处理器处理的状态。有些情况下,处理器在中断挂起时就会进行处理。不过,若处理器已经在处理另外一个更高或同优先级的中断,或者中断被某个中断屏蔽寄存器给屏蔽掉了,那么在其他的中断处理结束前或者中断屏蔽被清除前,挂起请求会一直保持。

在传统 ARM 处理器中,如果外设产生了中断,那么它们得到处理前必须一直保持中断请求信号。

当中断开始处理中断请求时,中断的请求信号会被自动清除。当中断正在被处理时,它就会处于活跃状态。

5.png

当中断处于活跃状态时,处理器无法再中断完成和异常返回前再次处理同一个中断请求。

中断的挂起状态位于中断挂起状态寄存器中,软件可以复位这些寄存器。因此,可以手动清除或者设置中断的挂起状态。若中断请求产生时处理器正在处理另一个具有更高优先级的中断,而在处理器对该中断请求做出响应之前,挂起状态被清除掉了,则该中断会被取消且不会再得到处理。

6.png

若持续保持某个中断请求,那么及时软件尝试清除该挂起状态,挂起状态还是会再次被置位的。

7.png

若中断已经得到了处理,中断源仍然在继续保持中断请求,那么这个中断就会再一次进入挂起状态且再次得到处理

8.png

对于脉冲中断请求,若在处理器开始处理前,中断请求信号产生了多次,他们会被当做一次中断请求处理

9.png

中断挂起状态可以在其正在被处理时再次置位。之前的中断请求正在被处理时产生了新的请求,这样机会引发新的挂起状态。处理器在前一个 ISR 结束后需要再次处理这个中断。

10.png

即使中断被禁止了,他的挂起状态仍然可置位。 这种情况下,若中断稍后被使能了,它仍然可以被触发并被得到处理。这种情况可能不是我们需要的,因此需要在使能 NVIC 中断前手动清除挂起状态。

总结

NVIC 中对于每个中断需要设置 抢占优先级 和 响应优先级(又称子优先级)。多个中断会先比较 抢占优先级,抢占优先级相同的比较响应优先级。高抢占优先级能够打断低抢占优先级的,但是相同抢占优先级的高响应优先级不能打断低响应优先级。

  1. 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。

  2. 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。

  3. 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。

  4. 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。

参考

  1. The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors, 3rd Edition

  2. The Definitive Guide to the Cortex-M0

————————————————

版权声明:本文为CSDN博主「ZC·Shou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6809

    浏览量

    147636
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16016

    浏览量

    343613
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41023
  • Cortex-M
    +关注

    关注

    2

    文章

    224

    浏览量

    29574
收藏 人收藏

    评论

    相关推荐

    【技术分享】分解ARM Cortex-M系列优先级设置问题

    仍然是以我们最熟悉的Cortex-M系列为例,而M系列我就说说Freescale目前两大当家的——M0+和M4的优先级设置问题。我们知道AR
    发表于 01-19 14:22

    飞思卡尔 Kinetis L系列M0+/M4中断优先级设置问题

    核心通过一张中断向量表来控制系统中断功能,NVIC可以提供以下几个功能:1)可嵌套中断支持;2)向量中断
    发表于 01-28 14:48

    Cortex-M内核来详细讲讲中断优先级嵌套

    应用设计的,没有独立MCU。异常类型  Cortex-M 处理器的异常中,编号 1~15 的为系统异常,16及以上的则为
    发表于 08-27 17:40

    浅析stm32的中断嵌套优先级

    stm32的中断嵌套优先级stm32NVIC优先级分组中断优先级配置寄存器NVIC_IPRx描述
    发表于 08-13 09:45

    STM32(Cortex-M3)中的优先级概念

    一、中断优先级:STM32(Cortex-M3)中的优先级概念STM32(Cortex-M3)中有两个
    发表于 08-16 07:21

    STM32中断优先级和开关总中断

    STM32中断优先级和开关总中断一,中断优先级:STM32(Cortex-M3)中的
    发表于 08-16 07:05

    STM32中断优先级和开关总中断

    STM32中断优先级和开关总中断一,中断优先级:STM32(Cortex-M3)中的
    发表于 08-23 07:06

    如何正确设置中断优先级

    优先级范围从0x00~0xFF), 是绝大多数微控制器制造商只是使用其中的一部分优先级NXP 1062 使用了其中的高4bits,所以中断优先级在0-15,共16个在
    发表于 12-16 07:08

    NVIC中断优先级分组

    1 NVIC中断优先级分组1.1NVIC的中断向量表Cortex-M3和CM4内核都支持256个中断
    发表于 01-25 07:19

    Cortex-M及STM32中断笔记相关资料推荐

    6.Cortex-M系列中断(1)Coretx-M内核都具有NVCI(嵌套向量中断控制器)①
    发表于 01-25 07:32

    ARM Cortex-M中断资料详解

    1、中断异常Cortex 内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为
    发表于 05-05 17:39

    Cortex-M及STM32中断笔记

    6.Cortex-M系列中断(1)Coretx-M内核都具有NVCI(嵌套向量中断控制器)①中断
    发表于 12-01 12:36 9次下载
    <b class='flag-5'>Cortex-M</b>及STM32<b class='flag-5'>中断</b>笔记

    STM32笔记之中断优先级和开关总中断

    STM32中断优先级和开关总中断一,中断优先级:STM32(Cortex-M3)中的
    发表于 01-14 15:24 12次下载
    STM32笔记之<b class='flag-5'>中断</b><b class='flag-5'>优先级</b>和开关总<b class='flag-5'>中断</b>

    Cortex-M中断及FreeRTOS中断优先级配置原理

    下面就来说说关于Cortex-M中断,及FreeRTOS中断优先级配置原理。
    发表于 02-08 15:30 3次下载
    <b class='flag-5'>Cortex-M</b><b class='flag-5'>中断</b>及FreeRTOS<b class='flag-5'>中断</b><b class='flag-5'>优先级</b>配置原理

    Cortex-M内核中断/异常系统中断优先级/嵌套详解

    最近在使用 STM32F3 芯片的时候,遇到这样一个问题:如果外部中断来的频率足够快,上一个中断没有处理完成,新来的中断如何处理?
    的头像 发表于 01-13 09:09 1615次阅读