Para incluir el módulo HWWDT en la aplicación desarrollada en lab5, es necesario
tener en cuenta los siguientes aspectos de diseño:
Periodo de tiempo: configurar el tiempo de expiración. Debe ser lo bastante largo
para cubrir los retrasos esperados en la operación normal, pero lo bastante corto para
detectar fallos reales con rapidez.
Ubicación del feed: colocar la alimentación en una sección del código que se ejecute
regularmente en la operación normal (bucle principal o tarea periódica frecuente).
Efecto: Configurar el watch dog para que genere una interrupción, un reinicio,
o ambos al expirar.
En lab5, el watchdog se integra de la siguiente manera:
Inicialización: configurar el watchdog en el arranque del sistema
con un tiempo de expiración de 10 ms (10 veces el periodo de 1 kHz).
Alimentación: incluir el «feed» del watchdog en la tarea periódica de 1 kHz,
asegurando que se ejecute regularmente.
Incluir código de bloqueo en las situaciones de error en la ISR de I2S,
forzando de esta forma que el watchdog reinicie el sistema en caso de fallo.
Configurar el watchdog para que genere una interrupción antes del reinicio, permitiendo
realizar tareas de registro de errores.
Con esta configuración el sistema se reinicia si:
Hay un bloqueo en el bucle principal.
El buffer de transmisión está vacío cuando se intenta enviar datos por I2S.
El buffer de recepción está lleno cuando se intenta leer datos por I2S.
Integración de HWWDT en lab5
Configuración del proyecto.
Abre el proyecto lab6.
Selecciona el targetlab6.
Tareas a realizar.
En la función main() incluye el código necesario para inicializar el
HWWDT con un tiempo de desbordamiento de 10 ms y la generación de
reset activada. Este código debe situarse al comienzo de la función main().
Incluye código para alimentar el perro guardián (HWWDT) en la
tarea periódica de 1 kHz.
Crea el código de la subrutina de interrupción NMI (void NMI_Handler(void)).
En esta subrutina incluye código para distinguir si la interrupción
ha sido generada por el HWWDT y en ese caso realiza el siguiente proceso:
Verifica que funciona correctamente, no debería
producirse ningún reinicio del sistema.
Sin detener la ejecución, pon
un breakpoint al principio de la función main() para verificar que
el sistema no se reinicia.
Introduce un breakpoint en la línea de código donde se realiza
la alimentación del HWWDT en la tarea periódica de 1 kHz. El programa
se detendrá en este punto.
Verifica que los valores de estado y configuración de los registros del
HWWDT son correctos:
Selecciona en el menú de Keil Peripherals ‣ System Viewer ‣ HWWDT
abre el visor de registros del HWWDT:
Al detener la ejecución en el breakpoint, el I2S ha seguido funcionando
y ha vaciado el buffer interno de transmisión, al reanudar la ejecución
la interrupción se activa de forma reiterada, sin dejar que se llene
el buffer interno de transmisión. Este comportamiento provoca que
tx_buff_circ se vacíe y el sistema se bloquee en la ISR. En este punto
el HWWDT no es alimentado y se produce el reinicio del sistema.
Pon un breakpoint al principio de la subrutina de interrupción NMI
y otro al principio de la función main()
Reanuda la ejecución del programa y verifica el comportamiento
descrito.
Cuando se detenga al llegar al breakpoint situado al principio de la
función main(), comprueba los valores de las variables globales que
se han escrito en la subrutina de interrupción NMI para hacer un log
del estado de los buffers circulares.
Elimina los breakpoints y vuelve a ejecutar la aplicación para
verificar que el sistema funciona correctamente. No debería producirse
ningún reinicio del sistema.