Watchdog (do inglês Cão de Guarda) é uma ferramenta, tanto de software como de hardware, criada para monitorar o bom funcionamento de equipamentos.
Consiste essencialmente em um timer, que deve ser resetado periodicamente pelo sistema para demostrar que o mesmo está funcionando corretamente.
Se por algum motivo esse comando de reset do timer não for acionado o Watchdog é ativado e reseta todo o sistema ao estado inicial.
Nos Microcontroladores essa ferramenta é muito importante pois, se bem programado, pode deixar o equipamento muito mais confiável.
A utilização de Watchdog em certos equipamentos é essencial para aumentar sua segurança.
Por exemplo, vamos pensar em um avião. Lá dentro existem milhares de microcontroladores que possuem um fim específico, como controlar a pressurização da cabine, e que estão subordinados a um controlador principal. Se por uma falha na programação ou um evento externo, como um raio, um desses equipamentos começarem a alimentar o sistema principal com uma informação errada as consequências seriam catastróficas!
Numa hora dessas, um Watchdog bem programado é capaz de atuar e voltar o sistema que está com falha para sua configuração inicial e resolver o problema.
As boas técnicas de programação incentivam a criar um watchdog de software a cada uma das
diferentes tarefas do firmware (execução do main, interrupção do timer, interrupção
de ethernet e etc.)
Apesar de ser mais comum, nem sempre a implementação do watchdog é feita dentro do programa principal ou no microcontrolador a ser resetado.
No link abaixo temos uma implementação de um watchdog utilizando um CI 555, que pode ser utilizado para resetar o sistema independente de programação. (em inglês)
http://www.openhardwarehub.com/projects/36-Arduino-Hardware-Reset-Circuit-Breadboard?show_all=1#!pre...
Watchdog no Arduino
Geralmente o Watchdog de software pode ser acionado quando incluímos sua biblioteca na programação.
No Arduino a biblioteca do watchdog pode ser incluída com o comando:
#include <avr/wdt.h>
e os parâmetros:
wdt_enable(WDT0_8s) - Para iniciar a contagem do timer e estabelecer o tempo que ele aguardará até resetar todo sistema (no caso, 8 segundos).
wdt_reset() - Reseta o Watchdog
Para fins didáticos, segue um exemplo muito interessante para entendermos o funcionamento do watchdog no Arduino.
LEMBRETE: NEM TODO ARDUINO É CAPAZ DE EXECUTAR O WATCHDOG SATISFATORIAMENTE, SE A IMPLEMENTAÇÃO FOR FEITA INCORRETAMENTE PODE OCORRER UM 'SOFTBRICK' EM SUA PLACA E VOCÊ NÃO CONSEGUIRÁ GRAVAR MAIS NADA NELA. USE OS CÓDIGOS ABAIXO POR SUA CONTA EM RISCO.
Isso ocorre porque quando o Arduino é inicializado ele já começa a rodar o código que está em sua memória. Então, digamos que seja implementado um Watchdog de 1 segundo.
Antes de se conseguir gravar um novo programa na placa o sistema será resetado e a transferência não será concluída a tempo.
Isso nos obrigaria a utilizar um gravador externo para resetar toda memória do Arduino, o que não é fácil.
Segue o código comentado e com os devidos créditos.
/*
Esse código foi testado em um Arduino Uno e funcionou satisfatoriamente. Porém, não conseguimos fazê-lo funcionar no Arduino Leonardo.
Referências:
http://www.instructables.com/id/Raspberry-Pi-and-Arduino-Building-Reliable-Systems/?ALLSTEPS
https://selivre.wordpress.com/2012/08/14/servindo-watchdog-adequadamente/
Ou