Posso inviare un battito cardiaco a watch dog hardware dal mio programma?


14

Seguendo la domanda e la risposta eccellente fornite da Steve Robillard qui:

Come faccio a resettare un Raspberry Pi?

Come posso inviare un segnale di battito cardiaco dal mio programma al watchdog hardware del BCM2708 anziché dal demone watchdog di Linux? In altre parole, voglio ripristinare l'RPI se il programma MY non è in esecuzione (che viene eseguito all'avvio), non solo quando l'intero sistema è bloccato.

Grazie.


Risposte:


7

Puoi ed è abbastanza facile. RPi ha un modulo Linux che implementa l'API di watchdog Linux standard. Puoi trovare la documentazione di questo qui .

Ora, se leggi questo, saprai che esiste un file speciale per dispositivo chiamato /dev/watchdoge per usarlo watchdogdevi aprire questo file e scrivere alcuni dati (un byte, è meglio scrivere qualcosa di diverso da "V" che io " spiegherò più avanti) di tanto in tanto. Se non scriverai nulla su questo file abbastanza a lungo, watchdogattiverà un riavvio. Puoi trovare un programma di esempio (molto semplice) qui .

Si noti che in una situazione normale, se si chiude /dev/watchdog, watchdogpuò essere disabilitato. Esiste una modalità speciale chiamata 'Funzione Magic Close' che sembra essere implementata da un driver RPi ma AFAIK non è abilitato nella configurazione del kernel predefinita (opzione CONFIG_WATCHDOG_NOWAYOUT). In questo caso, il riavvio verrà attivato anche se si chiude a /dev/watchdogmeno che non si scriva "V" appena prima di chiudere l'app.

Dovresti metterti alla prova se è effettivamente disabilitato (non ho un RPi qui in questo momento per testare), ma se non lo è, non è un bene per te. Se l'applicazione si arresta in modo anomalo, il file del dispositivo di controllo verrà chiuso e il riavvio non verrà attivato ed è per questo che lo si desidera. In questa situazione, è possibile modificare la configurazione del kernel e ricostruirla o scrivere un'applicazione personalizzata che controllerà se l'applicazione principale funziona (utilizzando ad esempio un metodo IPC).

C'è anche l'API ioctl che ti permette di fare un po 'di più con watchdog. Ad esempio, è possibile impostare un timeout diverso - IOCTL con WDIOC_SETTIMEOUT (sembra essere supportato dal driver RPI) o ottenere il timeout - IOCTL con WDIOC_GETTIMEOUT (che sembra essere supportato). È possibile utilizzarlo per modificare il timeout predefinito (10 secondi). Vi è tuttavia un limite massimo a 16 secondi. Ecco un esempio:

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

Puoi anche usare IOCTL con WDIOC_KEEPALIVE invece di scrivere un personaggio se vuoi. Entrambi i metodi sono validi.


Oh, e ho dimenticato - puoi davvero usare watchdogd per questo. Supporta la chiamata di un programma esterno che controllerà e segnalerà lo stato del sistema. Leggi "Controlla binario" in questa pagina man
Krzysztof Adamski il

Grazie. Ho funzionato! Dopo aver aggiunto bcm2708_wdog a / etc / modules ho creato una semplice app di test VB.NET per verificare la mia comprensione: Dim fs As New System.IO.FileStream (fn, IO.FileMode.Open) per avviare il timer e fs.WriteByte ( H) quindi fs.Flush () per inviargli i battiti del cuore. Funziona alla grande!
Guy

qual è la rappresentazione numerica di WDIOC_KEEPALIVE? non riesco a trovarlo da nessuna parte.
Flash Thunder,

@FlashThunder: è definito qui: lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29 ma dovresti risolvere un paio di livelli di macro per trovare il valore esatto. Il modo migliore è semplicemente scrivere un semplice programma C per stampare il valore. Includi solo <linux / watchdog.h>. Sul mio sistema è0x80045705
Krzysztof Adamski il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.