Watch dog function bios что это

Обновлено: 07.07.2024

Уже более года мною не публиковалось уроков по контроллерам AVR. На это были различного рода причины.

Во-первых, я считал, что основные виды периферии и прочих составляющих данного контроллера нами уже изучены.

Во-вторых, у меня не было и нет нормального программатора, который бы виделся в среде разработки полноправно. Уроки без этого снимать можно, но готовить проекты для них, поверьте, очень тяжело.

В-третьих, с выходом более современных контроллеров интерес к данным контроллерам упал, хоть и незначительно, но всё же это есть.

Что же всё-таки сподвигло меня на данный шаг?

Во-вторых, новый хозяин данного семейства контроллеров Microchip, включил эти контроллеры в свою среду разработки MPLAB X, что позволит нам теперь обойтись сразу на два семейства одной средой разработки.

В-третьих, также выявились определённые темы, которые не были освещены в моем предыдущем, как я считал до этого, вполне исчерпывающем курсе занятий по контроллерам AVR.

И вот одним из неизведанных ещё нами модулей оказался модуль Watchdog Timer (WDT), который, как оказалось, много где используется и выполняет очень важные роли в работе программ. Тем более, меня ранее многие просили сделать по нему урок, но я либо недопонимал ценность данной периферии, либо был увлечён чем-то другим.

Вот и настало время наконец-то восполнить данный пробел.

В каких конкретных случаях мы можем применить данный таймер?

Например, мы ждём ответа от какой-нибудь шины (например I2C или ещё какой-то) в виде отслеживания состояния определённого бита регистра. И вдруг произойдёт кратковременное отсоединение провода этой шины. После этого скорей всего произойдёт зависание программы, так как в шине будет сбой, и даже если что-то после и придёт от присоединённого узла, то мы вряд ли уже это отследим изменением состояния бита. Желательно, чтобы после какого-то таймаута система перезагрузилась. Тут-то и приходит нам на помощь WDT, который установлен на определённый интервал. Команду на перезагрузку сторожевого таймера мы расположим в нашем коде после того, как мы дождёмся отклика от шины. А если мы так его и не дождёмся, то мы не дойдём до команды перезагрузки WDT и через заветный интервал времени система будет перезагружена. После этого произойдёт заново инициализация шины и всё будет опять работать нормально.

Понятно, что данная ситуация подходит только для случая, когда нам приходится не слишком долго ждать отклика от устройств, то есть именно тогда, когда у нас существует какой-то непрерывный процесс, в котором есть возможность ситуации сбоя. Таких примеров можно придумать много, поэтому Watchdog Timer очень много где применяется.

При работе с таймером в нашем коде мы не будем напрямую работать с его регистрами, так как там ещё надо проделывать очень много различных подготовительных мероприятий. Для этого существует отличная библиотека wdt.h, которая находится в стандартном комплекте для AVR и не требует дополнительного подключения откуда-то. Но тем не менее о том, как именно устроен сторожевой таймер в контроллере ATMega328, которым мы и будем сегодня пользоваться, мы всё же поговорим.

Таймер питается от отдельного генератора, который вместе с ним входит в логику перезагрузки контроллера


А вот это диаграмма сброса контроллера по истечении интервала времени


Кроме того, что мы можем сбросить сторожевой таймер где-то в коде, мы можем также и отследить окончание интервала времени по прерыванию, которое надо включить отдельно.

WDT, как и было указано выше, работает от отдельного генератора.

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

Давайте посмотрим блок-схему WDT


На рисунке мы видим, что после генератора на 128 килогерц, сигнал проходит на предделитель, который содержит 10 различных выходов с различным коэффициентом деления. Предделитель настраивается с помощью битов WDP3:WDP0 регистра WDTCSR. Таким образом, интервал времени работы WDT лежит в диапазоне от 15 милисекунд до 8 секунд.

