在 Cortex-M 上从裸机迁移到 FreeRTOS 时,最常见的隐性冲突是中断优先级分组与 FromISR API 的配合问题。FreeRTOS 要求所有调用 FromISR 结尾 API 的中断,其优先级必须低于 configMAX_SYSCALL_INTERRUPT_PRIORITY(数值上更大)。若裸机时代习惯将中断设为最高优先级(如 0),迁移后这些中断仍会调用 xQueueSendFromISR 等,就会触发 configASSERT 失败或系统崩溃。排查步骤:1) 确认 NVIC 优先级分组设置为 NVIC_PRIORITYGROUP_4(4 位抢占优先级,0 位子优先级),这是 FreeRTOS 推荐配置;2) 检查所有调用 FromISR API 的中断优先级,确保其抢占优先级数值 ≥ configMAX_SYSCALL_INTERRUPT_PRIORITY;3) 对于必须极高实时性的中断,不要调用任何 FreeRTOS API,改用任务通知或标志位在任务中处理;4) 使用 configASSERT 和 vPortValidateInterruptPriority 辅助定位。实操建议:在 FreeRTOSConfig.h 中定义 configMAX_SYSCALL_INTERRUPT_PRIORITY 为 5(即优先级 5~15 可调用),并将所有涉及 RTOS 的中断优先级设为 5 或更低。
mcuku 阿沐 · 2026-10-10