429 Too Many Requests

combs / Arduino-Watchdog-Handler Goto Github PK

Save power with this Arduino library for setting up an AVR watchdog interrupt routine.

Quick Arduino library for setting up an AVR watchdog interrupt routine.

Based off this work—thanks!

The ATMega328p processor used in many Arduinos has a «watchdog timer» that can trigger periodically. It can be used to reset an unresponsive program, or to call a function of your choice periodically.

The header included with the Arduino IDE has some nice functions for setting up the watchdog to reset your Arduino, but it’s a little more complicated to set up the watchdog timer (WDT) to call your own function. This library makes it easier.

Currently, this library supports the ATMega328p, ATMega168p, ATTiny85, ATTiny45, and ATTiny25.

The watchdog timer keeps running during many sleep modes on the Arduino. You can save a lot of battery power by using the watchdog timer and sleeping instead of delay() for periodic functions.

Install the library, then:

In your setup routine, add this as the very first line:

Then when you’re ready for a periodic function to start running, call:

You can choose values from 15ms up to 8 seconds.

Then it will call a specially-named function at the interval you chose:

There’s lots more information in the ATMega328p datasheet.

Any global variables used in the ISR(WDT_vect) function (really an Interrupt Service Routine) need to be declared volatile:

The ISR(WDT_vect) routine may hang with some standard Arduino functions. In particular, anything involving delay() seems to kill it.

You can always set a flag (my_variable=true) and take care of the delay-containing work in your loop function.

If you reset the Arduino, under some conditions, the watchdog timer may remain active after reset and misbehave. This is why it’s best to call wdt_disable() as the first line of your setup() routine.

I’ve read that the watchdog timer is not terribly precise.

You can’t go shorter than 15ms or longer than 8 seconds, although you can always keep a variable and accumulate up to the interval you want.

Example: if you want a 45-second watchdog timer, set it to WDTO_1S and increment a variable until it reaches 45. then do the actual work.


Idle Mode (холостой режим)

Для перевода платы Arduino в данный режим необходимо в ее биты SM[2,0] записать ‘000’. В этом режиме останавливает свою работу CPU (центральный процессор), однако интерфейсы SPI, TWI, USART, сторожевой таймер (Watchdog), счетчики (таймеры) и аналоговый компаратор продолжают работать. Режим Idle, в основном, останавливает CLKCPU и CLKFLASH. Плату Arduino можно вывести из этого режима с помощью внешнего или внутреннего прерывания.

Команда для Arduino на перевод ее в режим Idle выглядит следующим образом:

Этап третий. Установка драйвера WatchDog.

Если у вас установлена Windows 10, то сперва выполните отключение проверки наличия цифровой подписи у драйвера, Перейдя по этой ссылке >>

Чтобы установить драйвер для WatchDog, вам нужно, в меню «Пуск» найти папку «LibUSB-Win32».

В ней найдите и запустите программу «Inf Wizard».

image description

В открывшемся окне нажмите кнопку «Next».

image description

В открывшемся окне, в списке найдите строку, где «Vendor ID:0x16C0» и «Product ID:0x03E8», а в Description указано «USBWatchDog». Выберите эту строку и нажмите кнопку «Next».

image description

В следующем окне нажимаем просто «Next».

image description

Теперь открылось диалоговое окно сохранения драйвера. Создайте папку, например с названием «1» в корневом каталоге диска С (Как указано на примере). Нажмите кнопку «Сохранить»

image description

Автоматически откроется следующее окно. Найдите в нём и нажмите кнопку «Install now. » Начнётся автоматическая установка драйвера. Если у вас, Windows 10 и отключена проверка цифровой подписи драйверов, то установка пройдёт без каких-либо проблем. В противном случае, при установке может отобразится сообщение системы безопасности о том, что не удалось установить драйвер, т.к. нет цифровой подписи Microsoft. Для решения этой проблемы воспользуйтесь инструкциями по ссылкам, указанным ниже. После этого повторите установку драйвера согласно этапа 3.

Установка драйвера завершена.

Raspberry Pi. Поднимаем watchdog

При встраивании RPi, в отличии от устройств на МК есть два «тонких момента»:
1. RPi имеет операционную систему;
2. Операционная система может зависнуть.

