Kann ich einen Herzschlag von meinem eigenen Programm an Hardware Watch Dog senden?

14

Im Anschluss an die Frage und ausgezeichnete Antwort von Steve Robillard hier:

Wie setze ich einen Himbeer-Pi hart zurück?

Wie kann ich ein Heartbeat-Signal von meinem eigenen Programm an den Hardware-Watchdog des BCM2708 anstatt vom Linux-Watchdog-Daemon senden? Mit anderen Worten, ich möchte das RPi zurücksetzen, wenn MEIN Programm nicht ausgeführt wird (was beim Start ausgeführt wird), nicht nur, wenn das gesamte System eingefroren ist.

Vielen Dank.

Kerl
quelle
Nützlicher Anfang ... mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt
Alex Chamberlain

Antworten:

7

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/watchdogUm 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, watchdogwird ein Neustart ausgelöst. Ein (sehr einfaches) Beispielprogramm finden Sie hier .

Beachten Sie, dass in einer normalen Situation, wenn Sie schließen /dev/watchdog, watchdogdeaktiviert 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/watchdogProgramm 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.

Krzysztof Adamski
quelle
Oh, und ich habe vergessen - Sie können tatsächlich watchdogd dafür verwenden. Es unterstützt das Aufrufen eines externen Programms, das den Systemstatus überprüft und meldet. Lesen Sie "Check Binary" in dieser Manpage
Krzysztof Adamski
Vielen Dank. Ich habe es geschafft! Nach dem Hinzufügen von bcm2708_wdog zu / etc / modules habe ich eine einfache VB.NET-Test-App erstellt, um mein Verständnis zu überprüfen: Dimme fs als neues System.IO.FileStream (fn, IO.FileMode.Open), um den Timer zu starten, und fs.WriteByte ( H) dann fs.Flush (), um ihm Herzschläge zu senden. Funktioniert super!
Guy
Wie lautet die numerische Darstellung von WDIOC_KEEPALIVE? kann es nirgendwo finden.
Flash Thunder
@FlashThunder: Es ist hier definiert: lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29, aber Sie müssten einige Ebenen von Makros auflösen, um den genauen Wert zu finden. Der bessere Weg ist, einfach ein einfaches C-Programm zu schreiben, um den Wert zu drucken. Fügen Sie einfach die Datei <linux / watchdog.h> hinzu. Auf meinem System ist es0x80045705
Krzysztof Adamski