Также мы видим, что с помощью бита WDIE мы можем разрешить прерывания от сторожевого таймера и затем попасть в обработчик, отслеживая состояние бита WDIF. Включается таймер с помощью бита WDE.


Хоть мы уже и говорили о битах данного регистра выше, но всё же давайте все их рассмотрим подробно, их не так и много, так как у таймера всего один регистр

WDIF (Watchdog Interrupt Flag): флаг прерывания. Устанавливается в 1 в случае истечения интервала времени таймера. Сбрасывается аппаратно.

Существует таблица зависимости от состояния бетов WDE, WDIE, а также фьюза WDTON


Из данной таблицы очень интересно то, что для того, чтобы работать с прерываниями от сторожевого таймера, его не обязательно включать. Достаточно лишь разрешить от него прерывания. Только если не включать, то прерывания работать будут, но таймер при этом не будет перезагружать систему.

WDP2:WDP0 (Watchdog Timer Prescaler): биты, устанавливающие коэффициент деления предделителя сторожевого таймера.

Вот таблица возможных комбинаций данных битов


Здесь также даны сами интервалы в единицах времени.

WDCE (Watchdog Change Enable): бит изменения, который должен быть предварительно включен перед тем, как мы соберёмся внести изменения в предделитель с целью изменения коэффициента деления либо для отключения таймера путём занесения в бит WDE значения 0. Сбрасывается аппаратно после четырех тактов.

WDE (Watchdog System Reset Enable): бит включения таймера, а вернее бит включения режима перезагрузки системы по истечению интервала времени таймера WDT.

Ну вот, я думаю и всё насчёт теории по сторожевому таймеру. Если что-то пропустил, то исправим это в процессе сочинения кода.

Код наш выполнять будет следующие задачи.

У нас, помимо WDT, будет также работать ещё таймер TIM1, данный таймер будет работать по совпадению, следовательно в обработчик прерываний от него мы будем попадать через определённое время периодично. В обработчике таймера мы будем периодично включать 10 ножек различных портов, а состояние их на какой-то момент мы будем определять по светодиодам, которые мы к ним подключим. Вернее, мы подключим светодиодную планку с 10-ю светодиодами, не забывая конечно о токоограничивающих резисторах, которые я на всякий случай подключил на 680 Ом, при этом светодиоды светятся вполне ярко. В начале программы мы запустим наш сторожевой таймер WDT и зададим ему определённый интервал времени срабатывания. В процедуре обработки прерываний от таймера 1 мы будем своевременно сбрасывать сторожевой таймер, поэтому, если всё у нас будет нормально с ходом программы, то система у нас будет работать и не перезагрузится.

В качестве контроллера для урока мы возьмём контролер ATMega328P, расположенный на плате Arduino Nano, к которой подключим обычный USB-программатор через разъём ISP. Вставим нашу плату в макетную плату, подведём к ножке PD2 (INT0) кнопку, а также от ножек D3-D12 (ножки портов PD3:PD7, PB0:PB4) подключим аноды светодиодов планки, а катоды через токоограничивающие резисторы подключим к общему проводу


Проект мы создадим в среде программирования MPLAB X, с которой мы постоянно работаем с микроконтроллерами PIC, так как у данных контроллеров владелец один и тот же, то нет смысла использовать несколько сред для разработки. Как установить данную среду разработки, показано здесь.

Создание проекта по ссылке можно не смотреть, мы его все равно сейчас будем создавать заново.

Запустим среду программирования MPLAB X и запустим создание проекта с помощью следующей кнопки



На следующем шаге выберем наш контроллер, перед этим отфильтровав контроллеры по семейству для удобства выбора, и движемся далее


На следующем шаге в качестве программатора выберем Simulator и идём далее


На следующем шаге выберем компилятор и идём дальше



В дереве проекта в ветке Source Files добавим новый файл main.c с помощью контекстного меню на данной ветке



Файл main.c создан, чуть позже мы его исправим немного.