В случае, если на RPi построена система, допустим, мониторинга процесса в реальном времени, любое зависание ОС приведет к неприятным последствиям. А теперь на минуту представим, что железка стоит за 3000 км от вас и по SSH вы уже не можете к ней подключиться. Поэтому необходима система автоматической проверки состояния системы и ее перезагрузки в случае, если произошло зависание RPi. Этим и занимается watchdog, или по-русски «сторожевой таймер». Важно заметить, что нельзя застраховаться от всех возможных причин зависания, т.к. кроме программных сбоев могут произойти сбои из-за внешней среды — перегрев, нестабильное питание, электромагнитные помехи, и т.д. Так что «надо обезопаситься и застраховаться. Вдруг что, а тут тебе на, компенсация» (c) Ноггано =))

Исходная точка:
1. Raspberry Pi (версия не важна)
2. Raspbian Debian Wheezy Version: January 2014 Release date: 2014-01-07.

Начинаем. И начнем, пожалуй, с теории.

Сторожевой таймер, watchdog timer или просто watchdog — аппаратная (железка), программная (программа, скрипт, часть программы) или программно-аппаратная (железка, управляемая программно) схема контроля за зависанием системы (операционной системы, GSM-модема, банкомата, роутера или чего-то еще). Представляет из себя таймер, который необходимо периодически сбрасывать контролируемой системой; если контролируемая система не сбрасывает watchdog в течении определенного времени, то происходит ее перезагрузка. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка, soft reset), в других же — перезагрузка происходит аппаратно (например, подачей нуля на ножку RST микроконтроллера; это т.н. hard reset).

С железной точки зрения, watchdog — это таймер, работающий в режиме прямого счета до определенного значения, которое может задаваться как программно, так и железно, в зависимости от его реализации. Можно обратиться по этой ссылке и посмотреть в картинках, что это значит. Зачастую, применительно к микроконтроллерам, если сторожевой таймер не используется по прямому назначению, его можно использовать как обычный таймер

Логика работы сторожевого таймера такова:
1. Запуск контролируемой системы;
2. Инициализация watchdog’а. В случае, если данный таймер программно-аппаратный, указываем период сброса (допустим, 1 секунда);
3. Если watchdog каждую секунду принимает сигнал сброса от контролируемой системы (в виде подачи какого-либо уровня на ножку МК, записи в файл, передачи параметров программе), то система работает в штатном режиме;
4. Если watchdog не принял сигнал сброса в течении более, чем 1 секунда, посредством сигнала о том, что «все очень плохо» он перезагружает контролируемую систему (soft reset, hard reset).

Более просто — представим себе сторожевой таймер реальным злым сторожевым псом, как на картинке выше. Если ему каждый час (период сброса) кидать кость (сигнал сброса), то он молчит. Но если более чем час не кидать ему кость, он может начать громко лаять и рычать(формирование сигнала о неправильной работе системы, зависании).

В англоязычных источниках можно чаще можно встретить выражение не «кинуть кость» — «throw a bone», еще вариант «кормить собаку» — «feeding the dog», а «пнуть собаку» — «kick the dog». Я так понимаю, это вопрос воспитания =))

ПРОГРАММНЫЙ WATCHDOG. СКРИПТ АВТОРЕКОННЕКТА WIFI

К примеру, программный watchdog для программы — это кусок кода, работающий параллельно и контролирующий основную программу.

Хорошим примером сторожевого таймера может являться следубщий пример — если вы конфигурируете подключение к сети Raspberry Pi без сторонних менеджеров, то есть через /etc/network/interfaces, встает следующая проблема — нет автоматического реконнекта при дропе. Решено это может быть программным сторожевым таймером — скриптом на Python 2.x, приведенном ниже:

Для запуска в фоновом режиме:

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

и завершить его работу нажатием Ctrl+C.

Вариант на тему — скрипт, взятый отсюда:

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

АППАРАТНЫЙ WATCHDOG

Чисто аппаратный сторожевой таймер представляет из себя отдельную схему, выполненную как на дискретных компонентах, так и в виде микросхемы. Одним из хороших примеров, может являться микросхема от Maxim Integrated MAX6323/24, схема включения которой показана на рисунке ниже.

