4 Comentários

ESP32 – Watchdog timer

Você já teve problemas com travamento do microcontrolador e teve que reiniciá-lo manualmente? Vamos ajudá-lo a resolver este problema e deixar seu sistema embarcado muito mais confiável e robusto para criação de protótipos e produtos que fiquem em locais de difícil acesso.

Watchdog timer
Figura 1 - Watchdog.

Basicamente, um watchdog timer serve para seu sistema não permaneça travado caso ocorra alguma falha de software ou hardware e normalmente conta com um sistema independente de clock. Quase todos microcontroladores atuais contam com watchdog interno, mas para projetos e produtos mais robustos, pode ser necessário adição de watchdogs externos.

O ESP32 conta com 3 Hardware Watchdogs (HW WDT), um em cada grupo de timer e um no domínio RTC, sendo este o principal e único capaz de reiniciar completamente o ESP32.

  • 4 estágios com ações e tempos independentes.
  • Proteção contra escrita.
  • 32 bits.

Especificamente dentro do ecossistema da IDF (incluindo Arduino Core), há três tipos de watchdogs implementados (baseados nos HW WDT) que podemos configurar facilmente, que são:

Interrupt Watchdog: Watchdog dedicado para análise de interrupções, como por exemplo o Switch Context do FreeRTOS que é responsável pelo gerenciamento de quais tarefas serão executadas. Quando você desabilita as interrupções do sistema, é ele que poderá reiniciar o ESP32. É habilitado por padrão com timeout de 300 ms e baseado no HW WDT 1.

Task Watchdog: Watchdog dedicado para análise de tarefas do FreeRTOS, como por exemplo verificar se todas suas tarefas estão sendo executadas corretamente. Este watchdog é muito interessante, pois permite que nenhuma de suas tarefas fiquem travadas, garantindo que todas estejam sendo executadas com certa frequência. É habilitado por padrão nas IDLE_TASK com timeout de 5 seg e baseado no HW WDT 0. Também pode ser habilitado ou desabilitado (reconfigurado) durante a execução do seu código.

RTC Watchdog: Watchdog dedicado para análise completa do sistema, sendo capaz de reiniciar completamente todo o ESP32. Este watchdog contém seu próprio domínio e clock (RTC_SLOW_CLK) separados do domínio digital, por isso também pode ser utilizado em Deep Sleep. É habilitado por padrão com 9 seg apenas para monitoramento do bootloader (antes da execução do app_main()), entretanto, você pode configurá-lo para continuar ativo após o bootloader e utilizá-lo em seu código, sendo o mais confiável que há internamente do ESP32. É ativo logo nas primeiras instruções do código de bootloader, sendo ativado antes de 1us após a inserção de alimentação no sistema.

Nesse artigo, abordaremos sobre o uso do Task WDT e RTC WDT, vamos fazer alguns testes!

Task Watchdog timer

Este watchdog timer é dedicado para análise individual das tarefas do FreeRTOS, garantindo que todas tarefas monitoradas não travem por elas mesmas ou por outra de maior prioridade (starvation). Quando uma tarefa não o alimenta até o tempo limite, o “Panic Handler” é invocado, que por padrão, reinicia o ESP32.

Cada tarefa monitorada precisa alimentar o watchdog, ou seja, se qualquer uma das tarefas monitoradas não alimentá-lo no tempo limite, irá reiniciar o ESP32. Vamos testar!

Nesse código, há 2 tarefas em execução atribuídas ao Task WDT (t1 e t2) sendo que a “t2” não está alimentando corretamente o watchdog timer, ocasionando reinício do sistema. Observe na figura abaixo que é escrito qual tarefa ocasionou o reinício e quais estavam executando no momento do reinício.

Watchdog timer
Figura 2 - Task Watchdog reiniciando o sistema.

RTC Watchdog

Este watchdog timer é dedicado para análise completa do ESP32, garantindo que todo sistema não fique travado, como por exemplo através de ruídos de alimentação, falha de CPU e etc.

A IDF o utiliza (por padrão) apenas durante o bootloader e é desativado antes do app_main(), entretanto, nós podemos habilitá-lo para permitir controle do usuário. Para isso, basta ativá-lo em “menuconfig > bootloader config > Allows RTC WDT disable in user code”.

Watchdog timer
Figura 3 - Configurando o RTC WDT.

Habilitando esta opção, ele não é mais desabilitado antes do app_main() e continuará rodando, ou seja, se você não alimentá-lo, irá reiniciar completamente todo o ESP32.

 

O código acima efetua a alimentação do RTC WDT antes do seu tempo limite (1000 ms), porém, se você aumentar o delay ou comentar a linha de alimentação, causará o reinício do ESP32.

Conclusão

É sempre importante manter o watchdog habilitado em todos seus projetos. Há inúmeros métodos para implementar os watchdogs internos do ESP32 e garantir que seu projeto ou produto não ficará travado por falhas de software ou hardware, mas não se esqueça, ele não resolve a causa do problema, sendo utilizado apenas como uma emergência. Você sempre deve resolver a causa dos travamentos do seu sistema e não utilizar o watchdog como uma simples saída. 

Saiba mais

ESP32 - conhecendo os pinos de Strapping

ESP32 - Segurança e proteção da flash

ESP32 - Analisando e corrigindo o ADC interno

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Software » ESP32 - Watchdog timer
Comentários:
Notificações
Notificar
guest
4 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Paulo Tarcísio Silva Junior
Paulo Tarcísio
10/06/2020 23:51

Muito Bom. Vou passar a utilizar o RTC.

Paulo Tarcísio Silva Junior
Paulo Tarcísio
10/06/2020 23:51

Muito Bom, vou passar a utilizar o RTC

Paulo Tarcísio Silva Junior
Paulo Tarcísio
10/06/2020 23:50

Muito útil. Vou passar a utilizar o RTC

Pedro Henrique Bertoleti
Membro
10/06/2020 14:07

José, artigo muito bom! Parabéns!

Talvez você goste:

Séries

Menu

WEBINAR
 
Redes Mesh para Monitoramento
e Controle de Sensores

Data: 15/07 às 14:00h Apoio: Artimar| Microchip| Tecsus
 
INSCREVA-SE AGORA »



 
close-link