Posso enviar um batimento cardíaco para o watch watch de hardware do meu próprio programa?

14

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.

Cara
fonte

Respostas:

7

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/watchdoge, para usá- watchdoglo, é 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, watchdogacionará 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, watchdogpode 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/watchdogmenos 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.

Krzysztof Adamski
fonte
Ah, e eu esqueci - você pode realmente usar o watchdogd para isso. Ele suporta a chamada de um programa externo que verificará e reportará o estado do sistema. Leia "Check Binary" nesta página de manual
Krzysztof Adamski em
Obrigado. Eu consegui! Depois de adicionar bcm2708_wdog ao / etc / modules, criei um aplicativo de teste VB.NET simples para verificar meu entendimento: Dim fs As New System.IO.FileStream (fn, IO.FileMode.Open) para iniciar o timer em execução e fs.WriteByte ( H) depois fs.Flush () para enviar batimentos cardíacos. Funciona bem!
9132 Guy
qual é a representação numérica de WDIOC_KEEPALIVE? não consigo encontrá-lo em lugar algum.
Flash Thunder
@FlashThunder: está definido aqui: lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29, mas você teria que resolver alguns níveis de macros para encontrar o valor exato. A melhor maneira é escrever um programa C simples para imprimir o valor. Apenas inclua o <linux / watchdog.h>. No meu sistema é0x80045705
Krzysztof Adamski