Как нам говорит даташит и опыт, выход RESET — отрытый сток, в случае, если необходимо сбросить контролируемую микросхему, то данный выход сажается на землю, на RESET контролируемой микрухи подается 0 и выполняется hard reset.

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

ПРОГРАММНО-АППАРАТНЫЙ WATCHDOG

Watchdog превратился в современном понимании в программно-аппаратную реализацию. То есть, теперь watchdog — это встроенный, допустим, в микроконтроллер, управляемый регистрами таймер, формирующий сигнал сброса в случае, если кость ему не кидать в определенный период. Таким образом, в отличие от железного сторожевого таймера, программно-аппаратный имеет настройки, которые задают его поведение. Например, на msp430 это делается так. Также, если микросхема, которую мы хотим контролировать, не имеет встроенного сторожевого таймера, он может быть реализован на внешнем микроконтроллере (рекурсия — у которого тоже есть сторожевой таймер) с соответствующей прошивкой. Ну вот — на лицо и железка, и возможность конфигурации.

Таким образом, программно-аппаратный wathcdog может быть:
1. Частью микроконтроллера, системы-на-кристалле;
2. Внешним устройством, выполненном на микроконтроллере.

В Raspberry Pi он именно такой.

ПОДНИМАЕМ WATCHDOG НА RASPBERRY PI

Используемая в Raspberri Pi система-на-кристалле (SoC — System on Crystal) BCM2835 имеет встроенный сторожевой таймер, который умеет считать до 15 секунд.

Для его работы необходимо загрузить модуль в ядро:

Кроме этого, необходимо добавить в начало файла /etc/init.d/mathkernel следующие строки

Далее, как и во всем мире linux, есть два подхода — заморочиться и делать на самом низком уровне абстракции или воспользоваться готовым. Остановимся на втором варианте, а первый оставим для желающих позаниматься самостоятельно=))

Конечно же, уже есть готовый watchdog daemon. Установим его и chkconfig

После установки включим в автозагрузку watchdog и запустим его:

Далее отредактируем /etc/watchdog.conf

путем раскомментирования строчки watchdog-device = /dev/watchdog, тем самым указав точку монтирования сторожевого таймера демону. Для того, чтобы watchdog срабатывал и в тех случаях, когда список ожидающих выполнения процессов зашкаливает (говорит нам о том, что идет сильно не так), раскомментируем строчку max-load-1 = 24. тем самым мы говорим таймеру, что «если load average за минуту превысит 24, то watchdog должен перезагрузить операционку»

Также укажем параметры загрузки в ядро:

тем самым указывая параметры:
nowayout=1, данный параметр устанавливает, что watchdog не может быть остановлен другими программами, если он уже запущен;
heartbeat=13, где 13 — это время сброса в секундах. То есть не кинули кость за 13 секунд — получай резет.

После перезагрузки если выполнить команду dmesg | grep watchdog, получим такой вывод:

На этом watchdog появился и в вашей малинке. Остался один вопрос — а как проверить его работу?!

FORK-БОМБА
Чтобы посмотреть на сторожевой таймер в боевых условиях применим известный подход — Fork-Bomb (советую полностью прочитать и усвоить материал).

Для этого возьмем стандартную реализацию форк-бомбы на Питоне:

Система будет перезагружена через какое-то время. При форк-бомбах желательно отключить своп (в описанном примере это необязательно):

УБИВАЕМ WATCHDOG ЧЕРЕЗ kill -9

Кроме описанной форк-бомбы, можно проверить работу нашего сторожевого таймера посредством комманды

UPD ДЛЯ RASPBIAN JESSIE

Участник сообщества RoboCraft VecH в комментариях указал, что описанный выше способ не работает для Raspbian Jessie и предоставил следующие исправления:

На Debian Jessie надо изменить строку в файле /etc/default/watchdog добавив туда название модуля

Далее в файле /lib/systemd/system/watchdog.service надо добавить строчку после секции [install], должно стать вот таким:

И после включаем сервис средствами systemd

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

Оцените статью
Fobosworld.ru
Добавить комментарий

Adblock
detector