El "
Watch Dog Timer" o "Temporizador Perro guardián" es un artificio que se utiliza de antiguo para evitar que los microprocesadores se queden "colgados".
No es extraño que en microelectrónica se den circunstancias de hardware o firmware no previstas por el diseñador en las que un microprocesador se quede en un estado indeterminado del que le sea imposible salir sin una ayuda externa.
El WDT lo que hace fundamentalmente es resetear el micro tras un periodo de tiempo determinado. Su funcionamiento es similar a la Interrupción por Desbordamiento de un Timer, que se produce cuando un Timer que es incrementado continuamente pasa de su valor máximo al mínimo para comenzar de nuevo a contar.
En el caso del WDT en lugar de saltar una interrupción se genera un reset automático en el momento de producirse dicho desbordamiento.
Pero evidentemente en
condiciones normales, nuestro micro funcionando correctamente,
no debería producirse dicho reset automático.
Para
evitar que el reset se dispare es para lo que
aplicamos el restart_wdt(); o sea que "restauramos" el timer del WDT, o lo que es lo mismo: lo volvemos a poner a 0 "a mano" y vuelve de nuevo a iniciar su cuenta para acercarse al abismo y amenazarnos con resetear el micro si antes no lo "restauramos" de nuevo.
Un
ejemplo tonto:
Configuramos nuestro
WDT para que salte cada
5 ms, por ejemplo.
Entramos en una
rutina que espera a que le lleguen una
docena de caracteres vía rs232, y cada vez que le llega
uno hace un
restart_wdt().
Al recibir el
doceavo carácter sale de la rutina y continua su ejecución normal.
Por manos del demonio se nos escapa el hacha que con la que estábamos haciendo juegos malabares y corta accidentalmente el cable de la rs232, justo cuando el PIC había recibido el carácter número 11 de los 12 que esperaba.
Por lo tanto nuestro programa
se queda esperando un carácter que nunca le va a llegar, al menos durante el tiempo en que tardemos en sustituir el cable accidentado.
¿Y qué ocurre entonces con el resto de del programa que debía estar funcionando? pues que todo
está detenido indefinidamente.
Pero, para eso está el WDT. Como restaurábamos el contador cada vez que recibíamos un carácter y estos iban llegando, uno a uno en su cadencia natural, el WDT no se desbordaba y todo iba bien. Pero tras recibir nuestro 11 carácter y quedarse esperando el 12
nadie ha restaurado el WDT por lo que este camina, paso a paso, tick a tick, hasta el temible desbordamiento ...
y éste se produce indefectiblemente 5 ms después de haber recibido el onceavo carácter.
El PIC se resetea y todo vuelve a comenzar de nuevo.
Si hemos sido lo suficientemente inteligentes como para
escribir un 1 en la EEPROM al iniciar la recepción de los susodichos 12 bytes, y teníamos previsto
escribir un 0 en la EEPROM en el mismo sitio para indicar que la última recepción de 12 bytes fue un completo éxito tendremos disponible un indicador veraz y seguro de que al reiniciarse nuestro PIC sabremos fehacientemente que la última recepción fue bien o por el contrario se convirtió en un completo, total y rotundo fracaso y, por lo menos, nos tomaremos con precaución el asunto de la RS232.
Nuestro programa podrá seguir su curso evitando los terrenos pantanosos y habilitando los medios para solventar los problemas que nos hemos encontrado.
Un saludo. Mañana más.
