ARM Cortex-M4处理器中断禁用时NVIC的处理机制问询
ARM Cortex-M4 全局中断禁用时的NVIC行为
核心结论
当全局中断通过PRIMASK寄存器(CPSID I指令)禁用时,NVIC仍然会正常检测中断请求,并设置对应中断的挂起标志——全局中断禁用只是阻止内核响应中断,并不会中断NVIC对中断事件的捕获和挂起位的置位。
场景分析(以你给出的UART RX ISR为例)
- 进入UART RX的ISR后,执行
CPSID I指令禁用全局中断; - 若此时有另一个中断触发:
- NVIC会立刻检测到该中断请求,只要该中断没有被NVIC的中断屏蔽寄存器(
NVIC_ICER)单独禁用,就会设置它的挂起标志(对应NVIC_ISPR寄存器的位); - 由于全局中断被禁用,内核不会立即处理这个挂起的中断,会继续执行ISR中禁用中断后的代码;
- NVIC会立刻检测到该中断请求,只要该中断没有被NVIC的中断屏蔽寄存器(
- 当执行
CPSIE I重新启用全局中断后:- 内核会马上检查NVIC中是否存在挂起且优先级高于当前执行优先级的中断;
- 如果新中断的优先级高于UART RX ISR的优先级,内核会立即切换到该中断的ISR(嵌套执行);
- 如果优先级低于或等于,该中断会保持挂起状态,直到当前UART RX ISR执行完毕后再被响应。
关键注意点
- 全局中断禁用(
PRIMASK控制)和NVIC的中断屏蔽(NVIC_ICER控制)是两个独立的层级:NVIC_ICER是在NVIC层面直接屏蔽中断,不会触发挂起位;而PRIMASK只是阻止内核响应中断,完全不影响NVIC对中断事件的捕获和挂起位的置位。 - 这种设计确保了即使在全局中断禁用期间发生的中断事件也不会丢失,只要后续启用全局中断,对应的中断会被正确处理。
内容的提问来源于stack exchange,提问作者Chandan Gupta
相关产品推荐
相关产品推荐

