历史上的今天
返回首页

历史上的今天

今天是:2025年04月23日(星期三)

正在发生

2020年04月23日 | ARM 之六 Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解

2020-04-23 来源:eefocus

问题

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


简介

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



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

异常

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。

Cortex-M

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


异常类型

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

image.png?imageView2/2/w/550

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

CMSIS-Core


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


中断处理(异常处理)

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


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

中断执行

中断管理

管理中断所使用的大部分寄存器都位于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 就可以处理脉冲中断请求了。

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


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

挂起

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


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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述


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


参考

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

The Definitive Guide to the Cortex-M0

推荐阅读

史海拾趣

杰力(EMC)公司的发展小趣事

杰力(EMC)公司成立于XXXX年,由一群具有丰富电子行业经验的专业人士创立。公司初期专注于功率组件和集成电路(IC)的设计与开发,以满足不断增长的电子市场需求。通过引进先进的生产设备和工艺,杰力迅速建立起一条高效的生产线,并开始为一些小型电子厂商提供定制化的产品。随着产品质量的不断提升和客户口碑的积累,杰力逐渐在市场中树立了良好的品牌形象。

Electro-Mech Components Inc公司的发展小趣事

在1966年,Electro-Mech Components, Inc. (EMC)做出了一个重要的战略决策——在墨西哥北下加利福尼亚州的蒂华纳开设一家制造工厂。这个决定标志着EMC正式进军国际市场,并开始了其在全球范围内的业务布局。蒂华纳工厂的建立为EMC带来了更低的制造成本和更广阔的市场前景。随着工厂规模的逐渐扩大,EMC的产品线也日益丰富,从最初的发光按钮开关逐渐扩展到指示灯和多开关互锁组件等多个领域。

DBS Microwave Inc公司的发展小趣事

DBS Microwave始终将产品质量放在首位。公司建立了一套严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格的质量控制。此外,公司还注重员工的培训和技能提升,确保每一位员工都能够熟练掌握生产技能和质量要求。这些措施使得DBS Microwave的产品质量得到了客户的高度认可。

Graseby Infrared公司的发展小趣事
按下正转启动按钮(如SB1),接触器KM1的线圈得电,KM1主触头闭合,电动机按L1-L2-L3的相序接通电源,实现正转。同时,KM1的常开辅助触头闭合自锁,保持电动机持续运转。
GeneSiC Semiconductor公司的发展小趣事
定期检查控制线路和接触器的触头是否磨损或松动,及时更换损坏的部件。
Directed Energy Inc公司的发展小趣事

为了进一步扩大市场份额,Directed Energy Inc积极寻求与全球范围内的合作伙伴建立合作关系。通过与知名电子产品制造商、分销商和解决方案提供商的合作,公司成功将其产品推向了全球各地。这些合作伙伴不仅为Directed Energy Inc带来了更多的商业机会,还帮助公司更好地了解不同市场的需求和趋势,从而不断调整和优化产品策略。

问答坊 | AI 解惑

教你路由器里的花生壳动态DDNS设置,实现真正的远程监控,远程访问!

1  买个带动态DDNS的路由器,支持“花生壳DDNS”或“其他免费的服务商” 2  去“http://www.oray.net/passport/register.php”(我这拿花生壳来做实例) 3  再去“http://www.oray.cn/peanuthull/”下载花生壳软件 ...…

查看全部问答>

数显实验电源的制作

数显实验电源的制作 电子爱好者在电子制作中使用频率最高的仪器应该要属稳压电源。一台性能可靠,方便实用的实验电源可以给我们的业余制作带来很大的方便。出于此目的,这里介绍一下笔者此次自制电源的一些经过。为免除寻找元器件和制作的 ...…

查看全部问答>

怎么下载程序到单片机

如题 最少需要哪些元件,下载线吗,怎么连接到单片机引脚和电脑串口上呢 下载线是不是就可以当成单片机与电脑串口相连的工具,只要接上去双方就可以互相通信了?? 下载程序需要的软件又有哪些呢 这些东西又该怎么连接呢 ARM之类的芯片又是怎 ...…

查看全部问答>

相机接口的中断产生,必须要有视频源吗?也就是必须有VSYNC/HSYNC/PCLK这些信号输入。如果没有是不是就不会产生中断?看DataSheet感觉是!

相机接口的中断产生,必须要有视频源吗?也就是必须有VSYNC/HSYNC/PCLK这些信号输入。如果没有是不是就不会产生中断?看DataSheet感觉是!…

查看全部问答>

WINCE5.0,U盘上电之前插上,系统不识别,上电之后,再插上能够正常识别

环境:S3C2440+WINCE5.0 如题,上电之前,把U盘插在S3C2440板上,进入系统只有不能识别U盘,但是上电之后将没有识别的U盘拔下,重新插上,系统立即识别,我感觉应该是驱动的问题,可能在初始化的时候未做检测....不知道有谁碰到过同样的问题.大家说说,准备 ...…

查看全部问答>

求助基于ucos下的串行口驱动程序问题

小弟我最近在写ucos下的串行口驱动程序,要实现接受和发送数据的功能,用的开发环境是IAR。在网上找了很久,只有找到MDK的,贵宝地有没有做过类似项目的大侠啊!另外,这个项目需要移植到LPC2368上,不知道在移植中要注意哪些地方,数据手册中需要 ...…

查看全部问答>

问一个关于数据库制作的问题

我现在有一个mdb格式的数据库,内容是人名,地址等个人信息大约有20多万人的资料想做一个用于pda上的软件,通过输入人名显示此人信息。   本人对编程一点也不了解,请问该怎样做,或者有那位高手可以帮忙制作,本人可以提供一定报酬,请 ...…

查看全部问答>

VERILOG遥控器接收代码

遥控器接收 verilog模块,9ms高电平 + 4.5ms低电平 + 2个用户码 + 键码 + 键反码…

查看全部问答>

硬件实现电源关断

最近做一个项目时,要求电源电压低于10V是,不再为系统供电,此时可以用被用电池供电,现在使用的是比较器进行电压比较,实现电源关断,但是效果不理想,不知道大家有没有其他方法?…

查看全部问答>

求液晶屏FPC8533U-V0-A的接口定义!

大家好,请问哪位知道该液晶屏的接口定义呢? 液晶屏上标着:FPC8533U-V0-A 从朋友那里拿的,他也不知道这个的定义,这个接口是40PIN的,4.3寸,我上网搜了一下,跟网上说的通用液晶屏很像,但是没有规格书。。。 请问哪位有这个规格书,谢谢!…

查看全部问答>