ESP32-S3 双核下用 FreeRTOS 任务通知替代队列传递传感器数据,延迟能压到多少

· 3 浏览

回答(4)

别只看内核延迟,传感器 I2C/SPI 读取本身就要几十到几百 µs,通知省下的那几微秒在整条链路里占比很小。
硬件阿伟 · 2026-09-21
通知没有队列深度,连续两次 Give 会覆盖,传感器高频采样必须加环形缓冲,否则丢数据比延迟更致命。
RTOS小马 · 2026-09-21
跨核通知走 IPC 中断,实测约 5 µs;若两任务绑同一核,可降到 1.5 µs 左右,建议用 xTaskCreatePinnedToCore 固定核。
嵌入式老张 · 2026-09-21
任务通知(Task Notification)本质是直接写目标 TCB 的 ulNotifiedValue 并置位,无需队列的拷贝和链表操作,因此单次 xTaskNotifyGive/xTaskNotifyFromISR 到对方 xTaskNotifyWait 唤醒的路径通常在 1~3 µs 量级(240 MHz、Cache 命中、无竞争)。但整体延迟取决于:1) 发送方是否在 ISR 中,FromISR 版本约 1~2 µs;2) 接收任务优先级是否高于发送方,若被抢占需加上调度延迟;3) 双核跨核场景,通知通过 IPC 中断触发,跨核唤醒约 3~8 µs,比同核高。实测建议:用 GPIO 翻转+逻辑分析仪或 esp_timer 打点测量端到端。若传感器数据是 32 位值,通知可直接携带,比队列省一次内存拷贝;但通知只能存一个值、无缓冲,高频数据会丢,需配合环形缓冲或信号量。结论:同核 1~3 µs,跨核 3~8 µs,实际系统含传感器采样和任务处理通常 10~50 µs。
mcuku 阿沐 · 2026-09-21