Самодельный watchdog на ребут. Arduino watchdog или автоматический RESET в случае зависания. Тестирование на watchdog

Самодельный watchdog на ребут. Arduino watchdog или автоматический RESET в случае зависания. Тестирование на watchdog

21.02.2019

Что же такое Watchdog или сторожевой таймер?

Сторожевой таймер (контрольный таймер , англ. Watchdog timer - букв. «сторожевой пёс») - аппаратно реализованная схема контроля над зависанием системы. Представляет собой таймер , который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная системы. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка), в других же - перезагрузка происходит аппаратно (замыканием сигнального провода RST или подобного ему).

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

В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки "Reset" компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.




Вот и вся схема:

Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт. Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.

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





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

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



Компонентты для сборки я покупал на Алиэкспресс:

Провода для макетной сборки http://ali.pub/22k78b

Ардуино УНО (точно подходит) http://ali.pub/22k7dd

Скетч Ардуино

int LedPin = 13;
int ResetPin = 12;
int val = 0;
int count = 0;
void setup()
{
Serial.begin(9600);
pinMode(LedPin,OUTPUT);

//пауза на запуск 2 мин
delay (120000);
}

void loop()
{
count++ ;

If (Serial.available() > 0)
{
val = Serial.read();
if (val == "H")
{
digitalWrite(LedPin,LOW);
digitalWrite(ResetPin,LOW);
count = 0;
}
else
{ count++ ;
}
}

If (count > 10)
{
digitalWrite(LedPin,HIGH);
digitalWrite(ResetPin,HIGH);
}
}

Скрипт отправляющий в порт данные:

(Get-Date).ToString("dd.MM.yyyy HH:mm") | Out-File c:\Users\miner\Desktop\reboot.txt -append

while($TRUE){
Start-Sleep -s 3
$port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine("H")
$port.Close()
}

Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.



Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания:

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

В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки «Reset» компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.

Вот и вся схема:

Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт. Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.

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

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

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

Компонентты для сборки я покупал на Алиэкспресс:

Провода для макетной сборки http://ali.pub/22k78b

Ардуино УНО (точно подходит) http://ali.pub/22k7dd

Скетч Ардуино

int LedPin = 13;
int ResetPin = 12;
int val = 0;
int count = 0;
void setup()
{
Serial.begin(9600);
pinMode(LedPin,OUTPUT);

//пауза на запуск 2 мин
delay (120000);
}

void loop()
{
count++ ;

if (Serial.available() > 0)
{
val = Serial.read();
if (val == ‘H’)
{
digitalWrite(LedPin,LOW);
digitalWrite(ResetPin,LOW);
count = 0;
}
else
{ count++ ;
}
}

delay (1000);

if (count > 10)
{
digitalWrite(LedPin,HIGH);
digitalWrite(ResetPin,HIGH);
}
}

Скрипт отправляющий в порт данные:

(Get-Date).ToString(‘dd.MM.yyyy HH:mm’) | Out-File c:\Users\miner\Desktop\reboot.txt -append

while($TRUE){
Start-Sleep -s 3
$port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine(«H»)
$port.Close()
}

Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.

Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания.

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

Целевой сервер на Gentoo используется мной в основном для экспериментов, однако на нём работает ряд сервисов, которые, по возможности, должны быть доступны без перебоев. К сожалению, последствия некоторых экспериментов приводят к kernel panic, 100% загрузке CPU и другим неприятностям в самый не подходящий момент. Так что идея добавить watchdog давно требовала внимания и наконец материализовалась в данное устройство.

После пристального осмотра того, что было в наличии и оценки доступного времени, оптимальным вариантом стал watchdog собранный на базе Arduino Nano. Примерно также появился и список требований:

  1. Запуск и останов демона, для работы с таймером, штатным средством ОС (OpenRC).
  2. Собственный watchdog на устройстве, в ATmega он есть, нужно использовать.
  3. Лог событий на устройстве для фиксации перезагрузки и срабатывания таймера.
  4. Синхронизация времени устройства с хостом для записи в лог корректного времени.
  5. Получение и отображение статуса устройства и записей его лога.
  6. Очистка лога и сброс устройства в исходное состояние.
