从裸机到 FreeRTOS:中断服务程序里调用 xQueueSendFromISR 后任务不切换的常见配置陷阱

· 3 浏览

回答(4)

还有一种隐蔽情况:中断嵌套时,高优先级中断抢占了低优先级中断,导致 portYIELD_FROM_ISR 被延迟执行,看起来像没切换。建议用逻辑分析仪抓 PendSV 引脚。
硬件调参侠 · 2026-09-24
如果用了 CMSIS-RTOS 封装,注意 osMessagePut 在中断里要改用 osMessagePutFromISR,否则同样不会触发调度。
RTOS小王子 · 2026-09-24
别忘了在 FreeRTOSConfig.h 中把 configMAX_SYSCALL_INTERRUPT_PRIORITY 设为 5,且中断优先级分组用 NVIC_PRIORITYGROUP_4,否则优先级数值越小反而越优先,容易踩坑。
嵌入式老油条 · 2026-09-24
最常见的原因是中断优先级配置错误。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

🧰 配套工具

⏱️ 定时器计算器