Sie können und es ist ganz einfach. RPi verfügt über ein Linux-Modul, das die Standard-Linux-Watchdog-API implementiert. Dokumentation dazu finden Sie hier .
Wenn Sie dies lesen, werden Sie wissen, dass es eine spezielle Gerätedatei gibt, die aufgerufen wird. /dev/watchdog
Um sie zu verwenden watchdog
, müssen Sie diese Datei öffnen und einige Daten schreiben (ein Byte, am besten schreiben Sie etwas anderes als 'V', das ich '. Ich erkläre es später) von Zeit zu Zeit. Wenn Sie nicht lange genug in diese Datei schreiben, watchdog
wird ein Neustart ausgelöst. Ein (sehr einfaches) Beispielprogramm finden Sie hier .
Beachten Sie, dass in einer normalen Situation, wenn Sie schließen /dev/watchdog
, watchdog
deaktiviert werden kann. Es gibt einen speziellen Modus namens 'Magic Close Feature', der von einem RPi-Treiber implementiert zu werden scheint, aber AFAIK ist in der Standardkernelkonfiguration nicht aktiviert (CONFIG_WATCHDOG_NOWAYOUT-Option). In diesem Fall wird ein Neustart ausgelöst, auch wenn Sie das /dev/watchdog
Programm schließen, es sei denn, Sie schreiben kurz vor dem Beenden der App ein 'V'.
Sie sollten sich selbst testen, ob es tatsächlich deaktiviert ist (ich habe hier gerade kein RPi zum Testen), aber wenn dies nicht der Fall ist, ist es nicht gut für Sie. Wenn Ihre Anwendung abstürzt, wird die Watchdog-Gerätedatei geschlossen und ein Neustart wird nicht ausgelöst. Aus diesem Grund möchten Sie dies tun. In dieser Situation können Sie entweder die Kernelkonfiguration ändern und neu erstellen oder eine angepasste Anwendung schreiben, die überwacht, ob Ihre Hauptanwendung funktioniert (z. B. mit einer IPC-Methode).
Es gibt auch die ioctl-API, mit der Sie noch mehr tun können watchdog
. Sie können beispielsweise ein anderes Zeitlimit festlegen - IOCTL mit WDIOC_SETTIMEOUT (scheint vom RPI-Treiber unterstützt zu werden) oder ein Zeitlimit abrufen - IOCTL mit WDIOC_GETTIMEOUT (scheint ebenfalls unterstützt zu werden). Sie können es verwenden, um das Standardzeitlimit (10 Sekunden) zu ändern. Es gibt jedoch eine feste Grenze von 16 Sekunden. Hier ist ein Beispiel:
int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
Sie können IOCTL auch mit WDIOC_KEEPALIVE verwenden, anstatt ein Zeichen zu schreiben, wenn Sie möchten. Beide Methoden sind gültig.