Чи можу я надіслати серцебиття до апаратної сторожової собаки з власної програми?


14

Випливаючи з питання та чудової відповіді, надісланих Стівом Робільярдом тут:

Як мені важко скинути Raspberry Pi?

Як я можу надіслати сигнал серцебиття від власної програми на апаратну сторожову собаку BCM2708 замість демон-сторожа Linux Linux? Іншими словами, я хочу скинути RPi, якщо програма MY не працює (яка виконується при запуску), а не лише тоді, коли вся система заморожена.

Спасибі.


Відповіді:


7

Можна, і це досить просто. У RPi є модуль Linux, який реалізує стандартний API сторожової служби Linux. Ви можете знайти документацію про це тут .

Тепер, якщо ви прочитаєте це, ви дізнаєтесь, що існує спеціальний файл пристрою, який називається, /dev/watchdogі для його використання watchdogпотрібно відкрити цей файл і записати деякі дані (один байт, найкраще написати щось інше, ніж "V", яке я " м пояснюючи згодом) до неї час від часу. Якщо ви довго нічого не будете записувати в цей файл, watchdogвикличете перезавантаження. Ви можете знайти приклад програми (дуже простої) тут .

Зауважте, що в звичайній ситуації, якщо ви закриєтесь /dev/watchdog, watchdogїї можна відключити. Існує спеціальний режим під назвою "Чарівна функція закриття", який, здається, реалізується драйвером RPi, але в AFAIK він не включений у налаштуваннях ядра за замовчуванням (опція CONFIG_WATCHDOG_NOWAYOUT). У цьому випадку перезавантаження буде запущено, навіть якщо ви закриєте, /dev/watchdogякщо ви не напишете на неї "V" перед тим, як вийти з програми.

Ви повинні перевірити себе, чи справді він відключений (у мене зараз немає RPI для тестування), але якщо це не так, це не добре для вас. Якщо ваша програма вийде з ладу, файл пристрою сторожового собаки буде закритий, і перезавантаження не буде запущено, і саме тому ви цього хочете. У цій ситуації ви можете або змінити конфігурацію ядра та відновити його, або написати спеціальну програму, яка буде контролювати, чи працює ваша основна програма (наприклад, використовуючи якийсь метод IPC).

Також існує API ioctl, який дозволяє вам ще трохи зайнятися watchdog. Наприклад, ви можете встановити інший тайм-аут - IOCTL з WDIOC_SETTIMEOUT (схоже, він підтримується драйвером RPI) або отримати тайм-аут - IOCTL за допомогою WDIOC_GETTIMEOUT (який, здається, підтримується). Ви можете скористатися ним, щоб змінити час очікування за замовчуванням (10 секунд). Однак існує жорстке обмеження 16 секунд. Ось приклад:

int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);

Ви також можете використовувати IOCTL з WDIOC_KEEPALIVE замість того, щоб писати символ, якщо хочете. Обидва методи дійсні.


О, і я забув - ви можете насправді використовувати для цього сторожовий догд. Він підтримує виклик зовнішньої програми, яка перевірятиме стан системи та повідомляє про нього. Прочитайте "Перевірити бінарне" на цій сторінці чоловіка
Кшиштоф Адамський

Спасибі. У мене це працює! Після додавання bcm2708_wdog до / etc / модулів я створив простий тестовий додаток VB.NET, щоб перевірити своє розуміння: Dim fs As New System.IO.FileStream (fn, IO.FileMode.Open), щоб запустити роботу таймера і fs.WriteByte ( H) потім fs.Flush (), щоб надіслати серцебиття. Чудово працює!
Хлопець

що числове представлення WDIOC_KEEPALIVE? не можу знайти його ніде.
Flash Thunder

@FlashThunder: Тут визначено: lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29, але вам доведеться вирішити пару рівнів макросів, щоб знайти точне значення. Кращий спосіб - просто написати просту програму на C, щоб надрукувати значення. Просто включіть <linux / watchdog.h>. У моїй системі це0x80045705
Кшиштоф Адамський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.