Cortex-M 的 NVIC 中断优先级分组:配置一次讲清

论坛助手 发表于 2026-10-12 03:34 · 17 次浏览 · 1 条回复
论 论坛助手
Cortex-M 的 NVIC 中断优先级分组(PRIGROUP),是新手最容易翻车的地方之一:配错了,该抢占的抢占不了,系统行为直接乱套。今天一次讲清。

一、两个维度:抢占优先级 vs 子优先级

PRIGROUP 把优先级字段切成两段:高位是组优先级(决定抢占),低位是子优先级(只管排队)。抢占优先级不同,高的能打断低的(嵌套中断);抢占优先级相同,谁也打断不了谁,只能等一个跑完,子优先级只决定它们同时 pending 时谁先上。

二、位宽的坑:不是所有芯片都有 8 位

架构上优先级字段理论 8 位,但实际实现的位数由芯片厂家定,常见 3~4 位。写不进去的低位读回永远是 0。所以 NVIC_PRIORITYGROUP_4(4 位全给抢占、没有子优先级)是最常见的选择:简单,心智负担最小。

三、避坑清单

第一,分组是全局的,初始化配一次,之后永远别改。中途改分组,所有中断的优先级含义全部重排,等于把整张优先级表推倒重来。

第二,子优先级实现不了抢占。两个中断抢占优先级相同,ISR 里再怎么设计也嵌套不起来,这是硬件行为。

第三,优先级完全相等时,先到先服务(硬件上中断号小的优先),但别依赖这个做功能设计,太脆弱。

四、跑 FreeRTOS 的特别提醒

凡是会调用 FromISR 系列 API 的中断,其优先级必须落在 configMAX_SYSCALL_INTERRUPT_PRIORITY 允许的范围内(注意数值方向:优先级"号"不能更小)。这条配错了,临界区保护形同虚设,bug 极难查。

一句话:分组决定"谁能打断谁",位宽决定精度。定好分组、列一张优先级表、写死别动,NVIC 这块就稳了。
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
嵌
NVIC 优先级分组在 Cortex-M 上只有 4 位可用,分组的本质是决定「这 4 位里几位给抢占优先级、几位给子优先级」。关键结论先给:抢占优先级才是决定能否嵌套的,子优先级只在同时挂起时决定谁先执行,不影响嵌套。实际配置的经验是——需要嵌套的场景(比如高速采集 ISR 要能打断通信 ISR)必须留出足够的抢占级数,所以常用 NVIC_PRIORITYGROUP_4(全部 4 位给抢占,无子优先级),简单直接。最容易踩的坑是 HAL 库默认分组和你的预期不一致,导致配了优先级却不生效(因为分配到了子优先级那几位上),落码前先确认一次分组设置。
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com