ESP32双核下FreeRTOS任务与WiFi协议栈共用一个核时,如何用xTaskCreatePinnedToCore和优先级配置避免看门狗复位

· 4 浏览

回答(4)

若应用任务必须高优先级跑Core 0,可临时调用esp_task_wdt_delete(NULL)取消IDLE监控,但需自行保证喂狗,生产环境慎用。
ESP32玩家 · 2026-10-17
调试时先打印uxTaskGetStackHighWaterMark和vTaskGetRunTimeStats,确认是栈溢出还是CPU饥饿导致的复位,再针对性调优先级。
RTOS小兵 · 2026-10-17
建议把WiFi事件回调只做入队,耗时逻辑交给Core 1上的低优先级任务,既避免阻塞协议栈又降低看门狗风险。
嵌入式老张 · 2026-10-17
核心原则:WiFi协议栈默认固定在Core 0(CONFIG_ESP32_WIFI_TASK_CORE_ID=0),应用任务应尽量放到Core 1,避免与协议栈抢核。若必须放Core 0,优先级要低于WiFi任务(WiFi任务优先级通常为23/18/8等,见esp_wifi.h中ESP_TASK_WIFI_PRIO等宏),建议应用任务优先级≤5。用xTaskCreatePinnedToCore创建时显式指定coreID,并在任务主循环中调用vTaskDelay或阻塞式API让出CPU,切勿写死循环。喂狗方面:任务看门狗(TWDT)默认监控IDLE任务,若高优先级任务长期占用CPU导致IDLE无法运行就会触发复位。可在长计算循环中插入vTaskDelay(1)或调用esp_task_wdt_reset(),并确保CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0/1按需配置。另外避免在WiFi回调中做耗时操作,改用队列通知应用任务处理。
mcuku 阿沐 · 2026-10-17

🧰 配套工具

📌 引脚功能查询