FY EDU / INTERVIEW SERIES / STM32 / NVIC
STM32面试:抢占优先级和子优先级有什么区别?中断为什么会嵌套?
面试官问NVIC,往往不是想听你背寄存器名称,而是想确认你能否解释:为什么某个中断能打断另一个中断,另一个却只能排队。
STM32中断优先级数字越大越高吗?抢占优先级和子优先级分别控制什么?
参考回答
对Cortex-M常见的NVIC优先级编码来说,数值越小,逻辑优先级越高。抢占优先级决定一个中断能否打断当前正在执行的较低抢占优先级中断;子优先级用于在抢占优先级相同、多个中断同时待处理时决定先响应谁,本身不产生抢占。实际可配置位数和分组方式取决于MCU型号与内核实现,不能把某个系列的优先级位数套用到全部STM32。
01用一个现场例子说明
假设串口中断抢占优先级为2,定时器中断为1,那么定时器中断可以抢占正在运行的串口中断。
如果两个中断抢占优先级相同,即使子优先级不同,也不能相互抢占;当它们都处于待处理状态时,子优先级才参与排序。
在很多STM32系列中,优先级寄存器只实现了高位的若干位;分组决定这些有效位如何分配给抢占优先级和子优先级。
02配置与调试顺序
先查参考手册和CMSIS头文件确认可实现的优先级位数,再在CubeMX或代码中统一设置优先级分组。
通过HAL_NVIC_SetPriority和HAL_NVIC_EnableIRQ等接口配置后,确认外设自身的中断使能位也已打开。
如果使用FreeRTOS,调用可在ISR中使用的RTOS API时,还要遵守configMAX_SYSCALL_INTERRUPT_PRIORITY等限制。
03为什么中断会出现延迟
中断可能被全局屏蔽、被更高优先级中断占用,或者处理函数本身执行过长。
调试时可在中断入口和出口翻转GPIO,用逻辑分析仪测量延迟和执行时间,结合NVIC Pending/Active状态排查。
说“优先级数字越大越高”,或者认为子优先级更高的中断可以直接打断同抢占优先级的中断。
串口接收偶尔丢字节,是否应该把串口中断一律设为最高优先级?为什么?
常见追问 FAQ
两个中断抢占优先级一样会嵌套吗?
不会因为子优先级不同而发生抢占;先后处理顺序由待处理状态、子优先级和异常编号等规则共同决定。
相关业务入口
电子设计岗位学习与实战课程

扫码关注































