Um temporizador watchdog é um temporizador interno ou externo que monitora o programa de um microcontrolador para garantir que o aplicativo permaneça operacional sem falhas. Serve como recurso de segurança em aplicações críticas, monitorando o sinal de saída do microcontrolador.
O watchdog pode operar em dois modos:
- Modo de tempo limite – o temporizador estabelece que o microcontrolador está não funcionando corretamente se ele receber vários sinais (por exemplo, se um pulso duplo for detectado dentro de um período definido).
- Modo janela – o temporizador estabelece que o microcontrolador está não funcionando corretamente se não receber um sinal ou receber muitos em um determinado período.
Se algum desses eventos ocorrer, o temporizador watchdog reinicializa o microcontrolador.
A classe WDT
MicroPython fornece classe WDT para configurar e ativar o temporizador watchdog em ESP8266, ESP32, WiPy e pyboard. Estas são as únicas plataformas para as quais o WDT está disponível.
Um objeto WDT em um script MicroPython é usado para reiniciar o controlador quando um aplicativo trava ou está em um estado não responsivo ou não recuperável.
Depois que o temporizador do watchdog for iniciado, ele não poderá ser reconfigurado ou interrompido. É habilitado assim que um objeto da classe WDT é instanciado. Além disso, o script/programa deve alimentar o temporizador do watchdog periodicamente para evitar a expiração ou reinicialização automática do controlador.
A classe WDT é importada em um script MicroPython usando esta instrução:
da importação de máquina WDT
O método construtor para a classe WDT possui este protótipo:
classe máquina.WDT(id=0, tempo limite=5000)
O método construtor pode receber dois parâmetros de palavras-chave, id e timeout. O “id” é o do temporizador watchdog e só deve ser passado se houver vários temporizadores watchdog em um microcontrolador.
O parâmetro timeout especifica o tempo limite do feed e é obrigatório, dependendo da porta do MicroPython. O período de tempo limite é específico da porta e especificado em milissegundos.
O temporizador watchdog é ativado imediatamente após a instanciação de um objeto da classe WDT. A classe WDT fornece apenas um método.
WDT.feed : Quando este método é chamado, ele alimenta o temporizador do watchdog periodicamente para evitar que ele reinicie o controlador. Este método deve ser chamado dentro ou no final de um script, para que o watchdog timer só seja alimentado quando o código de execução principal for confirmado. Se o script não contiver um loop infinito, ele poderá ser chamado no final do script. Se o script de execução principal contiver um loop infinito, ele deverá ser colocado como a última instrução do loop. O método não aceita nenhum argumento.
Temporizador de watchdog no ESP8266
Ao usar o ESP8266, o tempo limite não pode ser especificado para o temporizador watchdog e é determinado automaticamente pelo sistema subjacente. Esta placa possui apenas um temporizador de watchdog, portanto não há necessidade de passar seu “id”.
Aqui está um exemplo válido de instanciação e configuração do temporizador watchdog no ESP8266:
da importação de máquina WDT
wdt = WDT
wdt.feed
Um script MicroPython que usa o temporizador watchdog sem um loop infinito (no ESP8266) deve ficar assim:
da importação de máquina WDT
wdt = WDT
….#Código de execução principal
wdt.feed
Um script MicroPython que usa o temporizador watchdog com um loop infinito (no ESP8266) deve ficar assim:
da importação de máquina WDT
wdt = WDT
….# Código MicroPython não repetitivo
enquanto Verdadeiro:
# Código do loop infinito
wdt.feed
Temporizador de watchdog no ESP32
No ESP32, um segundo é o tempo limite mínimo que pode ser especificado. O ESP32 possui apenas um temporizador de watchdog, portanto não requer a especificação do “id”.
Este é um exemplo válido de instanciação e configuração do temporizador watchdog no ESP32.
da importação de máquina WDT
wdt = WDT(tempo limite = 5000)
wdt.feed
Um script MicroPython que usa o temporizador watchdog sem um loop infinito (no ESP32) deve ficar assim:
da importação de máquina WDT
wdt = WDT(tempo limite = 5000)
….#Código de execução principal
wdt.feed
Um script MicroPython que usa o temporizador watchdog com um loop infinito (no ESP32) deve ficar assim:
da importação de máquina WDT
wdt = WDT(tempo limite = 5000)
….# Código MicroPython não repetitivo
enquanto Verdadeiro:
# Código do loop infinito
wdt.feed
Conclusão
O temporizador watchdog é um excelente recurso de segurança que garante que os microcontroladores executem a aplicação correta sem falhas. O watchdog detecta qualquer mau funcionamento e reinicializa o controlador se ele parar de funcionar ou estiver em um estado não recuperável.
MicroPython oferece suporte à funcionalidade do temporizador watchdog por meio da classe WDT, mas apenas para ESP32, ESP8266, WiPy e pyboard. O temporizador watchdog deve ser cuidadosamente colocado e alimentado dentro de um script MicroPython para que primeiro garanta a confirmação da execução do código principal do MicroPython.