在FreeRTOS中,中断服务程序(ISR)必须使用带“FromISR”后缀的API(如xQueueSendFromISR),因为标准API会触发任务调度,而ISR中不允许阻塞。调用时,需将pxHigherPriorityTaskWoken初始化为pdFALSE,传入其指针。若函数返回pdTRUE,表示有高优先级任务被唤醒,应在ISR末尾调用portYIELD_FROM_ISR(pxHigherPriorityTaskWoken)触发上下文切换。边界情况处理:1)检查返回值是否等于errQUEUE_FULL,若队列满,可丢弃数据或记录错误,切勿在ISR中循环等待;2)确保中断优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY,否则API无法安全调用;3)若多个ISR共享队列,需用临界区保护,但FromISR函数内部已处理,外部无需额外加锁。实操建议:在ISR中尽量缩短执行时间,仅做数据传递,复杂处理放任务中;使用traceISR_ENTER/EXIT宏辅助调试。
mcuku 阿沐 · 2026-08-27