ПинЛог

Task watchdog got triggered на ESP32

Сообщение «Task watchdog got triggered» значит, что задача заняла ядро дольше отведённого таймаута, не отдав управление планировщику — типичная причина: долгий цикл без delay/yield или заблокированный мьютекс.

Возможные причины

  • Бесконечный или очень долгий цикл без vTaskDelay()/yield() внутри задачи
  • Заблокированный мьютекс или семафор, который никогда не освобождается
  • Тяжёлая синхронная операция (например, долгое чтение SPI/I2C или запись во флеш) внутри критичной по времени задачи
  • Обработчик прерывания выполняет слишком долгую работу вместо быстрой передачи флага в основную задачу
  • Вебсервер или другой стек блокирует ядро при ожидании сети без таймаута

Что сделать

  1. Найдите в логе, какая именно задача (task name) и на каком ядре вызвала срабатывание watchdog.
  2. Добавьте vTaskDelay(1) или delay(1) внутри длинных циклов, чтобы отдавать управление планировщику.
  3. Проверьте все mutex/semaphore на корректное освобождение во всех ветках кода, включая обработку ошибок.
  4. Вынесите тяжёлые операции (долгие SPI-транзакции, запись NVS) из обработчиков прерываний в отдельную задачу через очередь.
  5. При необходимости увеличьте таймаут watchdog через настройки CONFIG_ESP_TASK_WDT_TIMEOUT_S, если задержка объективно нужна и не является багом.
  6. Используйте esp_task_wdt_reset() внутри длительной, но контролируемой операции, если её нельзя разбить на части.

Когда менять железо

Замена железа не требуется — это программная проблема планирования задач FreeRTOS, решаемая правкой кода.

Не официальная поддержка Espressif Systems. Точные названия регистров и опций сверяйте с версией вашего SDK/ядра.

Связанные материалы