0
收藏
微博
微信
复制链接

高优先级中断被低优先级打断?问题出在优先级分组上

2026-06-27 09:42
74

中断嵌套是嵌入式系统的基本功,可不少人配置完NVIC后发现,明明设了高抢占优先级,却还是被低优先级中断打断。排查一圈代码,使能位、中断通道都没问题,最后发现根源在优先级分组这个全局配置上。

64.png

1. 优先级分组只配一次,配错全局乱

NVIC_PriorityGroupConfig这个函数在整个工程里只能调用一次。它决定了4位优先级寄存器里,几位分给抢占优先级,几位分给子优先级。如果你在多个文件里重复调用了不同分组,最后一次调用会覆盖前面的配置,导致之前分配好的抢占优先级位数全部错位。

2. 抢占优先级位数不够用

假设你选了Group2,抢占优先级只有2位,范围是0到3。如果你给某个中断设了抢占优先级5,寄存器里实际只取了低2位,5的二进制是101,截断后变成01,也就是1。你以为给了5,实际生效的是1,自然被抢占优先级0的中断打断。

3. 子优先级不能嵌套

这是最容易混淆的概念。子优先级只在抢占优先级相同的中断之间起作用,决定谁先排队。它不支持嵌套。两个中断如果抢占优先级一样,哪怕子优先级不同,谁先触发谁先执行,后到的必须等前一个跑完。把子优先级当成嵌套能力来用,结果必然是“高优先级”被打断。

4. 数值越小优先级越高

STM32的优先级规则是数字越小优先级越高。抢占优先级0高于1,子优先级0高于1。这个逻辑和有些RTOS的任务优先级相反,混用两种思维容易把高低配反。

5. 硬件中断编号是最后的裁判

当抢占优先级和子优先级都相同时,中断向量表里编号小的先执行。这个规则是硬件固定的,和你的配置无关。如果两个中断行为异常,查一下它们的中断号,可能是硬件编号在悄悄起作用。

下次中断嵌套异常,别急着改单个中断的优先级值,先确认全局分组配置,再检查每个中断的抢占优先级是否在分组允许的范围内,问题往往迎刃而解。


本文凡亿教育原创文章,转载请注明来源!

登录后查看更多
0
评论 0
收藏
侵权举报
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。

热门评论0

相关文章

电子芯期天

本平台致力于分享各种电子电路开发设计资料及经验。

开班信息