Найти в Дзене

Сторожевые таймеры в ESP8266

Основная функция сторожевого таймера заключается в том, чтобы при «затягивание» программы, для микроконтроллера это означает что произошло какое-то зависание, произвести его перезагрузку ЦП. Задача, вроде бы, весьма тривиальная, однако в микроконтроллерах ESP8266 данная функция, на мой взгляд, реализуется достаточно кривовато. ESP8266 имеет два сторожевых таймера, один аппаратный, второй – программный. По умолчанию сторожевой таймер включен, т.е. после подачи питания на микросхему он начинает отсчет, после того как он досчитает до заданного значения, происходит перезагрузка. И если ничего не предпринимать, программа не будет работать нормально, периодически перезапускаясь после перезагрузки. Значение, до которого «считает» сторожевой таймер в документации я не нашел, но эксперименты показали, что перезагрузка по программному сторожевому таймеру происходит примерно через 4 сек., по аппаратному, примерно через 7 сек. В мануале по SDK, для работы со сторожевым таймером описаны три функции

Основная функция сторожевого таймера заключается в том, чтобы при «затягивание» программы, для микроконтроллера это означает что произошло какое-то зависание, произвести его перезагрузку ЦП.

Задача, вроде бы, весьма тривиальная, однако в микроконтроллерах ESP8266 данная функция, на мой взгляд, реализуется достаточно кривовато.

ESP8266 имеет два сторожевых таймера, один аппаратный, второй – программный.

По умолчанию сторожевой таймер включен, т.е. после подачи питания на микросхему он начинает отсчет, после того как он досчитает до заданного значения, происходит перезагрузка. И если ничего не предпринимать, программа не будет работать нормально, периодически перезапускаясь после перезагрузки.

Значение, до которого «считает» сторожевой таймер в документации я не нашел, но эксперименты показали, что перезагрузка по программному сторожевому таймеру происходит примерно через 4 сек., по аппаратному, примерно через 7 сек.

В мануале по SDK, для работы со сторожевым таймером описаны три функции:

system_soft_wdt_stop(); - Остановить программный сторожевой таймер.

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

system_soft_wdt_restart(); - Перезапустить программный сторожевой таймер.

Эту функцию можно вызвать только в том случае, если программный сторожевой таймер остановлен (system_soft_wdt_stop();).

system_soft_wdt_feed(); - Сброс программного сторожевого таймер.

Эту функцию можно вызвать только в том случае, если программный сторожевой таймер запущен.

Для платформы Arduino эти три функции дублированы следующими методами: ESP.wdtDisable(void); ESP.wdtEnable(uint32_t timeout_ms); ESP.wdtFeed(void);

Необходимо отметить, что в качестве аргумента метода ESP.wdtEnable(); необходимо передать целочисленное значение, которое будет соответствовать количеству миллисекунд для срабатывания сторожевого таймера. Однако, это значение не имеет никакого эффекта и не используется во внутреннем вызове функций SDK ESP8266. В заголовочном файле указано, что на данный момент установка тайминга не реализована.

Если по какой-то причине пользовательское приложение должно выполнять задачу слишком долго, необходимо чаще использовать system_soft_wdt_feed() для сброса программного сторожевого таймера. Отключение программного сторожевого таймера не рекомендуется.

Если программный сторожевой таймер отключить при помощи функции system_soft_wdt_stop();, сработает аппаратный таймер который, также, перезагрузит ЦП. В момент перезагрузки в UART передается информация, которая говорит о том, что причиной перезагрузки была команда от аппаратного сторожевого таймера.

Рисунок 1. В журнале сбоев, код причины 2 – перезагрузка от программного сторожевого таймера.
Рисунок 1. В журнале сбоев, код причины 2 – перезагрузка от программного сторожевого таймера.
Рисунок 2. В журнале сбоев, код причины 4 – перезагрузка от аппаратного сторожевого таймера. Так же это указано надписью «wdt reset».
Рисунок 2. В журнале сбоев, код причины 4 – перезагрузка от аппаратного сторожевого таймера. Так же это указано надписью «wdt reset».

Библиотеки ESP неявно сбрасывают сторожевой таймер во многих функциях, поэтому большую часть времени нам не нужно беспокоиться о «ручном» сбросе сторожевого таймера.