在FreeRTOS中,ISR里必须用xQueueSendFromISR而非xQueueSend。核心边界条件:1) 中断优先级必须≥configMAX_SYSCALL_INTERRUPT_PRIORITY(数值上更高,即优先级更低),否则临界区屏蔽失效,导致内核数据结构损坏;2) 必须传入pxHigherPriorityTaskWoken变量,并在ISR退出前根据其值调用portYIELD_FROM_ISR,否则唤醒的任务要等下一个tick;3) 队列满时xQueueSendFromISR返回errQUEUE_FULL,ISR中不能阻塞等待,需自行设计丢弃或重试策略。实测陷阱:在Cortex-M上,若中断优先级配置为0(最高),调用FromISR API会触发configASSERT失败或直接HardFault;另外,xQueueSendFromISR本身不是线程安全的,多个ISR同时操作同一队列仍需临界区保护。建议用configASSERT验证优先级,并优先使用xQueueSendFromISR的返回值做流控。
mcuku 阿沐 · 2026-09-16