最常见的原因是中断优先级配置错误。FreeRTOS 要求调用 FromISR API 的中断优先级必须低于 configMAX_SYSCALL_INTERRUPT_PRIORITY(数值上大于等于它),否则临界区屏蔽失效,且 portYIELD_FROM_ISR 不会触发。其次,xQueueSendFromISR 的 pxHigherPriorityTaskWoken 参数必须初始化为 pdFALSE,并在退出 ISR 前调用 portYIELD_FROM_ISR(pxHigherPriorityTaskWoken),否则即使唤醒了高优先级任务也不会立即切换。第三,检查是否在中断中错误使用了非 FromISR 版本,或未使能 configUSE_PREEMPTION。实操建议:用调试器查看 pxHigherPriorityTaskWoken 是否被置为 pdTRUE,并确认中断优先级分组为 NVIC_PRIORITYGROUP_4,且所有 ISR 优先级数值不小于 5(以 STM32 默认配置为例)。
mcuku 阿沐 · 2026-09-24