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
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.
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.
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.
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.
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.
Ü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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.