Task watchdog got triggered на ESP32
Сообщение «Task watchdog got triggered» значит, что задача заняла ядро дольше отведённого таймаута, не отдав управление планировщику — типичная причина: долгий цикл без delay/yield или заблокированный мьютекс.
Возможные причины
- Бесконечный или очень долгий цикл без vTaskDelay()/yield() внутри задачи
- Заблокированный мьютекс или семафор, который никогда не освобождается
- Тяжёлая синхронная операция (например, долгое чтение SPI/I2C или запись во флеш) внутри критичной по времени задачи
- Обработчик прерывания выполняет слишком долгую работу вместо быстрой передачи флага в основную задачу
- Вебсервер или другой стек блокирует ядро при ожидании сети без таймаута
Что сделать
- Найдите в логе, какая именно задача (task name) и на каком ядре вызвала срабатывание watchdog.
- Добавьте vTaskDelay(1) или delay(1) внутри длинных циклов, чтобы отдавать управление планировщику.
- Проверьте все mutex/semaphore на корректное освобождение во всех ветках кода, включая обработку ошибок.
- Вынесите тяжёлые операции (долгие SPI-транзакции, запись NVS) из обработчиков прерываний в отдельную задачу через очередь.
- При необходимости увеличьте таймаут watchdog через настройки CONFIG_ESP_TASK_WDT_TIMEOUT_S, если задержка объективно нужна и не является багом.
- Используйте esp_task_wdt_reset() внутри длительной, но контролируемой операции, если её нельзя разбить на части.
Когда менять железо
Замена железа не требуется — это программная проблема планирования задач FreeRTOS, решаемая правкой кода.
Не официальная поддержка Espressif Systems. Точные названия регистров и опций сверяйте с версией вашего SDK/ядра.