Utilizando watchdog no Linux embarcado

watchdog no Linux embarcado

Introdução

O uso de sistemas eletrônicos que fazem uso de um sistema operacional embarcado tem crescido substancialmente nos últimos anos, em todos os segmentos possíveis e imagináveis: em eletrodomésticos, automóveis, aviões, telefones celulares, roteadores, etc.

E quando se fala em sistemas embarcados, é intrínseco que tais dispositivos, em seu uso comum, sejam submetidos às mais variadas e imprevisíveis situações, citando como exemplo: exposição ao calor, operação em ambientes eletromagneticamente hostis, operação sob vibrações mecânicas intensas e tudo mais que o “mundo real” pode oferecer aos dispositivos eletrônicos usados massivamente. Sendo assim, como fazer com que um dispositivo embarcado (sobretudo àqueles que trabalham em locais de difícil acesso) que passa por uma situação extrema do ambiente de operação ou por um bug grave de software, causando seu travamento, possa se restabelecer e voltar ao funcionamento normal sem nenhuma intervenção humana? Uma das formas de se garantir isso é fazer uso de watchdog.

Este artigo vai mostrar como fazer uso do watchdog com o Linux embarcado, de forma a aumentar a confiabilidade no uso de dispositivos eletrônicos com este sistema operacional em situações reais de uso.

Começando pelo começo: o que é watchdog?

Em suma, o watchdog consiste em um timer que, se atingido o overflow (ou seja, se a contagem de tempo atingir o valor máximo especificado nele), provoca um reset/reboot do dispositivo eletrônico em questão. Logo, para não ocorrer o reset, o watchdog timer necessita ser “zerado” de tempos em tempos (tempo esse sempre inferior ao tempo máximo / tempo de estouro deste timer), de forma a não permitir que o timer chegar ao ponto de provocar o reboot. Este processo de zerar o watchdog timer é popularmente conhecido como feed ou kick do watchdog.

Dessa forma, se qualquer fenômeno (que cause travamento) acontecer ou se o programa que faz o feed no watchdog parar, o sistema será reiniciado de forma a poder se restabelecer.

Portanto, em termos práticos, tem-se duas condições de uso com watchdog timer:

  • Se algum programa / rotina do software faz o feed do watchdog timer antes do valor máximo de tempo nele configurado, está tudo bem.
  • Caso contrário, um reboot acontece, com o objetivo de permitir que o sistema eletrônico saia da situação de travamento em que se encontra e possa funcionar normalmente de novo.

Tipos de watchdog

Essencialmente, há dois tipos de watchdog: watchdog via hardware e watchdog via software. O watchdog via hardware consiste realmente de um timer no hardware do microcontrolador ou SoC, sendo a opção mais confiável disponível. Já o watchdog via software consiste em um processo/tarefa dentro do software embarcado, sendo portanto menos confiável devido a estar vulnerável a uma situação de mal funcionamento generalizado do sistema operacional embarcado.


O Linux embarcado é capaz de, com as configurações adequadas, exportar o acesso ao watchdog de hardware do SoC que irá rodá-lo. O feed deste watchdog é feito via abertura e escrita no arquivo /dev/watchdog.

Habilitando suporte ao watchdog no Linux embarcado


Para habilitar o suporte ao watchdog no Linux embarcado, o Kernel precisa ser compilado com as seguintes Kernel configs setadas

Kernel config obigatória:

  • CONFIG_WATCHDOG: precisa ser setada em Y para habilitar o suporte ao watchdog no Linux.

Kernel config opcional, porém muito importante em casos de missão crítica:

  • CONFIG_WATCHDOG_NOWAYOUT: no valor padrão (N) o watchdog timer é desligado caso a aplicação que o está alimentando fechar o arquivo /dev/watchdog (o que acontece, por exemplo, no caso do processo que faz o feed ser encerrado). Com o valor Y, o watchdog timer é mantido e o reset ocorrerá normalmente quando o tempo se esgotar.


Ainda, é importante ressaltar os seguintes pontos sobre o uso de watchdog no Linux:

  • O feed ao watchdog no Linux deve ser feito por um único processo, rodado por um único usuário. Ou seja, não deve haver mais de um processo fazendo feed no watchdog.
  • Como o watchdog utilizado é um timer particular do SoC e, portanto, específico do hardware em que rodará o Linux, o watchdog tem muitas de suas características configuradas via device tree. Dentre as configurações, está o tempo máximo permitido sem feed de watchdog.
  • O watchdog só começa a funcionar de fato após a abertura do arquivo /dev/watchdog. Isso significa que, se você somente habilitar as Kernel configs necessárias e configurar o watchdog em device tree, o watchdog não vai operar “sozinho” ao se inicializar o Linux.

Testando o watchdog em uma Raspberry Pi Zero W


