13 votos

¿Por qué los programas detienen el temporizador watchdog en el MSP430?

Muchos programas de ejemplo para el MSP430 tienen su primera línea como:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

¿Por qué lo hacen?

17voto

FredB Puntos 496

El temporizador de vigilancia (WDT) está activado por defecto, es una cosa útil para tener en aplicaciones más complejas, pero tropieza con un montón de gente nueva. A menudo no dan servicio al WDT en su código o incluyen una rutina de servicio de interrupción (ISR) para manejar el evento WDT, por lo que, cuando su chip sigue reiniciándose se sienten muy frustrados. Además, los programas de ejemplo, en su mayor parte, no tratan de demostrar el WDT por lo que está desactivado.

Edita: El temporizador de vigilancia podría haberse llamado "interruptor del hombre muerto". Su comportamiento por defecto es reiniciar el microcontrolador a menos que el firmware le haga saber periódicamente que todo va bien. Esto se conoce como "alimentar al perro" o "patear al perro". De esta manera, si tu firmware se queda atascado en un bucle o deja de funcionar como se esperaba, el watchdog no es alimentado y reiniciará el chip (con suerte a un estado fresco y funcional).

También puedes utilizar el WDT como interrupción periódica para realizar otras tareas, lo que se te ocurra. Sólo tienes que escribir el ISR correspondiente.

0 votos

+1 gracias, aunque yo y otros lectores podemos buscarlo, estaría bien saber un razonamiento muy breve de por qué el WDT reinicia el chip. (no te preocupes por añadirlo sin embargo, su respuesta es lo suficientemente bueno para aceptar como es (después de esperar unas horas más para otras posibles respuestas))

0 votos

Supongo que debería haber mencionado en la pregunta que soy un novato absoluto que también no tiene ni idea de lo que es el temporizador de vigilancia es :)

2 votos

@necromancer Ah, no te preocupes, he añadido la información pertinente.

9voto

Adam V. Puntos 206

Además del punto de Samuel sobre la gente accidentalmente disparar el WDT, hay otra razón importante por la que debe ser desactivado inicialmente.

Incluso si tu aplicación es normalmente capaz de reiniciar el temporizador correctamente, puede que no sea capaz de hacerlo durante el código de inicialización, por dos razones:

  • La inicialización puede tardar más que un solo tick del WDT, pero requiere que las interrupciones estén desactivadas. Esto significa que si confías en, digamos, un ISR de temporizador para reiniciar el temporizador, podrías entrar en un bucle de arranque infinito.
  • No se conoce necesariamente el estado del registro del temporizador en todos los MCU (es decir, el siguiente tick podría ser mucho antes de lo esperado, ya que el registro podría no empezar en 0).

Por lo tanto, lo primero que hay que hacer es desactivar el WDT, aunque nunca lo hayas activado .

Si quieres utilizarlo, puedes volver a activarlo inmediatamente antes de activar las interrupciones, como último paso de tu código de iniciación.

0 votos

+1 gracias por añadir a la respuesta. descubrí que se puede desactivar antes de la inicialización utilizando int _system_pre_init(void) que se ejecuta antes de main

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X