Таким образом, «микроскоп» был найден, «гвоздь» обозначен… можно забивать.

Аппаратная часть

Основой устройства стал китайский клон Arduino Nano, выполненный на базе чипа CH340. Свежие Linux ядра (проверял начиная с 3.16) имеют подходящий драйвер, так что устройство легко обнаруживается как USB последовательный порт.

Нежелательная перезагрузка Arduino

При каждом подключение терминала, Arduino перезагружается. Причина в отправке терминалом сигнала DTR (Data Terminal Ready), который вызывает перезагрузку устройства. Таким образом Arduino IDE переводит устройсво в режим для загрузки скетчей.

Существует несколько вариантов решения проблемы, но рабочим оказался только один - необходимо установить электролит 10µF (C1 на схеме ниже) между контактами RST и GND. К сожалению, это также блокирует загрузку скетчей на устройство.

Как итог - схема получилась следующий:


Нарисовано с помощью KiCad

Пояснения к схеме

  • R1 - резистор для ограничения тока, рассчитывается согласно спецификации на оптопару PC817: (5V - 1.2V / 0.02A) = 190Ω , ближайшей стандартный номинал 180Ω.
  • U2 - оптопара для гальванической развязки Arduino и PC. Можно обойтись и транзистором, так как земля общая (через USB разъем), но лучше не нужно.
  • JP1 - джампер, в рабочем положении должен быть замкнут. Для загрузки скетча на устройство его необходимо разомкнуть.
  • С1 - конденсатор, блокирует перезагрузку устройства в ответ на сигнал DTR.
  • MB_RST , MB_GND - RESET активен при низком уровне сигнала, соответственно нужно замкнуть RST на землю (GND). В оптопаре используется транзистор, следовательно важно соблюсти полярность.
  • BTN_RST , BTN_GND - кнопка на корпусе, обычно это механический переключатель, следовательно, полярность не важна, но бывают исключения.

Boot-loop (циклическая перезагрузка) при работе с WDT

Микроконтроллеры ATmega имеют встроенный механизм перезагрузки по таймеру WDT (WatchDog Timer). Однако все попытки использовать данную функцию приводили к boot-loop, выйти из которого можно было только отключив питание.

Не долгие поиски выявили, что загрузчики большинства клонов Arduino не поддерживают WDT. К счастью, данная проблема была решена в альтернативном загрузчике Optiboot .

Для того, чтобы прошить загрузчик, необходим программатор умеющий работать по протоколу SPI, также желательно, чтобы Arduino IDE знала это устройство «в лицо». В данном случае идеально подойдёт ещё одна Arduino.

Если взять Arduino UNO, в качестве программатора, и последнию на данный момент версию Arduino IDE v1.6.5, то алгоритм будет следующий:

После этой процедуры, загружать скетчи в Arduino Nano нужно будет выбирая те-же настройки - Board : Optiboot on 32 pin cpus, Processor : ATmega328p, CPU Speed : 16MHz.

Пайка

Далее необходимо всё спаять, так чтобы выглядело одним куском.

Здесь USB штекер понадобился из-за того, что у меня mini-ITX мат.плата только с одним разъем на пару USB2.0, которые нужны на передней панели, а к контактной площадке USB3.0 нечем было подключиться. По возможности такие устройства нужно подключать прямо к мат.плате, чтобы провода наружу не торчали.

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

Как паять дорожки на макетной плате

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

Выглядеть должно примерно так:



Результат:

Здесь может показаться, что некоторые контакты плохо пропаяны, но это всего лишь флюс. Расход припоя на макетных платах достаточно большой, поэтому флюсом тут заляпано всё, что только можно. На самом деле, это хороший пример как не нужно оставлять изделие после пайки. Флюс необходимо смыть, иначе могут быть проблемы с коррозией соединений. Допишу и пойду отмывать… Вот так лучше:

Программная часть

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

Подключение watchdog

