短文标题:NVIC:中断的“裁判员”,谁优先级高谁先执行
你有没有想过一个问题:USART1和TIM2中断同时发生,CPU先处理哪个?NVIC说了算。NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)是Cortex-M内核内置的中断管理器。NVIC的核心职责
- 接收所有外设的中断请求(IRQ)
- 比较优先级,决定先响应哪个
- 管理中断嵌套(高优先级打断低优先级)
- 提供硬件向量机制:硬件自动从向量表取中断服务函数地址,无需软件判断中断源
优先级配置,每个中断可以配置两个优先级,由分组决定4个bit如何分配:
- 抢占优先级(数值越小越高):决定能不能打断别人
- 子优先级(数值越小越高):抢占相同时,决定谁先执行,但不能互相打断
抢占优先级不同的中断可以嵌套,抢占相同的只能排队。优先级数值范围:0(最高)~ 15(最低),由优先级分组(PRIGROUP)决定抢占和子优先的位数分配。
中断向量表与硬件向量 ,中断向量表存放在Flash起始地址(0x08000000),每个中断对应一个函数指针(中断服务函数地址)。中断发生时,NVIC硬件自动:
- 压栈现场(8个寄存器)
- 从向量表取ISR地址
- 跳转执行
不需要软件查中断标志,硬件直达,响应快。
嵌套管理,高抢占优先级中断可以打断低抢占优先级中断的执行,形成中断嵌套。执行顺序:低优先级ISR执行中,高优先级到来 → 低优先级被暂停 → 高优先级执行 → 恢复低优先级。高优先级中断应短小精悍,避免“饿死”低优先级中断。
尾链优化(Tail-Chaining),中断A未退出,中断B已挂起。传统架构:出栈A → 压栈B → 执行B。Cortex-M尾链:跳过A的出栈和B的压栈,直接执行B。连续中断响应时间降至6个时钟周期。
这个故事的启示,NVIC不是“外设”,是Cortex-M内核的一部分。中断优先级不是摆设,是系统的“交通规则”。设对了,系统稳;设错了,中断堵死,系统崩。写在最后,中断配置是系统工程,看需求:哪些要打断(高抢占)?哪些要排队(同抢占)?抢占决定打断,子优先决定顺序。
(本文灵感源于于振南《新概念ARM32单片机》教程第5.4节“ARM32中断控制器原理”。)
觉得有用?点赞、转发,让更多人看懂NVIC的“裁判”逻辑。