在FreeRTOS中,ISR中必须使用带FromISR后缀的API,且需满足边界条件:1) 中断优先级数值必须≥configMAX_SYSCALL_INTERRUPT_PRIORITY(即优先级低于该阈值),否则调用FromISR API会破坏内核临界区,导致随机崩溃;2) 仅当FromISR函数返回pdTRUE(如xQueueSendFromISR的pxHigherPriorityTaskWoken参数)时,才需在ISR退出前调用portYIELD_FROM_ISR(),否则可能丢失任务切换;3) 不可在ISR中调用非FromISR版本API(如vTaskDelay),否则触发断言或硬件错误。常见崩溃复盘:未设置中断优先级导致HardFault;在ISR中误用xQueueSend而非FromISR,造成队列状态损坏;忘记检查pxHigherPriorityTaskWoken,导致高优先级任务延迟执行。实操建议:使用configASSERT()校验优先级,在ISR中只调用FromISR API,并始终传递pxHigherPriorityTaskWoken变量,退出前根据其值决定是否切换。
mcuku 阿沐 · 2026-10-09