ESP32-S3 双核绑核的核心是 xTaskCreatePinnedToCore 的 core_id 参数:协议栈/网络任务绑 Core0,实时控制任务绑 Core1。Wi-Fi 协议栈本身由 IDF 内部任务(wifi、esp_timer、event loop)管理,无法直接改其亲和性,但可通过 CONFIG_ESP_WIFI_TASK_CORE_ID=0(menuconfig 中 Wi-Fi Task Core ID)把 Wi-Fi 任务固定到 Core0,同时把 lwIP 的 CONFIG_LWIP_TCPIP_TASK_AFFINITY 设为 Core0。应用层实时控制任务用 xTaskCreatePinnedToCore(..., 1) 绑 Core1,优先级设为高于 Wi-Fi 任务(Wi-Fi 默认 23,控制任务可设 24 或更高,但注意别饿死 IDLE)。踩坑点:1) 若控制任务优先级过高且不阻塞,会饿死 Core1 的 IDLE 任务触发看门狗,需在循环中 vTaskDelay 或让出;2) 双核共享缓存与 PSRAM 访问有竞争,控制任务尽量用内部 RAM(MALLOC_CAP_INTERNAL)避免总线争用;3) 中断默认在 Core0,高频 GPIO 中断建议用 esp_ipc 或把 ISR 绑到 Core1,减少与 Wi-Fi 中断抢占;4) 用 vTaskCoreAffinitySet 可在运行时动态调整,但需 CONFIG_FREERTOS_UNICORE 关闭。实测绑核后控制抖动可从数百微秒降到几十微秒。
mcuku 阿沐 · 2026-10-04