Para testar o watchdog de forma que seja provocado um reboot após um tempo sem feed em uma Raspberry Pi Zero W, siga o procedimento abaixo. Neste procedimento, usei a imagem mais recente disponível do Raspberry Pi OS Lite no momento da escrita deste artigo (https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2022-01-28/2022-01-28-raspios-bullseye-armhf-lite.zip ).

1 – Em um terminal (seja local ou via SSH) com a Raspberry Pi Zero W, verifique a existência do arquivo exportado para feed no watchdog com o seguinte comando:

Se a resposta do comando for igual a /dev/watchdog, o watchdog está suportado.

2 – Envie qualquer caracter exceto o ‘V’ (por exemplo, o caracter ‘1’) para o arquivo /dev/watchdog com o seguinte comando:

3 – Aguarde alguns segundos para o reboot ocorrer por falta de feed no watchdog. Caso você esteja acessando o terminal da placa via SSH, o prompt de comando não irá obedecer mais (não será mais responsivo), forçando uma nova conexão SSH assim que a Raspberry Pi Zero W rebootar e se reconectar à rede.

Agora, vamos ao caso de uso oposto: alimentar o watchdog periodicamente para evitar o reset/reboot da Raspberry Pi Zero W. Para isso, faça o seguinte procedimento:

1 – Em um terminal (seja local ou via SSH) com a Raspberry Pi Zero W, no diretório home (/home/pi), use o comando abaixo para criar e abrir em modo de edição o script alimenta_watchdog.sh:

2 – No editor nano, insira o código-fonte abaixo, o qual tem como funcionalidade fazer o feed do watchdog a cada segundo.


3. Saia do editor e salve o script com Ctrl+X e depois Y

4. Utilize os comandos abaixo para dar permissão de execução e rodar o script recém-criado:


5. Abra um novo terminal (uma nova sessão SSH) e perceba que, agora, pelo fato do feed do watchdog estar sendo feito periodicamente, não há o reset / reboot da placa (enquanto este script é executado). Dessa forma, valida-se o feed do watchdog para a manutenção do funcionamento da placa.

Sugestões para uso do watchdog no Linux


Segue abaixo algumas sugestões de uso do watchdog no Linux embarcado:

  • Se a distribuição Linux que seu projeto usa utiliza o sistema de inicialização systemd, você pode fazer com que o systemd cuide do watchdog de forma automática. Para saber mais, leia o artigo contido em: http://0pointer.de/blog/projects/watchdog.html
  • No caso de distribuições Linux focadas em dispositivos muito restritos em recursos computacionais (pouca memória RAM e/ou memória de armazenamento em massa), como o OpenWRT usado em roteadores ethernet / wi-fi por exemplo, pode ser que não haja o suporte a um sistema de inicialização mais completo como o systemd. Neste caso, uma possibilidade de garantir o feed do watchdog é, no processo mais crítico/vital de seu projeto que rodará nesta distribuição, criar uma thread responsável por fazer o feed no watchdog em /dev/watchdog.
    Alternativamente, você pode utilizar o script alimenta_watchdog.sh mostrado neste artigo para fazer o feed do watchdog nesta situação, rodando este script em background.
  • No caso de sistemas críticos, é recomendado habilitar (setar em Y) a Kernel Config CONFIG_WATCHDOG_NOWAYOUT, de forma a forçar o reboot caso o arquivo /dev/watchdog seja fechado em uma situação não prevista / mapeada no desenvolvimento e testes da solução.
  • Ainda no caso de sistemas críticos, se for utilizado o sistema de inicialização systemd, é interessante fazer uso da configuração RuntimeWatchdogSec. Esta configuração define o tempo máximo (em segundos) que, após um reboot, deve haver o primeiro feed do watchdog. Sendo assim, em situações onde há problemas na inicialização do Linux e um travamento acontecer por um tempo igual ao configurado em RuntimeWatchdogSec, será feito um reboot automaticamente.
    Porém, muito cuidado: para usar este recurso, é preciso ter uma boa ideia do tempo normalmente gasto na inicialização do Linux na sua solução, pois se for configurado um valor menor que este em RuntimeWatchdogSec, o sistema pode entrar em um ciclo infinito de reboot.


Referências

Saiba Mais

Systemd – Adicionando scripts na inicialização do Linux

Servindo Watchdog adequadamente

Biblioteca de Software de Watchdog Timer para FRDM-KL25Z

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Sem licença Creative Commons
Home » Linux Embarcado » Utilizando watchdog no Linux embarcado
Comentários:
Notificações
Notificar
guest
3 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Michel (becauro)
Michel (becauro)
20/05/2022 20:15

Parabéns e obrigado pelo Artigo!

MARCOS MARCOS CAGLIARI
MARCOS CAGLIARI
07/02/2022 10:38

Excelente Artigo! Muito útil e pouco conhecido.

Talvez você goste:
Nenhum resultado encontrado.
Menu