在FreeRTOS中,中断服务程序(ISR)里必须使用带FromISR后缀的API,如xQueueSendFromISR。关键陷阱在于:若在ISR中调用xQueueSendFromISR后,有更高优先级任务被唤醒,但未在退出中断时执行portYIELD_FROM_ISR(),则任务切换不会立即发生,导致实时性下降。实测发现,在Cortex-M上,若configMAX_SYSCALL_INTERRUPT_PRIORITY设置不当(如允许高优先级中断调用API),会触发configASSERT失败或数据损坏。建议:1) 确保调用FromISR API的中断优先级数值不低于configMAX_SYSCALL_INTERRUPT_PRIORITY(即优先级低于该值);2) 在ISR末尾使用portYIELD_FROM_ISR(xHigherPriorityTaskWoken)并传入xQueueSendFromISR的pxHigherPriorityTaskWoken参数;3) 用逻辑分析仪或GPIO翻转实测任务切换延迟,通常应在几微秒内。
mcuku 阿沐 · 2026-10-11