跳转至

NVIC中断优先级配置与嵌套中断设计

难度:🟡 中级 | 领域:MCU 实时内核 | 关键词:NVIC, 抢占, BASEPRI | 阅读时间:约 16 分钟

日常类比

医院分诊:抢救可以打断普通问诊(抢占优先级),同级则先来先服务或看次级规则(子优先级)。嵌套向量中断控制器(Nested Vectored Interrupt Controller, NVIC)就是 Cortex-M 的分诊台;配错优先级,轻则抖动,重则死锁[1][2]。

摘要

说明抢占/子优先级分组、尾链与晚到到达、临界区(PRIMASK/BASEPRI)及与 FreeRTOS 的中断级 API 边界。具体优先位数依 MCU 实现,以技术参考手册为准[1][4]。

1. 分组与嵌套

概念 含义
抢占优先级 可打断较低抢占级 ISR
子优先级 同抢占级挂起时的裁决
优先级数值 Cortex-M 上通常数值越小优先级越高
机制 作用
Tail-chaining 连续 ISR 少弹栈
Late-arriving 更高优先级刚到可插队
BASEPRI 屏蔽不高于某水平的可屏蔽中断

ISR 应短:置标志、送队列、踢 DMA;重活放线程。不要在 ISR 里盲目 printf[2][5]。

2. RTOS 与临界区

做法 适用
关总中断 PRIMASK 极短临界区
BASEPRI 提到 syscall 阈值 与 RTOS 共存的推荐方式
FromISR API 仅在中断中调用

FreeRTOS 要求内核可屏蔽中断不得高于 configMAX_SYSCALL_INTERRUPT_PRIORITY 所允许范围,否则 FromISR 调用会损坏内核[3]。

3. 局限、挑战与可改进方向

1. 优先级位数误解

局限:以为 8 位全可用,实际 MCU 只实现高几位。 改进:读 TRM;用 CMSIS NVIC_EncodePriority[1][4]。

2. 长时间关中断

局限:抖动与丢采样。 改进:缩短临界区;锁无关数据用无锁结构[5]。

3. ISR 过重

局限:嵌套风暴、栈溢出。 改进:半中断处理;提高采样用 DMA[2]。

4. 与 RTOS 优先级冲突

局限:高优先级 ISR 调用了线程专用 API。 改进:静态检查优先级表;统一中断分级文档[3]。

总结

先定哪些中断可抢占调度器,再分配外设优先级;ISR 短、临界区短、API 分对上下文。用示波器或 GPIO 翻转测量最坏中断延迟,而不是只看理论时钟周期。

参考文献

[1] ARM, Cortex-M4 Devices Generic User Guide. [2] J. Yiu, The Definitive Guide to ARM Cortex-M3/M4 Processors. [3] FreeRTOS, Interrupt Management 文档. [4] STMicroelectronics, PM0214 等编程手册. [5] J. Ganssle, 嵌入式中断与实时性相关论述. [6] ARM, Architecture Reference Manual(优先级与故障异常). [7] CMSIS Core NVIC API 文档. [8] Zephyr/RTOS 中断锁定最佳实践. [9] 最坏执行时间(WCET)与中断负载分析文献. [10] STM32 HAL HAL_NVIC_SetPriority 使用注意应用笔记. [11] 尾链与比特带等 Cortex-M 优化说明(ARM 文档). [12] MISRA/安全关键系统对中断的约束指南(若涉功能安全).