Могу ли я послать сердцебиение аппаратному сторожу из моей собственной программы?


14

Исходя из вопроса и превосходного ответа, предоставленного Стивом Робиллардом здесь:

Как мне сделать жесткий сброс Raspberry Pi?

Как я могу послать сигнал пульса из моей собственной программы в аппаратный сторожевой таймер BCM2708 вместо демона сторожевого таймера Linux? Другими словами, я хочу сбросить RPi, если МОЯ программа не запущена (которая выполняется при запуске), а не только тогда, когда вся система заморожена.

Благодарю.


Ответы:


7

Можно и это довольно просто. RPi имеет модуль Linux, который реализует стандартный Linux watchdog API. Вы можете найти документацию об этом здесь .

Теперь, если вы прочитаете это, вы узнаете, что существует специальный файл устройства, /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 вместо написания символа, если хотите. Оба метода действительны.


О, и я забыл - вы можете использовать Watchdogd для этого. Он поддерживает вызов внешней программы, которая будет проверять и сообщать о состоянии системы. Прочтите «Проверьте двоичные файлы» на этой странице
руководства

Благодарю. Я получил это работает! После добавления bcm2708_wdog в / etc / modules я создал простое тестовое приложение VB.NET для проверки моего понимания: Dim fs As New System.IO.FileStream (fn, IO.FileMode.Open) для запуска таймера и fs.WriteByte ( H) затем fs.Flush (), чтобы отправить ему сердцебиение. Прекрасно работает!
Парень

что такое числовое представление WDIOC_KEEPALIVE? не могу найти это нигде.
Вспышка грома

@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.