При подключении watchdog создается файл устройства, содержащий порядковый номер. Если в системе есть другие ttyUSB устройства (в моём случае - модем), то возникает проблема с нумерацией. Чтобы однозначно идентифицировать устройство, необходимо создать симлинк с уникальным именем. Для этого предназначен udev, который наверняка уже есть в системе.

Для начала нужно визуально найти подключённый watchdog, например, подсмотрев в системный лог файл. Затем, заменив /dev/ttyUSB0 на нужное устройство, написать в терминале:

Udevadm info -a -p "$(udevadm info -q path -n /dev/ttyUSB0)"

Пример вывода

looking at device "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0/tty/ttyUSB0": KERNEL=="ttyUSB0" SUBSYSTEM=="tty" ... looking at parent device "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0": KERNELS=="ttyUSB0" SUBSYSTEMS=="usb-serial" DRIVERS=="ch341-uart" ... looking at parent device "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0": ... looking at parent device "/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4": SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{idVendor}=="1a86" ATTRS{idProduct}=="7523" ATTRS{product}=="USB2.0-Serial" ...


В данном случае, правило будет иметь следующий вид: ACTION=="add", KERNEL=="ttyUSB*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyrst-watchdog"

Разместить его нужно в отдельном файле в директории /etc/udev/rules.d , например 51-ttyrst-watchdog.rules и скомандовать udev перезагрузить правила: udevadm control --reload-rules

С этого момента, при подключении watchdog будет создаваться ссылка /dev/ttyrst-watchdog на нужное устройство, которая и будет использоваться далее.

Bash скрипт (ttyrst-watchdog.sh)

Общение с watchdog производится на скорости 9600 бод. Arduino без проблем работает с терминалами на больших скоростях, но команды для работы с текстом (cat, echo и т.п.), получают и отправляют только мусор. Не исключено, что это особенность только моего экземпляра Arduino Nano.

Для основного цикла перезапуска таймера и для функций командной строки, используется один скрипт. Причина в том, что оба компонента используют общий ресурс - файл устройства, и к нему необходимо обеспечить синхронный доступ.

Синхронизация по сути состоит цикла ожидания: while fuser ${DEVICE} >/dev/null 2>&1; do true; done и захвата устройства на необходимое время: cat <${DEVICE}

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

Демонизация (запуск в фоновом режиме) производится средствами пакета OpenRC. Предполагается, что данный скрипт находится в файле /usr/local/bin/ttyrst-watchdog.sh , а OpenRC скрипт в /etc/init.d/ttyrst-watchdog .

При остановке демона требуется корректная дезактивации watchdog. Для этого в скрипте устанавливается обработчик сигналов, требующих завершение работы: trap deactivate SIGINT SIGTERM И тут всплывает проблема - OpenRC не может остановить демон, точнее может, но не часто.

Дело в том, что команда kill, отправляет сигнал скрипту, а программа sleep, которая используется для приостановки работы скрипта, выполняется в другом процессе и сигнал не получает. В результате функция deactivate запускается только после завершения работы sleep, а это слишком долго.

Решение заключается в том, чтобы запустить sleep в фоне и ждать завершения процесса в скрипте: sleep ${SLEEP_TIME} & wait $! # переменная $! содержит ID последнего запущенного процесса

Основные константы:

WATCHDOG_ACTIVE - YES или NO, соответственно, отправлять сигнал на перезагрузку при срабатывании таймера или нет.
WATCHDOG_TIMER - время в секундах на которое устанавливается таймер.
SLEEP_TIME - время в секундах через которое необходимо перезапускать таймер. Должно быть много меньше, чем WATCHDOG_TIMER, но не сильно маленькое, что бы не создавать чрезмерную нагрузку на систему и устройство. При текущих таймаутах разумный минимум - примерно 5 секунд.
DEFAULT_LOG_LINES - число последних записей лога устройства, возвращаемых командой log по умолчанию.

Команды скрипта:

start - запуск основного цикла перезапуска таймера. В функцию is_alive можно добавить код дополнительных проверок, например проверить возможность подключения по ssh.
status - вывод статуса устройства.
reset - обнуление EEPROM (данных лога) и перезагрузка устройства для приведения watchdog в исходное состояние.
log <число записей> - вывод заданного числа последних записей лога.

