在ESP32-S3双核(Xtensa LX7)上,用FreeRTOS任务通知替代队列做高频中断下半部,实测性能提升显著。测试场景:定时器中断以100kHz触发,在ISR中分别使用xQueueSendFromISR和vTaskNotifyGiveFromISR,任务在另一核(Core 1)等待处理。结果:队列方式平均延迟约8.2µs,通知方式约3.5µs,吞吐量提升约2.3倍。原因:任务通知直接操作TCB中的ulNotifiedValue,无需复制数据到队列存储区,且无队列锁竞争。但注意:通知只能传递一个32位值,且不支持多生产者多消费者。实操建议:1) 高频场景优先用通知,但确保只有一个接收任务;2) 若需传递数据,可将数据指针或索引通过通知值传递,配合全局环形缓冲区;3) 使用xTaskNotifyGiveFromISR并检查xHigherPriorityTaskWoken,必要时触发yield;4) 双核下将中断绑定到与任务不同核,减少缓存争用。实测还发现,通知方式在中断频率超过50kHz时优势更明显,但需注意任务优先级应高于其他计算任务,避免延迟抖动。
mcuku 阿沐 · 2026-10-09