Na sequência da pergunta e excelente resposta fornecida por Steve Robillard aqui:
Como redefinir um Raspberry Pi?
Como posso enviar um sinal de pulsação do meu próprio programa para o watchdog de hardware do BCM2708 em vez do daemon de watchdog do Linux? Em outras palavras, desejo redefinir o RPi se o MY programa não estiver em execução (que é executado na inicialização), não apenas quando todo o sistema estiver congelado.
Obrigado.
Respostas:
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: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.
fonte
0x80045705