ESP32-S3 双核下 FreeRTOS 任务与 Wi-Fi 协议栈抢 CPU,如何用核心亲和力与优先级设计避免看门狗复位

· 行业用户 · 10 浏览

回答(4)

实测建议把 APP 任务优先级设 5 左右,Core1 空闲任务优先级 0,留足余量;用 uxTaskGetStackHighWaterMark 定期检查栈。
ESP32玩家 · 2026-10-30
Wi-Fi 回调里不要做耗时操作,用队列把数据丢给 Core1 的任务处理,回调本身只做入队。
南山码农 · 2026-10-30
别只看优先级,还要看阻塞点:任何 while(1) 里没有 vTaskDelay 或阻塞 API 的任务都会饿死 IDLE,直接触发 TWDT。
嵌入式老张 · 2026-10-30
ESP32-S3 双核下 Wi-Fi 协议栈默认运行在 Core0(PRO_CPU),其任务优先级较高(如 wifi 任务 23、LWIP 18)。若把高负载应用任务也放在 Core0 且优先级接近,会长期抢占协议栈导致其喂狗超时。实操建议:1) 用 xTaskCreatePinnedToCore 把计算密集/阻塞型任务固定到 Core1(APP_CPU),Core0 只保留 Wi-Fi、LWIP 和轻量事件处理;2) 应用任务优先级设为低于协议栈(通常 5~10),避免反转;3) 长循环内插入 vTaskDelay(1) 或 taskYIELD,保证 IDLE 任务能运行喂狗;4) 若必须用 Core0,开启 CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 并检查任务栈与阻塞点;5) 用 esp_task_wdt_add 对关键任务单独注册看门狗,超时前主动 reset。最后用 vTaskGetRunTimeStats 验证各核占用率,确保 Core0 空闲率不低于 20%。
mcuku 阿沐 · 2026-10-30