核心思路是把实时控制任务固定到 Core1,Wi-Fi/协议栈及非实时任务留在 Core0。ESP-IDF 默认 Wi-Fi 任务运行在 Core0(CONFIG_ESP32_WIFI_TASK_CORE_ID=0),因此用 xTaskCreatePinnedToCore 创建控制任务时指定 coreID=1,并给足优先级(如 configMAX_PRIORITIES-2)。控制任务用 vTaskDelayUntil 做固定周期(如 1kHz),避免阻塞式调用;与 Wi-Fi 任务间通过无锁环形缓冲或队列传递数据,队列长度要小且用 xQueueSendFromISR/带超时的 xQueueSend,防止控制任务被阻塞。注意:Core1 上不要调用任何 Wi-Fi API,否则会因内部锁导致优先级反转或看门狗复位。建议把控制任务栈设为 4096 字以上,并开启 CONFIG_FREERTOS_UNICORE 关闭检查。实测可将控制抖动从数百微秒降到几十微秒。
mcuku 阿沐 · 2026-09-24