1. 中断机制的本质:从硬件到软件的完整链条
在嵌入式系统中,中断机制就像是一个高效的快递分拣系统。当外设(如定时器、串口)产生事件时,相当于快递网点收到了包裹,这个包裹会被贴上标签(中断请求标志置位)并放入传送带(NVIC中断控制器)。CPU作为分拣中心,会根据包裹的优先级(中断优先级)决定是否立即处理,还是等当前包裹处理完再说。
以STM32的TIM4定时器为例,当计数器溢出时:
- 硬件自动置位TIMx_SR寄存器中的UIF标志位(相当于快递网点接收包裹)
- 如果TIMx_DIER寄存器中的UIE位已使能(相当于开通了该网点的快递服务),则向NVIC发出中断请求
- NVIC检查PRIMASK状态和当前执行优先级,决定是否让CPU响应(分拣中心判断是否接单)
关键细节:即使调用__disable_irq(),TIM4的UIF标志仍会被置位,就像快递网点依然会接收包裹,只是分拣中心暂时不处理新包裹。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. PRIMASK的真实作用:优先级调节器而非中断开关
PRIMASK寄存器更像是一个动态优先级调节器,而非简单的开关。当执行__disable_irq()时:
c复制// CMSIS函数实现
__STATIC_FORCEINLINE void __disable_irq(void)
{
__ASM volatile ("cpsid i" : : : "memory");
}
这段汇编指令将PRIMASK置1,效果相当于把当前执行上下文(包括中断服务程序)的优先级临时提升到0(最高可配置优先级)。此时:
| 状态 | 等效优先级 | 可被哪些中断打断 |
|---|---|---|
| 正常运行时 | -1 | 所有优先级≥0的中断 |
| PRIMASK=1 | 0 | 仅NMI和HardFault等系统异常 |
实验验证:在TIM4中断中调用__disable_irq()后:
- TIM1(优先级1)的中断请求仍会挂起在NVIC->ISPR[0]
- 但由于当前执行优先级等效为0,高于TIM1的优先级1,故不响应
- 退出中断前调用
