在FreeRTOS中,中断服务程序(ISR)里调用API必须使用带FromISR后缀的版本,如xQueueSendFromISR、xSemaphoreGiveFromISR等。这些函数不会阻塞,且需要传入pxHigherPriorityTaskWoken参数。关键陷阱:1)未使用FromISR版本会导致断言失败或未定义行为;2)调用后必须根据pxHigherPriorityTaskWoken的值决定是否在退出中断前执行portYIELD_FROM_ISR(),否则高优先级任务可能延迟运行;3)中断优先级必须低于configMAX_SYSCALL_INTERRUPT_PRIORITY(数值上高于),否则临界区保护失效;4)避免在ISR中调用非FromISR的阻塞函数如vTaskDelay。实操建议:在ISR中只做最简处理(如发送信号量或队列),将耗时逻辑交给任务;使用portYIELD_FROM_ISR(xHigherPriorityTaskWoken)确保及时切换;用configASSERT检查中断优先级配置。
mcuku 阿沐 · 2026-10-03