Для нормального функционирования функции задержки зайдём в свойства проекта и откроем там настройки компилятора, в которых выберем настройку оптимизации


Оставим уровень оптимизации 0 и установим чекбокс на пункте Debug

В одной компании было много терминалов, и одна из неблагодарных задач для техподдержки — ездить по точкам и перезапускать операционную систему внутри терминалов. Было решено бросить вызов этой проблеме в виде разработки аппаратного сторожевого таймера.

В итоге мы получили устройство, которое подключается к расширительному спаренному USB-разъему на материнской плате.



Данное устройство имеет следующие возможности:

  1. Имитация нажатия кнопок POWER и RESET;
  2. Управление питанием USB-устройством (при условии, что у него нет отдельного источника);
  3. Управление гальванически развязанной контактной группой (реле). Можно поставить в разрез цепи питания;
  4. Индикаторные светодиоды (одним можно управлять, второй показывает режимы работы).

Алгоритм работы прост: внутри находятся два настраиваемых таймера, которые постоянно отсчитывают заданное время, по истечению которого имитируется нажатие соответствующих кнопок (POWER и RESET). Чтобы предотвратить случайную перезагрузку, необходимо периодически послать команду сброса таймера.

Лучше, чтобы за процедуру сброса таймеров отвечало целевое приложение, а не стороннее или системное (Cron, служба расписаний) по причине того, что вероятность сбоя в системе меньше, чем в приложении (хотя, у кого как).
Обмен информацией аналогичен консольному.

команда Описание Пример
help Краткая справка по командам help
LED1 Управление светодиодом, по умолчанию выключен LED1 ON
LED1 OFF
RELAY Управление реле, по умолчанию включено RELAY ON
RELAY OFF
KEY1 Имитация нажатия кнопки 1, по умолчанию не нажата KEY1 ON
KEY1 OFF
KEY2 Имитация нажатия кнопки 2, по умолчанию не нажата KEY2 ON
KEY2 OFF
C1 Управление таймером 1, связанным с кнопкой 1.
Установка времени в секундах, максимальное значение 32767.
Для отключения функции таймера, необходимо задать время равное 0.
C1 RES
C1 SET 60
C1 SET 0
C2 Управление таймером 2, связанным с кнопкой 2.
Установка времени в секундах, максимальное значение 32767.
Для отключения функции таймера, необходимо задать время равное 0.
C2 RES
C2 SET 60
C2 SET 0
USB Управление питанием USB, по умолчанию включено USB ON
USB OFF

В случае удачного выполнения команды возвращает «OK».
В случае некорректных данных возвращает «ERROR».
Признаком конца строки служит символ возврата каретки «\r». Также поддерживается режим «\r\n».


Устройство выполнено на базе контроллера STM32F103CA с аппаратной поддержкой USB. Библиотека работы с USB версии V4.0.0. Напряжение работы 3.3В получаем с помощью линейного стабилизатора из 5В на USB. Во всех управляющих цепях используются транзисторы в ключевом режиме. Также не забываем про защитный диод от токов самоиндукции в катушки реле (в моем случае он оказался встроенным).

Параметр - Watchdog Timer

Персональный компьютер или сервер имеют встроенный таймер операций – он называется WatchDog Timer или WDT (в русской компьютерной терминологии – контрольный таймер материнской платы). Необходим он потому как такая сложная техника, как компьютер имеет свойство сбоить и выходить из строя. Именно поэтому в неё зачастую встраивают различные независимые опции контроля и коррекции, в частности таймер операций, который ограничивают время, затрачиваемое системой ввода-вывода на одно действие(шаг).

В большинстве случаев контрольный таймер доступен прямо в BIOS-е. Впрочем, некоторые производители материнских плат страдают недоверием к пользователям и оснащают свои платы только самыми безопасными и «пользовательскими» функциями. Если вам так не повезло – увы, доступ к настройкам WDT вам закрыт. К счастью, таких производителей немного.

