Типы Watchdog в ESP32 и их использование

Микроконтроллер ESP32 широко применяется в IoT-устройствах, умных датчиках и системах автоматизации. Одним из важных инструментов обеспечения надёжности является Watchdog Timer (WDT) — механизм, который перезапускает систему или задачу при зависании. В этой статье мы подробно рассмотрим типы WDT, их архитектуру, настройку и типичные ошибки.

Типы Watchdog в ESP32

  • Task Watchdog (TWDT) — следит за зависаниями задач FreeRTOS. Если задача слишком долго не "кормит" watchdog (не вызывает esp_task_wdt_reset()), то ESP32 автоматически перезапустит её или всю систему.
  • Interrupt Watchdog (IRAM WDT) — отлавливает зависания в обработчиках прерываний. Если ISR «повиснет» и не вернёт управление, IRAM WDT перезапустит ядро.
  • RTC Watchdog — работает даже в режиме deep sleep и при нестабильном питании. Используется для гарантированного выхода устройства из сна.

Сравнительная таблица

Тип WDT Когда применять
Task WDT Мониторинг задач FreeRTOS, защита от зависания кода
Interrupt WDT Контроль ISR, предотвращение зависаний в прерываниях
RTC WDT Обеспечение пробуждения из deep sleep, защита при нестабильном питании

Архитектура Watchdog в ESP32

ESP32 содержит несколько уровней WDT:

  • TWDT работает внутри FreeRTOS и связан с ядрами CPU.
  • IRAM WDT встроен на уровне аппаратных прерываний.
  • RTC WDT контролирует таймеры и питание даже в спящем режиме.

В Arduino Core функции WDT доступны через библиотеку <esp_task_wdt.h>, а в ESP-IDF управление осуществляется напрямую через драйверы и регистры.

Настройка Task Watchdog

#include <esp_task_wdt.h>

void setup() {
  Serial.begin(115200);

  // Инициализация WDT на 5 секунд
  esp_task_wdt_init(5, true);

  // Добавление основной задачи
  esp_task_wdt_add(NULL);
}

void loop() {
  // Имитация работы
  delay(1000);

  // Сброс WDT
  esp_task_wdt_reset();

  Serial.println("Задача работает без зависаний");
}

Вы можете добавить несколько задач в WDT:

esp_task_wdt_add(taskHandle1);
esp_task_wdt_add(taskHandle2);
esp_task_wdt_delete(taskHandle1);

Использование RTC Watchdog

RTC WDT полезен для работы с deep sleep:

void setup() {
  esp_sleep_enable_timer_wakeup(10 * 1000000); // 10 секунд
  esp_deep_sleep_start();
}

void loop() {
  // Код не выполняется, устройство спит
}

Даже при зависании устройство гарантированно проснётся через 10 секунд.

Использование WDT для каждой задачи

Можно контролировать разные задачи отдельно:

  • Например, задача чтения датчика зависла — WDT удаляет её.
  • Основная программа продолжает работать без полной перезагрузки.

7. Отладка и логирование работы WDT

При разработке проектов с использованием Watchdog таймера (WDT) важно уметь отслеживать его работу. Это помогает убедиться, что сброс выполняется правильно и своевременно.

7.1. Логирование сбросов

Для проверки успешного сброса можно использовать встроенную макрос-функцию ESP_ERROR_CHECK(), а также выводить сообщения в Serial Monitor:

ESP_ERROR_CHECK(esp_task_wdt_reset()); 
Serial.println("WDT сброшен успешно");

Такая конструкция позволит не только сбрасывать Watchdog, но и сразу видеть сообщение о том, что сброс выполнен. Если возникнет ошибка, ESP_ERROR_CHECK отобразит её в консоли.

7.2. Типичные сообщения при срабатывании WDT

Когда программа «зависает» или слишком долго выполняется без сброса, WDT активируется. В Serial Monitor или консоли вы можете увидеть характерные сообщения:

  • Task watchdog got triggered — сработал таймер, программа не успела сбросить WDT.
  • Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout) — ядро микроконтроллера было принудительно перезапущено из-за превышения времени выполнения.

7.3. Использование логов для диагностики

Эти сообщения позволяют быстро определить:

  • В каком месте программы произошло зависание.
  • Достаточно ли часто выполняется сброс WDT.
  • Нужно ли оптимизировать длительные операции (например, циклы с большим количеством итераций или работу с сетью).

Совет: добавляйте Serial.println() в ключевые участки кода (например, перед долгими циклами или при работе с датчиками), чтобы видеть, где программа перестаёт реагировать. Это позволит точнее понять, что именно вызывает срабатывание Watchdog.

Типичные ошибки

  • Забыли вызвать esp_task_wdt_reset().
  • Слишком короткий таймаут — WDT срабатывает без причины.
  • Использование delay() вместо vTaskDelay().
  • Зависания в прерываниях без IRAM WDT.

Заключение

Watchdog — это не костыль, а обязательный элемент IoT-устройств. Рекомендуется всегда использовать комбинацию Task WDT + RTC WDT для защиты от зависаний и нестабильного питания.

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Модуль 6 — Вывод информации: LCD 1602, OLED и термометр с экраном

Модуль 6 — Вывод информации: LCD 1602, OLED и термометр с экраном

Модуль 6 — Вывод информации (курс для начинающих) Цель модуля: научиться подключать и испол..

Шилд аккумулятора для WeMos D1 mini

Шилд аккумулятора для WeMos D1 mini

Шилд для запитки микроконтроллера WeMos D1 от литиевого аккумулятора. Позволяет заряжать а..

74.42грн.

Контроль исполнения программы Arduino

Контроль исполнения программы Arduino

Контроль исполнения программы ArduinoДанная статья посвящена описанию структур, используемых для упр..

SMD светодиод 0805

SMD светодиод 0805

SMD светодиоды видимого диапазона для поверхностного монтажа на плату Типоразмер 0805 Крас..

2.39грн.

Модуль реле 4-канальный 12В 10А

Модуль реле 4-канальный 12В 10А

4-канальный модуль реле для подключения напрямую к дискретному выходу контроллера. Светодиодная инди..

159.74грн.