Arduino w / Atmega328: no se puede borrar el perro guardián

4

Estoy usando la instalación de vigilancia de software a bordo de un Atmega328 como documentado here .
Mi propósito es limitar a 2 segundos la ejecución de una parte del código que podría llevar a una computación interminable.

Este es el esquema de pseudo-código:

enable watchdog (2 seconds)
run may-be-endless code
clear watchdog
run the rest

El resto del código debe ejecutarse si el código puede ejecutarse sin fin en el tiempo establecido, de lo contrario, se debe reiniciar todo el programa.

Este es el código Arduino que cargué en el tablero:

#include <avr/wdt.h>

void setup() {

  Serial.begin(9600);

  Serial.println("Started");

  wdt_enable(WDTO_2S);
  Serial.println("watchdog ON");

  wdt_reset();
  Serial.println("watchdog OFF");

}

void loop(){
  Serial.println("loop...");
  delay(1000);
}

En este punto, la salida esperada debe ser una impresión sin fin de mensajes loop... , después de los de la configuración ( Started , watchdog ON / OFF ).

Sorprendentemente, lo que obtengo en cambio es esto:

Started
watchdog ON
watchdog OFF
loop...
loop...
loop...
Started
watchdog ON
watchdog OFF
loop...
loop...
loop...
Started
watchdog ON
watchdog OFF
loop...
loop...
[...]

Aparentemente se está configurando el watchdog pero no se puede borrar. ¿Cómo es que?

    
pregunta etuardu

2 respuestas

7
wdt_reset() 

no deshabilita el perro guardián, simplemente restablece su temporizador, lo que retrasa la caducidad.

Probablemente quieras

wdt_disable()

Sin embargo, su enfoque general puede no ser el más sensato; dejar que el perro guardián caduque puede ser inteligente, pero también es bastante pesado en comparación con enfoques como el uso de una interrupción del temporizador normal o la limitación del código. Normalmente, el watchdog es para errores imprevistos.

    
respondido por el Chris Stratton
5

Para deshabilitar la llamada del temporizador de vigilancia wdt_disable () . Todo lo que wdt_reset() hace es reiniciar el tiempo de espera de vigilancia, que en su caso es redundante: simplemente lo enciende dos líneas arriba. wdt_reset() no desactiva el temporizador de vigilancia (a diferencia de su salida en serie).

    
respondido por el angelatlarge

Lea otras preguntas en las etiquetas