Аппаратный «watchdog» или незаменимый помощник в борьбе с зависанием
В одной компании было много терминалов, и одна из неблагодарных задач для техподдержки — ездить по точкам и перезапускать операционную систему внутри терминалов. Было решено бросить вызов этой проблеме в виде разработки аппаратного сторожевого таймера.
В итоге мы получили устройство, которое подключается к расширительному спаренному USB-разъему на материнской плате.
Данное устройство имеет следующие возможности:
- Имитация нажатия кнопок POWER и RESET;
- Управление питанием USB-устройством (при условии, что у него нет отдельного источника);
- Управление гальванически развязанной контактной группой (реле). Можно поставить в разрез цепи питания;
- Индикаторные светодиоды (одним можно управлять, второй показывает режимы работы).
Алгоритм работы прост: внутри находятся два настраиваемых таймера, которые постоянно отсчитывают заданное время, по истечению которого имитируется нажатие соответствующих кнопок (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» («Сторожевая собака»), призвано отслеживать факт зависания контролируемой им системы и, в случае обнаружения зависания, принудительно эту систему перезагружать.
Сначала я напишу коротенький абзац для «новичков», чтобы было понятно, о чём я вообще тут говорю. Потом будет абзац для более подготовленных, которые, дочитав дотуда, всё ещё не захотят закрыть вкладку с обзором 🙂
Сторожевой таймер, сам по себе — это маленькая и довольно простая схемка. До тех пор, пока ей на вход периодически приходят сигналы от контролируемого девайса («да-да», «всё нормально», «я тут», «я работаю») — собака ведёт себя спокойно и никак не вмешивается. Как только сигналы перестают приходить, собака ждёт положенное время (обычно несколько секунд) и, если сигналов так и не пришло, она считает, что устройство зависло и посылает ему сигнал Reset, перезагружая его. Очевидно, что некая условная система, оборудованная таким модулем, будет более устойчива, по сравнению с аналогичной системой без watchdog: от зависаний не застрахован никто, но первая будет сама выбираться из этих зависаний, вторая же будет ждать и простаивать до вмешательства человека.
Сторожевой собаке абсолютно всё равно, какой величины и значимости систему она контролирует. Это может быть и копеечная воьминогая микросхема-микроконтроллер, и «малинка»-«апельсинка», и роутер, и домашний стационарный компьютер, и большой навороченный сервер. Ей лишь бы приходили сигналы об активности системы, да чтоб система, соответственно, реагировала на её импульс «Reset».
Конец абзаца.
Почему внешний watchdog, если в любом современном микроконтроллере есть встроенный? По двум основным причинам. Во-первых, бывают такие зависания, которые изнутри единого кристалла отследить нельзя: прерывания по таймеру живут, watchdog исправно ресетится, а программа, допустим, крутится в бесконечном цикле. Или ждёт импульса на какой-нибудь ноге, который дойти никак не может из-за какой-то аварии. Да мало что… Внешний же аппаратный сторож никак не связан с процессами внутри: пока у него есть питание, он будет сторожить.
Во-вторых, ардуино… Нельзя не признать, что доля DIY-микроконтроллерных проектов, реализуемых публикой на arduino, занимает значительную нишу. И приверженцы ардуино, увы, прелестями встроенного в атмегу сторожевого таймера воспользоваться не могут. Проблема описана. Вкратце: watchdog правильно работает только на некоторых Uno, остальные ардуины намертво «кладутся» при попытке использовать сторожевой таймер. Спасает только перешивка загрузчика внешним программатором. А новичков такая «хирургия», безусловно, пугает. Да и не у всех есть под рукой вторая ардуина, чтобы сделать из неё программатор для оживления первой, ушедшей в мёртвый цикл из-за использования встроенного watchdog. Все эти манипуляции новичка, вероятнее всего, попросту отпугнут.
Внешний же watchdog позволяет, используя arduino в своих проектах, в полной мере получать все прелести устойчивых систем, не заморачиваясь проблемами внутреннего сторожевого таймера.
Теперь, собственно, к самому обозреваемому модулю.
Размерами он сопоставим с Arduino Pro Mini:
С обратной стороны ничего интересного: только дорожки, соединяющие три переходных отверстия с пинами модуля. Да не очень качественно отмытый флюс:
Модуль построен на базе далласовского чипа DS1232.
Для тех, кто привык читать официальную литературу, вот даташит.
Чип обеспечивает сразу три функции: мониторинг питания, сторожевой таймер и формирование правильного импульса Reset (нужных фронтов, амплитуды и длительности), даже при дребезге контактов ручной кнопки перезагрузки.
На вывод ST должны приходить стробирующие импульсы от контролируемого устройства, говоряжие о его здоровом функционировании.
На выводах RST и /RST формируется перезагружающий импульс. Разница между выводами RST и /RST заключается исключительно в полярности перезагружающего импульса. Сигнал с вывода RST надо брать, если контролируемое устройство перезагружается логической единицей при нормальном нуле на линии сброса. Сигнал же /RST, наоборот, предназначен для устройств, перезагружаемых низким уровнем на линии сброса. Большинство современных микроконтроллеров (включая атмелловские, на базе которых построено и arduino) перезагружаются нулевыми импульсами, т.е. для них подходящим является сигнал /RST.
Вывод TOL выбирает приемлемость условий питающего напряжения.
— когда TOL прижат к земле, приемлемым считается пятипроцентный коридор отклонения напряжения. Т.е. сигнал перезагрузки придёт при снижении напряжения до 4,75V.
— когда TOL подключён к питающей линии, коридор питающего напряжения расширяется до 10%. Т.е. устройство будет перезагружено при снижении напряжения питания до 4,5V.
Выводом TD выбирается максимальное контрольное время, после которого сработает сторожевой таймер:
— когда TD прижат к земле, таймаут составляет 150ms (от экземпляра к экземпляру нормой будут значения 62,5ms — 250ms);
— когда TD висит в воздухе, таймаут составляет 600ms (от экземпляра к экземпляру 250ms — 1000ms);
— когда TD соединён с питанием, таймаут составляет 1200ms (от экземпляра к экземпляру 500ms — 2000ms). Выдержек свыше двух секунд данная микросхема не даст даже теоретически.
Продавец услужливо опубликовал схему модуля и его разводку:
Как видим из схемы, линии чипа ST, RST и /RST выведены, как одноимённые, и на пины модуля.
Производитель предоставил нам самое лояльное и комфортное включение чипа: максимально широкий коридор питающих напряжений (от 4,5 до 5V) и максимально возможный таймаут сторожевого таймера (1,2 секунды).
Теперь становится понятной схема подключения модуля к нашей условной ардуине:
— линии Vcc и Gnd на модуле подключаются к двум одноимённым линиям на arduino;
— линия /RST на модуле подключается к пину RST на ардуине
— линия ST подключается к любому свободному пину, желательно без аппаратного ШИМ, — допустим, у меня это пин 2.
Набросаем простенький скетч для проверки модуля. Я (исключительно для наглядности) при инициализации программно мигаю встроенным светодиодом. Этого можно было не делать, светодиод мигнёт и без нас. Но так — нагляднее и понятнее новичкам.
При значении задержки 1150 миллисекунд (в моём конкретном случае) или меньших, наша ардуина спокойно крутится в рабочем цикле, ей ничто не мешает. Светодиод, мигнув вначале, не светится — перезагрузок нет. Как только мы увеличим эту задержку хотя бы до 1200 миллисекунд (или внесём значительную задержку в процедуру Setup), мы увидим, что светодиод начнёт циклически вспыхивать: время для собаки становится критическим и она перезагружает ардуину.
В реальных же условиях рабочего скетча, достаточно внести строчкув самый конец основного цикла, чтобы сторожевой модуль, подключённый к пину 2, чувствовал себя спокойно.
При инициализации ардуины все пины передёргиваются, поэтому собаке абсолютно всё равно, на каком логическом уровне зависло устройство: таймер был запущен и, значит, перезагружающий импульс неминуемо придёт.
Выводы.
1. Нужен ли сторожевой таймер в принципе? Если в проектируемом вами устройстве зависания могут привести к негативным последствиям, то да. С ним система будет, очевидно, более устойчивой, чем без него.
2. Является ли внешний сторожевой таймер панацеей? Конечно, нет. Он более эффективен, чем внутренний, имеющийся во многих микроконтроллерах, но и он не панацея. Для достижения максимальной эффективности его работы, важно его подключить в правильное место вашей системы. Лучше не подключать его к линиям, на которых сигналы формируются аппаратно (ШИМ, различные аппаратные порты со стробами), а также к сигналам внешнего или внутреннего тактового генератора. Ну и абсолютно бессмысленно подключать его к линиям, работающим на вход — так мы будем контролировать не свой микроконтроллер, а что-то другое.
3. Есть ли минусы у этого сторожа? Главным минусом внешнего сторожевого таймера, в общем случае, является потребность в выделении для его работы одного пина на вашем устройстве. Хотя на практике, этого очень часто удаётся избежать: если ваш микроконтроллер что-то постоянно пишет или рисует на дисплее, что-то постоянно посылает в порты, формирует какие-то управляющие импульсы для внешних устройств — подключайте сторожевую собаку к этим линиям, — ей абсолютно безразличны частота и скважность импульсов, ей лишь бы была постоянная движуха.
Главным минусом конкретно этой реализации таймера я назову, пожалуй, довольно короткий контрольный таймаут. Бывают случаи, когда хотелось бы иметь запас хотя бы в 3-5 секунд.
4. Надо ли покупать именно этот watchdog? Ну, каждый решит для себя. Сторожевую собаку, совершенно точно, можно получить дешевле $3. Кому-то проще купить один лишь только обозреваемый выше чип и с помощью ЛУТ сделать такой модуль самому. Кому-то проще взять легендарный 555 и сделать сторожевой таймер на рассыпухе: плюсы — дёшево и доступно, минусы — больше возни и времязадающие электролитические конденсаторы, а, значит, с годами гарантированно поплывут все параметры. Кому-то проще сделать одновибратор с таймером вообще на полупроводниках. Тут каждый решает сам.
Здесь же за вполне посильные деньги мы получаем полностью готовое и рабочее устройство с нормированными параметрами.
Так что резонность покупки каждый оценит самостоятельно.
Моей же задачей было рассказать о таких устройствах, о принципах их работы и, возможно, дать кому-то творческий импульс для самостоятельного построения новых интересных самоделок.
Никто ничего не предоставлял и не спонсировал, всё куплено на свои.
UPD: Пока писал обзор, продавец неожиданно поднял цену. Упс. Будем считать это временным приступом жадности. На этот товар у него периодически бывает скидка. Ну и ничто не мешает искать этот товар у какого-то другого продавца.
Сторожевой таймер
Сторожевой таймер (контрольный таймер, англ. Watchdog timer ) — аппаратно реализованная схема контроля за зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка), в других же — перезагрузка происходит аппаратно (замыканием сигнального провода RST или подобного ему).
Физически сторожевой таймер может быть:
- Самостоятельным устройством.
- Компонентом устройства, например, микросхемой на материнской плате.
- Частью кристалла SoC.
Автоматизированные системы, не использующие оператора-человека, хотя тоже подвержены ошибкам, зависаниям и другим сбоям (в том числе аппаратным), с использованием сторожевых таймеров увеличивают стабильность работы — нет необходимости ручного сброса. Поэтому наиболее частое их использование — встроенные системы различного назначения.
Область применения
Контроль работы аппаратно-программных комплексов на основе ЭВМ
Такие таймеры позволяют не только отслеживать зависание операционной системы (и перезагружать её), но и отслеживать состояние отдельных программ и компонентов аппаратного обеспечения системы в целом, а также осуществлять проверку подключения ЭВМ к компьютерной сети.
Подобные таймеры используются, например, в банкоматах и терминалах по приему платежей.
Управление устройствами измерительной техники
В этом случае сторожевой таймер может использоваться как средство для отсчета временных интервалов, необходимых для осуществления периодических измерений.
См. также
Ссылки
Примечания
- Встраиваемые решения
- Компьютерное аппаратное обеспечение
Wikimedia Foundation . 2010 .
Полезное
Смотреть что такое «Сторожевой таймер» в других словарях:
Сторожевой — Сторожевой: Содержание 1 Подклассы кораблей 2 Корабли 3 Другое 4 См. также … Википедия
контрольный таймер — сторожевой таймер — [Л.Г.Суменко. Англо русский словарь по информационным технологиям. М.: ГП ЦНИИС, 2003.] Тематики информационные технологии в целом Синонимы сторожевой таймер EN watchdog timer … Справочник технического переводчика
WDT — Сторожевой таймер (контрольный таймер, англ. Watchdog timer) аппаратно реализованная схема контроля за зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение… … Википедия
Watchdog timer — Сторожевой таймер (контрольный таймер, англ. Watchdog timer) аппаратно реализованная схема контроля за зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение… … Википедия
Watchdog — Сторожевой таймер (контрольный таймер, англ. Watchdog timer) аппаратно реализованная схема контроля за зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение… … Википедия
Вотчдог — Сторожевой таймер (контрольный таймер, англ. Watchdog timer) аппаратно реализованная схема контроля за зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение… … Википедия
Вочдог — Сторожевой таймер (контрольный таймер, англ. Watchdog timer) аппаратно реализованная схема контроля за зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение… … Википедия
HDCP — Не следует путать с DHCP. У этого термина существуют и другие значения, см. HD. Работа с оптическими дисками Оптический диск Образ оптического диска, ISO образ Эмулятор оптических дисководов Программное обеспечение для работы с файловыми… … Википедия
PIC 16F876 — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники. Эта отметка… … Википедия
Платёжный терминал — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей … Википедия
Руководство для разработчика по сторожевым таймерам. Часть 1 — Общие сведения и назначение
Сторожевой таймер (WatchDog Timer, WDT) – это аппаратный модуль, который следит за выполнением программного кода и выполняет сброс процессора при зависании программы. На протяжении многих лет в мире встраиваемых систем продолжались яростные дискуссии относительно их важности. Многие инженеры считали, что сторожевые таймеры не нужны, что самым лучшим решением было бы написать надежную программу. Что тут скажешь, совершенство – благородная и заманчивая цель.
Однако немногие продукты когда-либо достигают такого уровня качества. При существующей скорости разрастания объемов программного обеспечения, даже бескомпромиссный акцент на качестве вряд ли приведет к совершенству. Миллион строк программного кода, даже если код корректен на 99.9% (причем это число гораздо выше, чем реально достигнуто подавляющим числом компаний), содержат 100 скрытых ошибок. Любая из них может вызвать сбой в системе, или еще хуже, ввести ее в опасный режим работы. Увы, среднее количество встраиваемых систем поставляется лишь с 95% устраненных ошибок.
Ошибки в программе не единственная проблема. Отлично спроектированное и построенное оборудование, на котором выполняется безупречный код, все равно может работать со сбоями.
Все чаще причиной проблем в цифровых системах становятся космические лучи. Состоящие в основном из протонов высокой энергии, они могут взаимодействовать с транзисторами микросхем и вызывать изменение состояния ячеек памяти. Для самых первых микропроцессоров это представляло меньшую угрозу, чем для современных, так как сегодня геометрические размеры 28 нм уже не редкость, а 45 нм стали нормой.
В 1990 году компания IBM подсчитала, что в типовом компьютере за счет космических лучей возникает одна ошибка в месяц на каждые 256 Мбайт ОЗУ. С тех пор топологические нормы значительно уменьшились и, предположительно, проблема обострилась.
Intel считает, что в будущем космические лучи могут стать источником еще более серьезных компьютерных ошибок. Компания запатентовала технологию (патент 7309866), по которой для обнаружения космических лучей и формирования корректирующих сигналов используется MEMS датчик.
Х. Кабаяши (H. Kobayashi) и др. обнаружили, что ошибок из-за космических лучей и других частиц в два с лишним раза больше в устройствах, выполненных по 180-нм технологии, чем в устройствах с проектными нормами 250 нм.
В 2004 году компания Tezzaron Semiconductor опубликовала результаты исследований, из которых следовало, что наиболее подвержены влиянию космических лучей модули SRAM и логика [5]. По утверждению авторов работы, в системе с 1 Гбайт SRAM ошибки могут возникать каждые две недели, а в Денвере, расположенном на уровне моря, проблема усугубляется в 10 раз.
Удивительно, что частица с ничтожным зарядом 10 фКл (фемтокулон) обладает достаточной энергией для переключения ячейки памяти SRAM. Еще десять лет назад, когда элементы микросхем были крупнее, для этого требовалась энергия в пять раз больше.
Вывод: даже идеально написанный код не в состоянии защитить от сбоя. Только сторожевой таймер может помочь восстановить работу системы.
Основные характеристики сторожевого таймера
Поскольку сторожевой таймер – это последняя «линия обороны», его архитектура должна предвидеть любые сбойные ситуации. Вы спросите, каковы же характеристики сторожевого таймера?
Прежде всего, сторожевой таймер должен быть независимым от процессора. В каком бы режиме не находился процессор, сторожевой таймер должен функционировать. Кроме того, после первоначальной настройки при инициализации процессор не должен иметь никакой возможности отключить или перепрограммировать сторожевой таймер. В противном случае сбой может привести к случайному отключению защитного механизма, что делает его бесполезным.
Сторожевой таймер всегда, при любых условиях, за исключением, возможно, аппаратных сбоев, может вернуть систему к жизни. Это предполагает подачу на процессор аппаратного сброса, и никакой другой способ не гарантирует восстановления работоспособности.
Некоторые сторожевые таймеры вместо сигнала сброса выдают немаскируемое прерывание. Идея состоит в том, что процедура обслуживания немаскируемых прерываний может сохранить содержимое стека и отладочную информацию. Увы, нет оснований полагать, что неправильно функционирующий процессор будет отвечать на любое прерывание. Имеется довольно много задач, которые должны быть выполнены прежде, чем будет вызван обработчик прерывания. На многих процессорах, например, процедура обработки прерывания не запустится, если указатель стека будет нечетным, или будет иметь не выровненные адреса. Более того, процессор может уйти в режим Double-Bus Fault, в котором он отключается, и восстановить работу может только аппаратный сброс.
Тем не менее, подход с немаскируемыми прерываниями интересен. Один из используемых иногда вариантов предполагает запуск таймера одновременно с выдачей немаскируемого прерывания. Через несколько миллисекунд таймер сбросит процессор, а затем обработчик прерывания, если он работает, сохранит отладочную информацию, но неизбежный аппаратный сброс гарантирует восстановление работы процессора.
Особенно важно, чтобы сторожевой таймер, независимо от состояния процессора, переводил систему в безопасное состояние, если она управляет угрожающим здоровью оборудованием. Подвижные части механизмов, источники опасного излучения и т.п. обязательно должны останавливаться или отключаться, так как сброс может не воздействовать на процессор, если процессор поврежден.
Нередко современные встраиваемые системы имеют очень сложные периферийные устройства, которые, в некоторых случаях, могут быть сложнее самого микропроцессора. Сигнал сброса от сторожевого таймера должен гарантировать, что все периферийные устройства и линии ввода/вывода перейдут в известное состояние. Программный сбой может привести к передаче искаженных потоков данных от процессора к периферии. Если архитектура периферийных устройств такова, что процессор не всегда может перевести их в определенное корректное состояние, эти устройства должны иметь возможность аппаратного сброса от сторожевого таймера.
Наконец имеет смысл, если это возможно, оставить отладочную информацию. Примером может служить упомянутая выше ситуация с немаскируемыми прерываниями. Сохранение стека и других критических данных в области энергонезависимой памяти, к которой разработчики могут получить доступ, обычно позволяет выявить источник проблемы. К сожалению, сброс уничтожает всю информацию о состоянии процессора, но зачастую имеются данные приложения, которые могут помочь в диагностике, например, указатели на таблицы состояний машины, которые можно сохранить перед инициализацией после сброса. Если есть часы реального времени, то можно сохранить и время сброса.