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

发布者:WhisperingWaves最新更新时间:2020-04-23 来源: eefocus关键字:ARM  Cortex-M  内核中断  异常系统  中断优先级  嵌套 手机看文章 扫描二维码
随时随地手机看文章

问题

最近在使用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

针对 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

关键字:ARM  Cortex-M  内核中断  异常系统  中断优先级  嵌套 引用地址:ARM 之六 Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解

上一篇:STM32CubeMX的学习笔记【1】——初次尝试建立工程
下一篇:ARM异常和中断

推荐阅读最新更新时间:2024-11-06 12:04

Tiny4412友善之臂ARM开发板静态IP设置(重启有效)
刚入手Tiny4412开发板,发现它的ip地址不是192.168.1.230,老是自动跳变,今天是192.168.1.7,明天开机就变成了192.168.1.8,所以就决定将其设为静态ip地址:192.168.1.240。 首先参考网上提供的一个常见的方案: 要修改arm开发板的IP,如果是yaffs2文件,可以 1、首先要修改/etc/init.d/rcS文件,在/sbin/ifconfig lo 127.0.0.0 下添加一行/sbin/ifconfig eth0 192.168.1.20 up 注:192.168.1.20 只是举例,可以改成你想要修改的IP地址 本来这样修改之后就可以的,但是我发现仍然不行,使用ifco
[单片机]
Tiny4412友善之臂<font color='red'>ARM</font>开发板静态IP设置(重启有效)
基于ARM7+μC/OSII的数据采集系统设计
  在一些工业现场中,设备长时间运行容易出现故障,为了监控这些设备,通常利用数据采集装置采集他们运行时的数据并送给PC机,通过运行在PC机上的特定软件对这些数据进行分析,以此判断当前运行设备的状况,进而采取相应措施。当前常用的数据采集装置,在其系统软件设计中,多采用单任务顺序机制。这样就存在系统安全性差的问题。这对于稳定性、实时性要求很高的数据采集装置来说是不允许的,因此有必要引入嵌入式操作系统。笔者以μC/OSII为操作系统平台,基于ARM7系列处理器,对一种高性能的数据采集系统开发进行了探索。    1μC/OSII嵌入式操作系统简介   嵌入式操作系统μC/OSII(microcontroller operatin
[嵌入式]
典型的工业级ARM处理器及应用实例
嵌入式主板领域常见的ARM处理器有飞思卡尔(Freescale)公司的I.MX系列,例如:MX515、MX357、MX287、MX535和MX6X。这些处理器是嵌入式主板的最佳选择,飞思卡尔的I.MX系列处理器的特点在朗锐恒的SOM-3260嵌入式主板上面得到了充分的体现。 SOM-3260采用Cortex-A9架构,主频1GHz,采用工业级 Freescale i.MX6X芯片,支持硬件视频解码,支持安卓,linux系统,24小时稳定运行,超低功耗。可扩展支持WIFI、3G、GPRS、GPS功能。这是一款嵌入式紧凑型工业模块,能够24小时安全运行,而且低功耗、散热效果好;接口也是非常的丰富,可扩展性能极强;能够抵抗恶劣复杂的环境,
[单片机]
ARM裸机之定时器中断
本文开发环境mini2440,实现目标:裸机实现定时器中断使LED0以1秒闪烁。 int.c函数 /* * init.c: 进行一些初始化 */ #include s3c24xx.h void disable_watch_dog(void); void clock_init(void); void memsetup(void); void copy_steppingstone_to_sdram(void); void init_led(void); void timer0_init(void); void init_irq(void); /* * 关闭WATCHDOG,否则CPU会不断重启 */ void disa
[单片机]
ARM处理器学习之GPIO操作篇(gnu link script)
1:主要内容 本文主要介绍了VMA、LMA的相关概念,gnu link script的作用和使用方法。 2:引言 我们程序员刚开始学习编写程序时,都会接触到一个 *.C 文件要经过编译、链接等过程才能变成可以执行的程序。至于这里的链接到底怎么回事,我们今天就来谈谈这方面的内容。现在,我们有这样一套ARM7的硬件开发环境,0X80000000地址开始BANK0 我们用的是NorFlash,0X40000000地址是芯片内部的RAM。我编译、链接的程序下载到0x80000000地址处。而真正运行时,一部分初始化代码在0X80000000运行,初始化完毕后,将主要工作的代码copy到内部RAM 0X40000000开始的地方运
[单片机]
<font color='red'>ARM</font>处理器学习之GPIO操作篇(gnu link script)
基于ARM处理器S3C2440的VGA显示技术
目前很多SOC厂商的微处理器芯片都集成了LCD控制器,如三星公司的S3C2410。S3C2440,Intel的Xscale系列等。大多数嵌入式系统也采用流行的LCD显示技术。但是在需要大屏幕显示、对分辨率要求不高的场合,如车间、厂房,采用大屏幕LCD则成本过高。另一方面,VGA显示技术因为技术发展成熟,成本低廉,仍在被大量使用,直到今天它仍是所有显示终端最为成熟的标准接口。如果让嵌入式处理器直接支持VGA显示器,则能很大地利用现有资源,节约系统成本。 1 基于S3C2440的VGA显示技术分析 通过分析VGA显示技术的时序逻辑与S3C2440内部集成LCD控制器驱动TFT LCD的时序逻辑,找出它们的共同点,分析在S3C24
[单片机]
基于<font color='red'>ARM</font>处理器S3C2440的VGA显示技术
基于ARM的嵌入式网络收音机的设计
  收音机作为接收广播的工具,经过漫长的发展过程,由单波段发展到多波段,由电子管,晶体管发展到集成电路,由机械调谐发展到数字调谐功能等,其技术和品质都有了长足的进步。如今,在收音机这个家族中新的成员也在不断加入,如卫星广播接收机等。当社会进入网络时代后,更是出现了网络收音机这种跨越全球的信息接收设备。但是,目前这种网络收音机大多是通过基于PC机上的软件开发来实现的其功能的,也就是说这种网络收音机不能脱离电脑这种相对比较大的和比较昂贵的设备。   为了克服PC机形式的网络收音机的缺点,本文研究了一种基于ARM的嵌入式技术的网络收音机的设计方案。该方案以ARM处理器及其外围模块作为硬件平台,以嵌入式Linux作为操作系统,以Mp
[单片机]
基于<font color='red'>ARM</font>的嵌入式网络收音机的设计
汽车MCU缺货与保供 芯旺微如何布局车规级MCU
汽车MCU大缺货引发了一个思考,如何保证国产汽车芯片供应链的自主可控。特别是随着汽车向电子化和智能化方向发展,车用MCU作为汽车电子系统内部运算和处理的核心,遍布悬挂、气囊、门控和音响等几十种次系统中,地位愈发重要。以往,该市场多由恩智浦、瑞萨电子、Microchip、英飞凌、ST等国外厂商所占据,国内厂商份额寥寥。 不过,这种局面正在发生改变,国内车用MCU在逐步崛起。其中,就包括芯旺微电子,其凭借十余年的车规芯片研发设计和市场交付经验,已经成功打开了国产MCU上车之门。在2021上海慕尼黑电子展现场,芯旺微电子展台人气爆棚,火爆程度可见一斑。 自主内核 长期以来,MCU领域的国内多数厂商均采用ARM授权的内
[汽车电子]
汽车MCU缺货与保供 芯旺微如何布局车规级MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved