当前位置: 首页 > news >正文

深入理解 Cortex-M 的中断输入和挂起行为

对于 Cortex-M3/M4 处理器来说,每个中断都有多个属性:

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

  • 每个中断都可被挂起(有一个中断请求等待被处理)或解除挂起。

  • 每个中断都可处于激活(正在处理)或非激活状态。

为了支持这些属性,NVIC 中包含了多个可编程寄存器,其中包括中断使能控制、挂起状态和只读活跃状态位。

这些状态属性具有多种可能的组合。例如,在处理中断时(激活状态),可以将其禁止,若在中断退出前产生了同一个中断的新请求,由于该中断被禁止了,它就会处于挂起状态。若满足以下条件,中断请求可被处理器接受:

  • 挂起状态置位

  • 中断使能

  • 中断优先级比当前等级高(包括中断屏蔽寄存器)

NVIC 在设计上既支持产生脉冲中断请求的外设,也支持产生高电平中断请求的外设。实际编程时无须配置任何一个 NVIC 寄存器以选择其中一种中断类型。对于脉冲中断请求,脉冲宽度至少要为一个时钟周期。而对于电平触发的请求,中断请求会一直认为是有效,直到在 ISR 中的操作清除请求(如写入寄存器以清除中断请求)。尽管外部中断请求在 I/O 引脚上的电平可能是低有效,对于 NVIC 收到的信号来说仍然是高有效(内部会做转换)。

中断的挂起状态被存储在 NVIC 的可编程寄存器中,当 NVIC 的中断输入被确认后,它就会触发该中断的挂起状态。即便中断请求失效,挂起状态仍然有效,这样使得 NVIC 可以处理脉冲中断请求。

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

这一点和传统的 ARM 处理器不同。按照之前的方式,若设备产生了中断,如中断请求(IRQ)/ 快速中断请求(FIQ),那么在它们得到处理前需要一直保持请求信号。目前,由于 NVIC 中的挂起请求寄存器保持中断请求,即使请求中断的源设备取消了请求信号,已产生的中断仍会被处理。

当处理器开始处理中断请求时,中断的请求信号会被自动清除,如下图所示:

图片

当中断正在被处理时,它就会处于活跃状态。注意在中断入口处,多个寄存器会被自动压入栈中,这也被称为压栈。同时,ISR 的起始地址会被从向量表中取出。

对于多数微控制器的设计,外设会产生电平触发的中断,因此 ISR 必须手动清除中断请求,如写特定值到外设的某个寄存器中。在中断服务完成后,处理器会执行异常返回。之前自动压栈的寄存器会被恢复出来,而且被中断的程序也会继续执行,中断活跃状态会被自动清除。

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

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

图片

若外设持续保持某个中断请求,那么即使软件尝试清除该挂起状态,挂起状态还是会再次置位,如下图所示:

图片

若在得到处理后,中断源仍在继续保持中断请求,那么这个中断就会再次进入挂起状态且再次得到处理,如下图所示:

图片

对于脉冲中断请求,若在处理器开始处理前,中断信号产生了多次,它们会被当作一次中断请求,如下图所示:

图片

中断的挂起状态可以在其正在被处理时再次置位。即在之前的中断请求正被处理时产生了新的请求,就会触发新的挂起状态,此时在处理器处理完前一个 ISR 后会再次进入这个 ISR:

图片

需要注意的是,即使中断被禁止了,它的挂起状态位仍然是可以置位的。在这种情况下,若中断稍后被使能了,它依然可以被触发并得到服务。有些时候,这种情况并不是我们所希望的,因此需要在使能 NVIC 中的中断前手动清除挂起状态。

一般来说,NMI 的请求方式和中断类似。若当前没有在运行 NMI 处理,或者处理器被暂停或处于锁定状态,由于 NMI 具有最高优先级且不能被禁止,因此一旦触发它几乎会立即执行。

相关文章:

  • 网络爬虫学习之httpx的使用
  • 增强 HTNN 服务网格功能:基于 Istio 的BasicAuth 与 ACL 插件开发实战
  • 【js】JavaScript的变量提升、函数声明提升
  • 知识图谱系列(2):知识图谱的技术架构与组成要素
  • 【补充笔记】修复“NameError: name ‘ZhNormalizer‘ is not defined”的直接方法
  • Kafka如何实现高性能
  • Unity碰撞检测:射线与胶囊体投射/Layer(层)、LayerMask(遮罩层)
  • Unity3D开发AI桌面精灵/宠物系列 【六】 人物模型 语音口型同步 LipSync 、梅尔频谱MFCC技术、支持中英文自定义编辑- 基于 C# 语言开发
  • Linux云计算训练营笔记day08(MySQL数据库)
  • 【上位机——WPF】Window标签常用属性
  • 【学习心得】2025年Docker Desktop安装记录
  • 阿里云ECS部署Dify
  • 阿里云CMH镜像迁移与SMC整机迁移对比及功能详解(同地域跨主体账号场景)
  • 配置VScodePython环境Python was not found;
  • 「Java EE开发指南」如何使用MyEclipse的可视化JSF编辑器设计JSP?(二)
  • PC:使用WinSCP密钥文件连接sftp服务器
  • ANTsPy:医学影像处理python库
  • Java集合详解:LinkedBlockingQueue
  • 26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述
  • Window下Jmeter多机压测方法
  • 联合国报告:全球经济前景恶化,面临高度不确定性
  • 选址江南制造总局旧址,上海工业博物馆建设有新进展
  • 严打金融黑灰产,今年来上海警方破获各类经济犯罪案件690余起
  • 美叙领导人25年来首次会面探索关系正常化,特朗普下令解除对叙经济制裁
  • 京东回应外卖系统崩溃:订单暴涨所致,已恢复
  • 上海国际电影节纪录片单元,还世界真实色彩