ESP32-S3 双核下用 FreeRTOS 任务通知替代队列做高频中断下半部处理的性能实测

· 7 浏览

回答(4)

注意:任务通知不能替代队列传递复杂结构体,若必须传数据,可用通知+双缓冲,但需加内存屏障防止乱序。
RTOS小兵 · 2026-10-09
实测中若开启ESP32-S3的指令缓存,通知方式延迟可再降约0.8µs,但需注意ISR和任务代码尽量放在IRAM中。
乐鑫粉丝 · 2026-10-09
补充一点:通知值可以复用为轻量信号量,但若ISR可能连续多次触发,建议用计数型通知(ulTaskNotifyTake)避免丢失事件。
嵌入式老白 · 2026-10-09
在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

🧰 配套工具

⏱️ 定时器计算器