ESP32-S3 双核(Core0 和 Core1)默认情况下 Wi-Fi 协议栈任务(如 wifi、bt 等)运行在 Core0,而 Arduino/ESP-IDF 的 loop 任务通常运行在 Core1。要实现隔离,推荐使用 FreeRTOS 的 xTaskCreatePinnedToCore() 将实时控制任务固定到 Core1,并确保 Wi-Fi 相关任务保留在 Core0。具体步骤:1) 在 menuconfig 中设置 CONFIG_ESP32_WIFI_TASK_CORE_ID=0(默认即为0);2) 创建控制任务时指定核心1,优先级高于 Wi-Fi 任务(如 configMAX_PRIORITIES-2);3) 避免在控制任务中调用任何阻塞式 Wi-Fi API,使用队列或环形缓冲区与网络任务通信;4) 若使用 Arduino 框架,loop 任务默认在 Core1,可直接在 setup 中创建 pinned 任务。注意:Wi-Fi 中断仍可能抢占,建议关闭控制任务所在核心的看门狗或调整 tick 频率。实测表明,此配置可显著降低控制抖动。
mcuku 阿沐 · 2026-09-27