Perché i programmi fermano il timer del watchdog su MSP430?


11

Molti programmi di esempio per MSP430 hanno la loro prima linea come:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

Perché lo fanno?

Risposte:


15

Il timer watchdog (WDT) è attivo per impostazione predefinita, è una cosa utile da avere in applicazioni più complesse, ma fa scattare molte nuove persone. Spesso non serviranno il WDT nel loro codice o includeranno una routine di servizio di interruzione (ISR) per gestire l'evento WDT, quindi, quando il loro chip continua a reimpostarsi, diventano molto frustrati. Inoltre, i programmi di esempio, per la maggior parte, non stanno provando a dimostrare il WDT, quindi è disattivato.

Modifica: il timer del watchdog avrebbe potuto essere chiamato "interruttore uomo morto". Il suo comportamento predefinito è reimpostare il microcontrollore a meno che il firmware non gli comunichi periodicamente che tutto funzioni correttamente. Questo è noto come "nutrire il cane" o "calciare il cane". In questo modo, se il firmware si blocca in un ciclo o smette in altro modo di funzionare come previsto, il watchdog non viene alimentato e ripristinerà il chip (si spera su uno stato nuovo e funzionante).

Puoi anche utilizzare il WDT come interruzione periodica per eseguire altre attività, qualunque cosa tu possa immaginare. Devi solo scrivere il relativo ISR.


+1 grazie, anche se io e altri lettori possiamo cercare, sarebbe bello conoscere una logica molto breve del perché il WDT reimposta il chip. (non preoccuparti di aggiungerlo, la tua risposta è abbastanza buona da accettare così com'è (dopo aver aspettato qualche ora in più per altre possibili risposte))
Negromante

suppongo che avrei dovuto menzionare nella domanda che sono un principiante assoluto che non ha idea di cosa sia il timer del cane da guardia :)
Negromante

2
@necromante Ah, non preoccuparti, ho aggiunto le informazioni pertinenti.
Samuel,

2
Samuel: in quasi tutti i casi NON dovresti usare un ISR per resettare un WDT. È quasi sempre la cosa sbagliata da fare. Gli interrupt possono continuare allegramente mentre altre parti del programma sono disattivate a La-La Land. Occasionalmente è possibile / necessario (con la comunicazione tra ISR e altre parti del firmware che imposta effettivamente un secondo livello di WDT) ma non dovrebbe essere suggerito a un principiante come primo approccio.
Spehro Pefhany,

9

Oltre al punto di Samuel sulle persone che inciampano accidentalmente nel WDT, c'è un altro motivo importante per cui inizialmente dovrebbe essere disabilitato.

Anche se l'applicazione è normalmente in grado di ripristinare correttamente il timer, potrebbe non essere in grado di farlo durante il codice di inizializzazione, per due motivi:

  • L'inizializzazione potrebbe richiedere più tempo di un singolo tick WDT, ma è necessario disabilitare gli interrupt. Ciò significa che se si fa affidamento, ad esempio, su un ISR timer per reimpostare il timer, è possibile entrare in un loop di avvio infinito.
  • Non si conosce necessariamente lo stato del registro timer su tutti gli MCU (ad esempio, il segno di spunta successivo potrebbe essere molto prima del previsto, poiché il registro potrebbe non iniziare da 0).

Di conseguenza, è buona norma disabilitare il WDT come prima cosa che fai, anche se non l'hai mai abilitato .

Se si desidera utilizzarlo, è possibile riattivarlo immediatamente prima di attivare gli interrupt, come ultimo passaggio del codice di inizializzazione.


+1 grazie per aver aggiunto alla risposta. ho scoperto che puoi disabilitarlo prima dell'inizializzazione usando la int _system_pre_init(void)funzione, che viene eseguita primamain
Negromante
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.