Как работает контрольный таймер

WDT запускается вместе со стартом системы и тут же начинает отслеживание её действий. Впрочем, некоторые модели плат имеют технологическую особенность: первый шаг WDT в них является холостым, а значит, по-настоящему работу таймер начнет только по прохождении 0,6 секунды. Стандартное значение WDT– 4h, что означает 4 шага. Если программа не успевает выполнить операцию за четыре шага (1,8 – 2,4 секунды) система принудительно останавливает её и производит корректировку программы. Ну или перезагружает/выключает компьютер, если эта программа системная. При этом вы получите BSoD (Blue Screenof Death) с описанием произошедшей ошибки, например DPC_WATCHDOG_VIOLATION.

Максимальное значение WDT– 3Fh, то есть 62 шага или 37,5 секунд, но устанавливать его не стоит: в случае какого-либо сбоя вы потеряете доступ к ПК не на жалкие две секунды, а почти на полминуты. К тому же любой современный ПК способен выполнить стандартную операцию меньше чем за секунду, а значит, даже двухсекундная задержка уже сбой.

Стоит ли включать эту опцию?

Да, определенно. WDT крайне необходим при работе с нестабильными или зараженными системами, так как он помогает находить и устранять программные и аппаратные ошибки, мешающие нормальной работе вашего ПК. Но вот если вы работаете с очень устаревшим оборудованием (или же невероятно сложными и/или плохо написанными программами), то значение WDT в BIOS стоит сделать побольше или же вообще выключить, если другие варианты не работают. Только помните, что в этом случае ваш компьютер может начать чаще зависать и тратить процессорное время на выполнение некорректно совершенных запросов.

При слишком большом разгоне или использовании плохо обкатанного майнера даже linux-подобная система может зависнуть. В этом случае хорошую помощь для майнеров может оказать сторожевой таймер (watchdog timer), иначе говоря сторожевая собака.

Что такое Watchdog и как он работает?

Watchdog — это реализованная на аппаратном уровне схема постоянного контроля над состоянием системы, которая перезагружает или выключает, а затем включает компьютер при зависании.

Фактически это таймер, периодически опрашивающий систему на предмет работоспособности и в случае отсутствия ответа производящий принудительную перезагрузку. В отличие от системных/программных вотчдогов, которые только посылают системе сигнал на перезагрузку (производят «мягкий» ресет), аппаратный вотчдог производит перезагрузку на уровне железа с помощью реле или оптрона ,которые замыкают на материнской плате сигнальный провод RST или делают Power OFF, а через несколько секунд — Power ON.

Аппаратный watchdog можно сделать самому на основе Ардуино/Raspberry, но проще воспользоваться готовым решением, самым дешевым из которых будет китайский вариант.

Китайские внешние сторожевые таймеры создают виртуальный последовательный порт (или serial port, COM-port), на котором слушают контрольный сигнал (heartbeat) от управляющего программного обеспечения. Если сигнал контроля не получен во время установленного временного интервала, то watchdog включает реле для выключения/включения или перезагрузки компьютера.

В китайских сторожевых таймерах время прослушивания контрольного сигнала heartbeat обычно кратно 10 секундам, а диапазон изменения времени срабатывания варьируется от 10 до 1270 секунд.

Нужно не увлекаться выставлением слишком маленьких значений временного интервала для вотчдога, потому что впоследствии, при появлении проблем, этого времени может не хватить для загрузки системы и устранения ошибки в батнике/программе, вызывающей зависание/ресет. Это приведет к циклической перезагрузке компьютера, которую можно будет устранить только отключением вотчдога.

Наиболее распространены мониторинговые таймеры с одним/двумя механическими реле и на оптронах.

Разница между китайскими сторожевыми таймерами начиная с первого однорелейного вотчдога до на оптронах хорошо проиллюстрирована на следующей картинке:


