{getToc} $title={Índice}
Neste artigo será explorado o uso de um Watchdog Timer (WDT), que é um componente eletrônico presente em muitos sistemas, incluindo microcontroladores, sistemas embarcados e outros dispositivos eletrônicos. Sua função principal é monitorar o funcionamento do sistema e tomar ações corretivas caso detecte uma falha ou bloqueio no programa em execução. Para validar esses sistema, será explorado o uso do WDT TPS3431 [1], que é um componente da Texas Instruments capaz de cumprir esse papel, junto a um ESP32.
Função e funcionamento de um Watchdog Timer
Como já vimos, um Watchdog Timer é um componente eletrônico capaz de monitorar o funcionamento do sistema e tomar ações corretivas caso detecte uma falha ou bloqueio no programa em execução.
O WDT age como um temporizador que deve ser periodicamente reiniciado pelo software do sistema. Se o software estiver funcionando normalmente, ele deve regularmente "alimentar" (ou em inglês, feed) o watchdog, ou seja, redefinir seu contador antes que ele alcance um valor limite. Se o software parar de funcionar devido a um travamento, loop infinito ou outro problema, ele não será capaz de redefinir o temporizador do WDT. Nesse caso, quando o temporizador do WDT expirar, o WDT assume que ocorreu uma falha no sistema e, como medida de segurança, executa ações predefinidas para reiniciar ou recuperar o sistema.
As ações que um WDT pode tomar variam dependendo do design e da configuração do sistema. Algumas das ações comuns incluem:
- Reinicialização do sistema: O WDT pode forçar uma reinicialização completa do sistema, reiniciando todos os componentes, registradores e memória para um estado inicial conhecido.
- Execução de um código de recuperação: Em vez de uma reinicialização completa, o WDT pode chamar um código de recuperação ou rotina de tratamento de erros específica para tentar resolver o problema e restaurar o sistema a um estado funcional.
- Geração de alerta: Além das ações de reinicialização, o WDT também pode gerar um sinal ou alerta para informar aos administradores do sistema que ocorreu um problema.
- Desligamento do sistema: Em algumas situações críticas, o WDT pode ser configurado para desligar completamente o sistema, evitando que ele continue operando em um estado potencialmente instável.
Em resumo, o Watchdog Timer é uma medida de segurança importante para sistemas eletrônicos críticos, garantindo que, mesmo em caso de falhas do software, o sistema possa se recuperar automaticamente e continuar operando de maneira confiável. Isso é particularmente crucial em dispositivos embarcados e sistemas onde a intervenção humana imediata pode não ser possível ou prática.
O TPS3431
De modo geral, o WDT TPS3431 possui dois pinos principais de ação: o WDI e o WDO. O feed do WDT deve ser realizado no pino WDI. Para prevenir que o temporizador expire, uma transição de descida deve ocorrer neste pino, reiniciando assim a contagem.
Caso essa transição não ocorra antes do tempo definido no Hardware, a saída WDO irá executar um pulso negativo com duração de aproximadamente 200 ms, que pode ser conectado a um pino de reset ou de interrupção do sistema. O pino WDO deverá conter um resistor de pull-up no valor de 10kΩ para o VDD.
O tempo de timeout (tWD), que é o tempo que o Watchdog leva para expirar e ocasionar o pulso na saída WDO, pode ser definido das seguintes maneiras, a depender do pino CWD:
CWD sem conexão
Nesse modo, o valor do timeout é fixo, com valor padrão de 1600 ms, podendo variar entre 1360 ms e 1840 ms.
CWD com um resistor de 10 kΩ para o VDD
Nesse modo, o valor do timeout é fixo, com valor padrão de 200 ms, podendo variar entre 170 ms e 230 ms.
CWD com um capacitor CCWD para o GND
Com esta configuração, o timeout varia de acordo com o valor da capacitância conectada ao pino, e segue a seguinte relação:
tWD(ms) = 77.4 x CCWD (nF) + 55 (ms)
O valor pode variar entre tWD × 0.905 < tWD < tWD × 1.095
Vale ressaltar que todos os valores de tWD só podem ser considerados se o Watchdog estiver habilitado, ou seja, SET1 = 1 e EN ≠ 0 (1 ou flutuante).
Teste com ESP32
Para validar o funcionamento, pode-se fazer um teste simples com um ESP32 e a placa de avaliação da Texas Instruments, a TPS3431EVM [2]. Aqui será considerado a aplicação com um capacitor de 220 nF para o GND no pino CWD, fazendo com que o timeout seja de 77.4 x 220 + 55 = 17083 ms. O pino SET1 será conectado ao nível lógico 1, para habilitar o WDT. As conexões com o ESP32 serão feitas conectando a saída WDO ao pino EN do ESP32, e a entrada WDI ao pino 18, por onde será feito o feed do WDT.
O código a seguir irá fazer o feed do WDT algumas vezes, por meio de pulsos realizados no pino 18, e após alguns pulsos, será forçado um travamento do código, a fim de simular uma falha. Este código considera o uso de uma placa ESP32-WROOM, com o framework ESP-IDF.
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
/**
* GPIO status:
* GPIO18: output (ESP32C2/ESP32H2 uses GPIO8 as the second output pin)
*/
#define GPIO_OUTPUT_IO_0 CONFIG_GPIO_OUTPUT_0
#define GPIO_OUTPUT_PIN_SEL (1ULL<<GPIO_OUTPUT_IO_0)
void app_main(void)
{
//zero-initialize the config structure.
gpio_config_t io_conf = {};
//disable interrupt
io_conf.intr_type = GPIO_INTR_DISABLE;
//set as output mode
io_conf.mode = GPIO_MODE_OUTPUT;
//bit mask of the pins that you want to set,e.g.GPIO18/19
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
//disable pull-down mode
io_conf.pull_down_en = 0;
//disable pull-up mode
io_conf.pull_up_en = 0;
//configure GPIO with the given settings
gpio_config(&io_conf);
int cnt = 0;
while(1) {
printf("cnt: %d\n", cnt++);
vTaskDelay(1000 / portTICK_PERIOD_MS);
gpio_set_level(GPIO_OUTPUT_IO_0, cnt % 2);
if(cnt > 10)
while(1);
}
}
```
Como pode-se observar, após a variável cnt ultrapassar o valor 10, o código irá travar dentro de um while(1), impedindo o feed do WDT. Após a "falha", ultrapassando o timeout definido, o pino WDO enviará o pulso que causará o reset do ESP32.
[2] TPS3431EVM
Bacana dms Matheus!!
ResponderExcluirObrigado pelo feedback, Carlos!
Excluir