Arduino скетч (ttyrst-watchdog.ino)

Для успешной компиляции скетча потребуется сторонняя библиотека Time , необходимая для синхронизации времени.

Скетч состоит из двух файлов. Это связанно с тем, что Arduino IDE не воспринимает структуры (struct) объявленные в основном файле, их необходимо выносить во внешней файл заголовков. Также для объявления структуры не обязательно ключевое слово typedef, вероятно даже вредно… проверив стандартные варианты, подобрать подходящий синтаксис у меня не получилось. В остальном это более или менее стандартный C++.

Функции wdt_enable и wdt_reset работают со встроенным в микроконтроллер watchdog. После инициализации WDT главное не забывать сбрасывать его в основном цикле и внутри циклов всех длительных операций.

Записи лога пишутся в энергонезависимую память EEPROM, доступный её размер можно указать в logrecord.h, в данном случае это число 1024. Лог выполнен в виде кольца, разделителем служит структура с нулевыми значениями. Максимальное число записей для 1 KiB EEPROM - 203.

  • wdt
  • bash
  • sketch
  • Добавить метки

    Ни для кого не секрет, что любая цифровая техника, рано или поздно, «зависает». Это всегда неожиданность для разработчика и это всегда неприятность для пользователя. Это всегда невовремя и это, увы, никак не прогнозируется. И неважно, самодельная ли это «мигалка на ёлку» на одной микросхеме-микроконтроллере или сложный сервер, работающий в нагруженной сети, - лучше бы этих зависаний не было. А бывают такие системы, зависание которых обходится очень и очень дорого.
    Устройство, называемое «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.

    Набросаем простенький скетч для проверки модуля. Я (исключительно для наглядности) при инициализации программно мигаю встроенным светодиодом. Этого можно было не делать, светодиод мигнёт и без нас. Но так - нагляднее и понятнее новичкам.
    void setup() { pinMode(13, OUTPUT); // Используем внутренний светодиод pinMode(2, OUTPUT); // С этого пина Watchdog будет получать сигналы digitalWrite(13, HIGH); delay(50); // Коротко мигнём светодиодом при каждой перезагрузке digitalWrite(13, LOW); } void loop() { digitalWrite(2, HIGH); delay(2); // Формируем короткий перепад digitalWrite(2, LOW); delay(1150); // Максимально длинный таймаут } При значении задержки 1150 миллисекунд (в моём конкретном случае) или меньших, наша ардуина спокойно крутится в рабочем цикле, ей ничто не мешает. Светодиод, мигнув вначале, не светится - перезагрузок нет. Как только мы увеличим эту задержку хотя бы до 1200 миллисекунд (или внесём значительную задержку в процедуру Setup), мы увидим, что светодиод начнёт циклически вспыхивать: время для собаки становится критическим и она перезагружает ардуину.
    В реальных же условиях рабочего скетча, достаточно внести строчку digitalWrite(2,HIGH); delay(1); digitalWrite(2,LOW); в самый конец основного цикла, чтобы сторожевой модуль, подключённый к пину 2, чувствовал себя спокойно.
    При инициализации ардуины все пины передёргиваются, поэтому собаке абсолютно всё равно, на каком логическом уровне зависло устройство: таймер был запущен и, значит, перезагружающий импульс неминуемо придёт.

    Выводы.
    1. Нужен ли сторожевой таймер в принципе? Если в проектируемом вами устройстве зависания могут привести к негативным последствиям, то да. С ним система будет, очевидно, более устойчивой, чем без него.

    2. Является ли внешний сторожевой таймер панацеей? Конечно, нет. Он более эффективен, чем внутренний, имеющийся во многих микроконтроллерах, но и он не панацея. Для достижения максимальной эффективности его работы, важно его подключить в правильное место вашей системы. Лучше не подключать его к линиям, на которых сигналы формируются аппаратно (ШИМ, различные аппаратные порты со стробами), а также к сигналам внешнего или внутреннего тактового генератора. Ну и абсолютно бессмысленно подключать его к линиям, работающим на вход - так мы будем контролировать не свой микроконтроллер, а что-то другое.

    3. Есть ли минусы у этого сторожа? Главным минусом внешнего сторожевого таймера, в общем случае, является потребность в выделении для его работы одного пина на вашем устройстве. Хотя на практике, этого очень часто удаётся избежать: если ваш микроконтроллер что-то постоянно пишет или рисует на дисплее, что-то постоянно посылает в порты, формирует какие-то управляющие импульсы для внешних устройств - подключайте сторожевую собаку к этим линиям, - ей абсолютно безразличны частота и скважность импульсов, ей лишь бы была постоянная движуха.
    Главным минусом конкретно этой реализации таймера я назову, пожалуй, довольно короткий контрольный таймаут. Бывают случаи, когда хотелось бы иметь запас хотя бы в 3-5 секунд.

    4. Надо ли покупать именно этот watchdog? Ну, каждый решит для себя. Сторожевую собаку, совершенно точно, можно получить дешевле $3. Кому-то проще купить один лишь только обозреваемый выше чип и с помощью ЛУТ сделать такой модуль самому. Кому-то проще взять легендарный и сделать сторожевой таймер на рассыпухе: плюсы - дёшево и доступно, минусы - больше возни и времязадающие электролитические конденсаторы, а, значит, с годами гарантированно поплывут все параметры. Кому-то проще сделать одновибратор с таймером вообще на полупроводниках. Тут каждый решает сам.
    Здесь же за вполне посильные деньги мы получаем полностью готовое и рабочее устройство с нормированными параметрами.
    Так что резонность покупки каждый оценит самостоятельно.

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

    Никто ничего не предоставлял и не спонсировал, всё куплено на свои.

    UPD : Пока писал обзор, продавец неожиданно поднял цену. Упс. Будем считать это временным приступом жадности. На этот товар у него периодически бывает скидка. Ну и ничто не мешает искать этот товар у какого-то другого продавца.

    Планирую купить +92 Добавить в избранное Обзор понравился +86 +164

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

    В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки «Reset» компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.

    Вот и вся схема:

    Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт. Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
    После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.

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

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

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

    Компонентты для сборки я покупал на Алиэкспресс:

    Провода для макетной сборки http://ali.pub/22k78b

    Ардуино УНО (точно подходит) http://ali.pub/22k7dd

    Arduino uno с кабелем http://ali.pub/22k7go

    Скетч Ардуино

    int LedPin = 13;
    int ResetPin = 12;
    int val = 0;
    int count = 0;
    void setup()
    {
    Serial.begin(9600);
    pinMode(LedPin,OUTPUT);

    //пауза на запуск 2 мин
    delay (120000);
    }

    void loop()
    {
    count++ ;

    if (Serial.available() > 0)
    {
    val = Serial.read();
    if (val == ‘H’)
    {
    digitalWrite(LedPin,LOW);
    digitalWrite(ResetPin,LOW);
    count = 0;
    }
    else
    { count++ ;
    }
    }

    delay (1000);

    if (count > 10)
    {
    digitalWrite(LedPin,HIGH);
    digitalWrite(ResetPin,HIGH);
    }
    }

    Скрипт отправляющий в порт данные:

    (Get-Date).ToString(‘dd.MM.yyyy HH:mm’) | Out-File c:UsersminerDesktopreboot.txt -append

    while($TRUE){
    Start-Sleep -s 3
    $port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
    $port.open()
    $port.WriteLine(«H»)
    $port.Close()
    }

    Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.

    Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания:

    start PowerShell.exe -ExecutionPolicy ByPass -File «c:путь к вашему файлуваш файл.ps1»

    Файл сохраняем с расширением *.bat и ставим его в автозагрузку.

    Радуемся, теперь у нас все автоматизированно. Устройство испытано на своем ПК и польностью работает.

    Подписывайтесь на Bitnovosti в telegram!

    Делитесь вашим мнением об этой новости в комментариях под статьёй.



    © 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows