Можна, і це досить просто. У 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 замість того, щоб писати символ, якщо хочете. Обидва методи дійсні.