Однорелейный watchdog может мониторить майнер, пинговать заданный сайт, ребутить систему по расписанию или включать/выключать компьютер по расписанию, отслеживать количество «живых» карт в системе, вести логи. При отсутствии питания на USB-разъемах на выключенном компьютере (на старых моделях) такой вотчдог превращается в бесполезную железяку (после пропадания питания). Версия с одним реле официально поддерживается только в Windows. Однорелейные таймеры несовершенны, лучше удержаться от их использования.

Есть варианты улучшенных однорелейных сторожей, но они также несовершенны:


Для управления программируемым однорелейным вотчдогом можно применять программу USB Watchdog второй версии:


Двухрелейный сторожевой таймер в дополнение к вышеперечисленным опциям может ребутить систему по расписанию и включать/выключать ее по расписанию. Он имеет на борту конденсатор, что увеличивает его надежность и обеспечивает работоспособность при кратковременном пропадании питания. Версия с 2-я реле официально поддерживается только в Windows. Это уже довольно хорошо работающие таймеры.

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

Версия на оптронах (самая распространенная — это v5.0) уже имеет официальную поддержку linux, имеет улучшенную утолщенную (2 мм) плату с более надежной схемой. Китайский сторожевой пес версии 5.0 работает на чипе WDG273 ,имеет стоимость порядка 4,8 USD за штуку. Выпускаются версии для 9 pin разъема FUSB материнской платы, а также для USB TypeA.

Версия для 9-пинового разъема FUSB материнской платы


Это довольно неплохой watchdog со светодиодной индикацией на оптронах с кнопкой вкл/выкл. (ON/OFF), который ставится через разъем PBS-4 непосредственно на материнскую плату в одно из 9-пиновых гнезд FUSB для подключения USB-колодок.

Китайский USB watchdog версии 5.0 с разъемом USB TypeA:


Управление вотчдогами с реле и на оптронах осуществляется программой USB Watchdog (есть версия только под Windows, последняя — 6.1.9).

Управление watchdog-ом на оптронах в linux осуществляется программой PCWatchdog0201.

Управляющая программа (версия 6.1.9) для дешевых Chinese watchdogs с 1 и 2 реле, а также на оптронах под Windows:


Апофеозом развития китайских сторожевых мониторов является сторожевой пес версии 9.0:


Подключение китайских Watchdogов к материнской плате

USB watchdog-и (укомплектованные USB-A разъемами) включаются в любой свободный порт USB, желательно в такой, который постоянно запитан от платы напряжением 5 вольт.

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

Двухрелейный таймер коммутируют и с контактами on/off, и с reset (полярность не важна):


Вотчдог на оптронах с разъемом PBS-4 вставляется в материнскую плату в часть одного из 9-пиновых гнезд FUSB (либо в контакты 1,3,5,7, либо 2,4,6,8):


Провода управления и контроля таймера 5.0 подключаются к следующим контактам передней панели материнки: +restart, +pwr on и к pwr light. Здесь уже нужно соблюдать полярность, иначе вотчдог не заработает. На материнской плате плюсовые контакты всегда подписаны, что облегчает процесс подключения.

Электрическая схема подключения watchdog версии 5.0 (на оптронах):


Подключение проводов управления к сторожевому таймеру и подсоединение к материнской плате (для варианта с разъемом 4пиновым таймером):


Еще одно фото подключения такого таймера:


Коммутация проводов управления к сторожевому таймеру и подсоединение к материнской плате (для варианта с разъемом USB-A):


Подключение проводов управления от таймера 5.0 к колодке материнской платы FPANEL:


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

Китайских сторожевых собак довольно сложно приручить в linux, но это тоже возможно и описано в отдельной статье.

Вам также может понравиться


Использование Watchdog v 9.0 для обеспечения бесперебойной работы рига

О питающих напряжениях и передаче данных у современных видеокарт

Читайте также: