Warum stoppen Programme den Watchdog-Timer auf dem MSP430?

11

Viele Beispielprogramme für den MSP430 haben ihre erste Zeile wie folgt:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

Warum machen sie das?

Nekromant
quelle

Antworten:

15

Der Watchdog-Timer (WDT) ist standardmäßig aktiviert. Dies ist in komplexeren Anwendungen nützlich, löst jedoch viele neue Leute aus. Sie warten den WDT häufig nicht in ihrem Code oder enthalten keine Interrupt-Serviceroutine (ISR), um das WDT-Ereignis zu behandeln. Wenn ihr Chip also immer wieder zurückgesetzt wird, werden sie sehr frustriert. Darüber hinaus versuchen die Beispielprogramme größtenteils nicht, das WDT zu demonstrieren, sodass es deaktiviert ist.

Bearbeiten: Der Watchdog-Timer könnte als "Totmannschalter" bezeichnet worden sein. Das Standardverhalten besteht darin, den Mikrocontroller zurückzusetzen, es sei denn, die Firmware teilt ihm regelmäßig mit, dass alles ordnungsgemäß funktioniert. Dies ist als "Füttern des Hundes" oder "Treten des Hundes" bekannt. Auf diese Weise wird der Watchdog nicht gespeist und setzt den Chip zurück (hoffentlich in einen neuen Betriebszustand), wenn Ihre Firmware in einer Schleife stecken bleibt oder auf andere Weise wie erwartet nicht mehr funktioniert.

Sie können den WDT auch als periodischen Interrupt verwenden, um andere Aufgaben auszuführen, was immer Sie sich vorstellen können. Sie müssen nur den entsprechenden ISR schreiben.

Samuel
quelle
+1 danke, obwohl ich und andere Leser es nachschlagen können, wäre es schön, eine sehr kurze Begründung dafür zu kennen, warum der WDT den Chip zurücksetzt. (Machen Sie sich keine Sorgen, wenn Sie es hinzufügen, Ihre Antwort ist gut genug, um sie so zu akzeptieren, wie sie ist (nachdem Sie noch einige Stunden auf andere mögliche Antworten gewartet haben))
Nekromant
Ich denke, ich hätte in der Frage erwähnen sollen, dass ich ein absoluter Neuling bin, der auch keine Ahnung hat, was der Watchdog-Timer ist :)
Nekromant
2
@necromancer Ah, keine Sorge, ich habe die relevanten Informationen hinzugefügt.
Samuel
2
Samuel - in fast allen Fällen sollten Sie KEIN ISR verwenden, um einen WDT zurückzusetzen. Es ist fast immer das Falsche. Die Interrupts können fröhlich fortgesetzt werden, während andere Teile des Programms in la-la-land ausgeschaltet sind. Es ist gelegentlich möglich / notwendig (mit der Kommunikation zwischen dem ISR und anderen Teilen der Firmware, die effektiv eine zweite WDT-Ebene festlegt), sollte aber einem Neuling nicht als erster Ansatz vorgeschlagen werden.
Spehro Pefhany
9

Zusätzlich zu Samuels Hinweis auf Personen, die versehentlich das WDT auslösen, gibt es einen weiteren wichtigen Grund, warum es zunächst deaktiviert werden sollte.

Selbst wenn Ihre Anwendung normalerweise in der Lage ist, den Timer korrekt zurückzusetzen, ist dies aus zwei Gründen möglicherweise während des Initialisierungscodes nicht möglich:

  • Die Initialisierung kann länger dauern als ein einzelner WDT-Tick, erfordert jedoch, dass Interrupts deaktiviert werden. Dies bedeutet, dass Sie in eine Endlosschleife geraten können, wenn Sie sich beispielsweise auf einen Timer-ISR verlassen, um den Timer zurückzusetzen.
  • Sie kennen nicht unbedingt den Status des Timer-Registers auf allen MCUs (dh der nächste Tick könnte viel früher als erwartet sein, da das Register möglicherweise nicht bei 0 beginnt).

Daher empfiehlt es sich, das WDT als erstes zu deaktivieren, auch wenn Sie es nie aktiviert haben .

Wenn Sie es verwenden möchten, können Sie es unmittelbar vor dem Einschalten von Interrupts als letzten Schritt Ihres Initilierungscodes wieder aktivieren.

Sapi
quelle
+1 Danke, dass du die Antwort ergänzt hast. Ich entdeckte, dass Sie es vor der Initialisierung mit der int _system_pre_init(void)Funktion deaktivieren können, die vormain
Nekromanten