在 FreeRTOS 中,ISR 里必须用 xQueueSendFromISR(或 xQueueSendToBackFromISR),不能调用阻塞版 xQueueSend。关键边界条件:1) 中断优先级必须低于 configMAX_SYSCALL_INTERRUPT_PRIORITY(Cortex-M 上数值越大优先级越低),否则会触发 configASSERT 或破坏内核临界区;2) 必须传入 pxHigherPriorityTaskWoken 变量,并在 ISR 退出前根据其值调用 portYIELD_FROM_ISR(),否则被唤醒的高优先级任务要等下一个 tick 才运行;3) 队列满时函数立即返回 errQUEUE_FULL,不会阻塞,需自行处理丢包或计数;4) 不要在 ISR 中做耗时操作,发送的数据最好用值传递或指向静态/全局缓冲区。实测延迟方面,在 STM32F407 @168MHz 上,空队列发送约 1.2~2.5us,队列满返回约 0.8us,加上 portYIELD_FROM_ISR 的上下文切换约 3~6us。建议用 GPIO 翻转+示波器测量,并注意编译器优化等级和中断嵌套对结果的影响。
mcuku 阿沐 · 2026-10-09