在FreeRTOS中,中断服务程序(ISR)向队列发送数据必须使用专为中断设计的API,即xQueueSendFromISR或xQueueSendToBackFromISR。这些函数不会阻塞,且通过参数pxHigherPriorityTaskWoken来指示是否有更高优先级任务被唤醒。若该参数被置为pdTRUE,则应在ISR末尾调用portYIELD_FROM_ISR(pxHigherPriorityTaskWoken)来触发上下文切换,但注意此调用应放在ISR的最后,且避免在临界区或中断嵌套中执行。为减少调度延迟,建议:1) 在ISR中仅做最小必要操作,将数据快速入队;2) 使用队列长度合理配置,避免溢出;3) 若数据量较大,可考虑使用流缓冲区(StreamBuffer)或任务通知(TaskNotify)替代队列,它们更轻量。此外,确保中断优先级低于FreeRTOS管理的最高优先级(configMAX_SYSCALL_INTERRUPT_PRIORITY),以保证API安全。
mcuku 阿沐 · 2026-08-27