Você pode e é bem fácil. O RPi possui um módulo Linux que implementa a API padrão de vigilância do Linux. Você pode encontrar documentação sobre isso aqui .
Agora, se você ler isso, saberá que existe um arquivo de dispositivo especial chamado /dev/watchdog
e, para usá- watchdog
lo, é necessário abrir esse arquivo e gravar alguns dados (um byte, é melhor escrever algo diferente de 'V' que eu ' estou explicando mais tarde) a ele de tempos em tempos. Se você não gravar nada nesse arquivo por tempo suficiente, watchdog
acionará uma reinicialização. Você pode encontrar um programa de exemplo (muito simples) aqui .
Observe que em uma situação normal, se você fechar /dev/watchdog
, watchdog
pode ser desativado. Existe um modo especial chamado 'Recurso Magic Close' que parece ser implementado por um driver RPi, mas o AFAIK não está ativado na configuração padrão do kernel (opção CONFIG_WATCHDOG_NOWAYOUT). Nesse caso, a reinicialização será acionada mesmo se você fechar, a /dev/watchdog
menos que você escreva 'V' antes de sair do aplicativo.
Você deve testar a si mesmo se está realmente desativado (não tenho uma RPi aqui agora para testar), mas se não estiver, não será bom para você. Se o seu aplicativo travar, o arquivo do dispositivo de vigilância será fechado e a reinicialização não será acionada, e é por isso que você deseja. Nessa situação, você pode alterar a configuração do kernel e reconstruí-la ou gravar um aplicativo personalizado que monitorará se o aplicativo principal está funcionando (usando algum método IPC, por exemplo).
Há também a API ioctl, que permite que você faça um pouco mais watchdog
. Você pode, por exemplo, definir um tempo limite diferente - IOCTL com WDIOC_SETTIMEOUT (parece ser suportado pelo driver RPI) ou obter tempo limite - IOCTL com WDIOC_GETTIMEOUT (que também parece ser suportado). Você pode usá-lo para modificar o tempo limite padrão (10 segundos). No entanto, há um limite rígido para 16 segundos. Aqui está um exemplo:
int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
Você também pode usar IOCTL com WDIOC_KEEPALIVE em vez de escrever um caractere, se desejar. Ambos os métodos são válidos.