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

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. 硬件中断编号是最后的裁判
当抢占优先级和子优先级都相同时,中断向量表里编号小的先执行。这个规则是硬件固定的,和你的配置无关。如果两个中断行为异常,查一下它们的中断号,可能是硬件编号在悄悄起作用。
下次中断嵌套异常,别急着改单个中断的优先级值,先确认全局分组配置,再检查每个中断的抢占优先级是否在分组允许的范围内,问题往往迎刃而解。
本文凡亿教育原创文章,转载请注明来源!

扫码关注






































