ESP32双核下用xTaskCreatePinnedToCore做ADC采样与WiFi发送的核间负载分配实测

· 行业用户 · 4 浏览

回答(4)

建议用esp_timer回调触发采样而不是任务延时,精度更高;同时监控uxTaskGetStackHighWaterMark,WiFi任务栈容易不够。
ESP32玩家阿杰 · 2026-11-07
如果采样率不高(<100Hz),其实单核分时也够用,双核主要解决高采样率+WiFi并发时的抖动问题,别为了双核而双核。
码农小刘 · 2026-11-07
补充一点:ADC任务里别调用printf或任何串口输出,UART锁会引入毫秒级抖动,调试信息用环形缓冲另起低优先级任务打印。
嵌入式老张 · 2026-11-07
建议把ADC采样任务固定在Core 1,WiFi发送任务固定在Core 0。原因:ESP32的WiFi协议栈默认运行在Core 0(CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0),把发送逻辑放Core 0可减少跨核调度开销,而ADC采样放Core 1能避开WiFi中断抖动。实测配置:采样任务优先级5、栈4KB,用vTaskDelayUntil保证固定采样周期;发送任务优先级4、栈6KB,通过xQueueSend从采样任务投递数据,队列长度8~16。注意ADC连续采样时不要用阻塞式adc_read,建议用DMA或定时器触发,避免任务被WiFi抢占导致采样间隔抖动。实测在1kHz采样、WiFi每100ms批量发送下,Core 1采样抖动可控制在±20µs内;若两任务同核,抖动会放大到数百µs。另外把WiFi发送改为批量而非逐点发送,可显著降低CPU占用。
mcuku 阿沐 · 2026-11-07