Forum: Compiler & IDEs Wo Watchdog zurücksetzen?


von Mehmet K. (mkmk)


Lesenswert?

Servus allerseits

Den Watchdog setze ich generell in der MainLoop zurück.
Bei Methoden, die laenger dauern, verlaengere ich die Watchdog-Periode 
beim Eintritt und dann, bevor ich die Methode verlasse, stetze ich den 
Default-Wert wieder ein.

Mir ist aufgefallen, dass ST in seinen Application-Notes und Beispielen 
den Watchdog stets in einer Timer-Interrupt-Routine zurücksetzt.
Natürlich ist diese Art und Weise sehr bequem. Nur erscheint mir das 
nicht sehr sicher. Zumindest kann ich mir vorstellen, dass sich die MCU 
irgendwo aufhaengt, dieser Timer-Interrupt aber immer noch greift.

Oder irre ich mich da?

MfG

von wörg (Gast)


Lesenswert?

Wenn sich die MCU aufhängt, liegt das doch in den allermeisten Fällen 
daran, dass das Programm buggy ist. Bei Hardwareproblemen hast du noch 
ganz andere Schwierigkeiten. Dazu kommt, dass Timer sowieso nicht allzu 
viel machen sollten. In der Regel sollte dort nur ein Flag gesetzt 
werden. Das heißt also, wenn du in deinem normalen Programmablauf einen 
Fehler hast, bleibt die MCU in deiner Mainloop hängen. Da würde dir das 
WDT im Timer nix nützen. Umgekehrt, wenn das Programm im Timer 
festhängt, wird auch der Mainloop nicht mehr ausgeführt. Auch dann 
greift der Watchdog.

von Peter D. (peda)


Lesenswert?

Mehmet Kendi schrieb:
> Mir ist aufgefallen, dass ST in seinen Application-Notes und Beispielen
> den Watchdog stets in einer Timer-Interrupt-Routine zurücksetzt.

Es ist leider oft so, daß Application-Notes praxisfern sind, d.h. 
zeigen, wie man es nicht machen soll.

von Wilhelm F. (Gast)


Lesenswert?

Mehmet Kendi schrieb:

> Mir ist aufgefallen, dass ST in seinen Application-Notes und Beispielen
> den Watchdog stets in einer Timer-Interrupt-Routine zurücksetzt.
> Natürlich ist diese Art und Weise sehr bequem. Nur erscheint mir das
> nicht sehr sicher. Zumindest kann ich mir vorstellen, dass sich die MCU
> irgendwo aufhaengt, dieser Timer-Interrupt aber immer noch greift.

So ist es.

Ich beschäftige mich gerade etwas mit dem Watchdog des schon etwas 
älteren 8051-Derivates SAB80C517A von Siemens. Auch habe ich das 
Handbuch dazu mit ausführlichen Erläuterungen, die das User Manual nicht 
hat. Dort wird genau davor gewarnt, den Watchdog nicht bequemerweise in 
einem Interrupt, z.B. Timer-Interrupt, zurück zu setzen. Wenn das 
Hauptprogramm sich auf hinge, könnten Interrupts immer noch ganz 
unbeeindruckt weiter laufen, und der Watchdog würde den Absturz nicht 
bemerken.

von Mehmet K. (mkmk)


Lesenswert?

Als ich vor Jahren zum ersten Mal darauf stiess, ging ich mit einem 
gemurmelten "Blödsinn!" darüber hinweg.
Aber als ich dann immer und immer wieder bei ST auf diese Vorgehensweise 
stiess und weit und breit kein "for the sake of simplicity" zu sehen 
war, wurde ich doch etwas stutzig. Deshalb auch meine Anfrage hier.

von Peter D. (peda)


Lesenswert?

Ein Interrupt ist sehr robust. Der Stack kann schon lange in den Wald 
zeigen, sämtliche Variablen überschrieben sein.
Wenn nicht irgendwo zufällig Code zum Disablen ausgeführt wird, läuft 
der weiter, wie Schmidts Katze.

Da kann man auch gleich den Watchdog disablen, kommt auf selbe raus.

von Christian B. (casandro)


Lesenswert?

Überlege Dir mal ein Konzept was regelmäßig ausgeführt werden muss, wenn 
Deine Software richtig läuft. Sprich woran kannst Du erkennen, dass Mist 
passiert.

Nehmen wir mal an, Du würdest LEDs multiplexen. Dann kann es gefährlich 
sein, wenn Das Programm nicht weiter schaltet. Also könntest Du da den 
Watchdog resetten, da dann ein Neustart sinnvoll sein kann.

Ich hab mir in einem meiner Projekte auch mal zusätzlich einen 
Softwarewatchdog gemacht der nach 10 Minuten los geht. Den habe ich 
eingeschaltet als ich versuche mit dem GSM-Modul eine Verbindung 
aufzubauen, und wenn der abläuft geht das Gerät in den "sicheren 
Zustand" Neustart. Das war in diesem Falle eine sinnvolle Möglichkeit.

In einem anderen Projekt habe ich den WD über einen Prozess mit geringer 
Priorität zurück gesetzt. Wenn also andere Teile des Systems zu viel 
Rechenleistung beanspruchen wird neu gestartet, da dies in diesem Falle 
ein fehlerhafter Zustand wäre.

Watchdogs sind kein Zauberding. Die sind ein Werkzeug mit dem Du 
bestimmte Probleme lösen kannst.

von Michael S. (msb)


Lesenswert?

Ich habe gute Erfahrungen mit folgender Technik gemacht:

Den Watchdog im Timerinterrupt triggern, aber nur wenn nach 
Dekrementieren von 1..n Zählern keiner dieser Zähler auf Null läuft.

Diese Zähler werden in verschiedenen zu überwachenden Routinen (z.B. 
Idle-Loop) auf den Wert setzt, der die maximal tolerierbare Zeit eines 
Durchlaufs plus Sicherheitspuffer darstellt.

Das geht auch mit Inkrementieren im Interrupt, Nullsetzen an der 
Überwachungsstelle und einer Tabelle der Maximalwerte. Das vereinfacht 
die Initialisierung und die Maximalwertverwaltung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.