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/watchdog
e per usarlo watchdog
devi 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, watchdog
attiverà un riavvio. Puoi trovare un programma di esempio (molto semplice) qui .
Si noti che in una situazione normale, se si chiude /dev/watchdog
, watchdog
può 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/watchdog
meno 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.