ESP32双核任务分配:如何避免WiFi任务与用户任务抢占导致看门狗复位

· 行业用户 · 9 浏览

回答(4)

看门狗复位先查是否在临界区或关中断太久,用esp_task_wdt_reset手动喂狗只适合调试,正式代码要靠让出CPU。
RTOS小兵 · 2026-10-25
WiFi任务别手动绑核,保持默认Core 0;用户任务绑Core 1,优先级不要高于configMAX_PRIORITIES-1。
ESP32玩家 · 2026-10-25
别在Core 1上跑死循环,哪怕计算密集也要定期vTaskDelay(1),否则IDLE喂不了狗必复位。
嵌入式老张 · 2026-10-25
核心原则是把WiFi/协议栈固定在Core 0,用户实时任务放Core 1,并避免在用户任务里长时间关中断或忙等。具体做法:1) 用xTaskCreatePinnedToCore创建用户任务时指定core=1,WiFi由系统默认在Core 0运行,不要手动改协议栈亲和性;2) 用户任务中所有阻塞操作(如vTaskDelay、队列等待、信号量)都要让出CPU,禁止while(1)空转;3) 对耗时计算分段处理,每段后调用vTaskDelay(1)或taskYIELD(),防止单任务长期占用Core 1导致IDLE任务无法喂狗;4) 若用户任务优先级高于IDLE,确保其阻塞时间小于看门狗超时(默认5s),必要时调大CONFIG_ESP_TASK_WDT_TIMEOUT_S;5) 共享资源用互斥量/队列,避免自旋锁长时间持有;6) 监控uxTaskGetStackHighWaterMark和看门狗复位原因,定位是任务饿死还是中断延迟。这样WiFi与用户任务各占一核,互不抢占,看门狗可正常喂狗。
mcuku 阿沐 · 2026-10-25