Hallo,
ich will bei meinem Programm den Watchdog integrien, um auf etwaige
Mißgeschicke vorbereitet zu sein. Das Rücksetzen wollte ich zuerst nur
im main() vornehmen, jedoch erlauben dies manche Unterprogramme aufgrund
langer Durchlaufzeiten (Menü mit Benutzereingabe - do-while-Schleifen)
nicht. Nun muss ich wohl oder übel in jeder Schleife den Watchdog
rücksetzen, oder gibt es da noch einen anderen Weg (ausgenommen Watchdog
deaktivieren)?
Grüße
Hans
1. Menü mit Benutzereingabe mittels einer Art State Machine realisieren.
Hat auch den Vorteil, daß andere Hintergrund-Tasks leichter integriert
werden können, falls (später) mal benötigt.
3. Falls es nur um eine oder zwei längere Schleifen geht, dort das
Rücksetzen des Watchdog integrieren. Hab zu DOS-Zeiten öfter mal Menüs
implementiert, da wäre es um eine einzige Schleife gegangen. Wenn nicht,
solltest du deinen Programmierstil grundsätzlich mal überdenken...
Danke für die schnelle Antwort. Die Idee mit der State-Maschine wäre
eine Möglichkeit, aber um die getätigten Benutzereingaben zu speichern
müsste ich doch dutzende globale Variablen verwenden. Ist das ein
besserer Programmierstil?
Hans
Benutzereingaben sind sozussagen immer Global weil sie von gaaaanz außen
kommen.
Ich mache das immer so das ich eine Funktion habe die ganz global alle
eingänge einließt und entprellt und sich merkt ob eine Taste gedrückt
aber noch nicht ausgewertet wurde.
Diese Funktion wird in einem Timerinterupt aufgerufen. Somit verpasst
man keine Eingaben.....
In der Main habe ich dann eine große Whileschleife, die die "SM" bildet.
Funktioniert bei vielen Projekten und Personen wunderbar. Macht es sonst
noch jemand so?
>Nun muss ich wohl oder übel in jeder Schleife den Watchdog>rücksetzen,
Super Idee, wenn sich der Controller genau in dieser Schleife
aufhängt...
>Ist das ein besserer Programmierstil?
Ja. Beim Programmieren geht es eher selten um eine
Schöheitskonkurrenz...
Wenn du etwas mehr zu deinem Vorhaben schreiben würdest, könnte man dir
vielleicht auch Tipps geben, die sich in der Praxis schon bewährt haben.
Aber so, kann man nur eine weitere Runde Kristallkugelbillard spielen...
@Ulrich
mache ich genauso, evtl. noch mit hierarchischen Unter-SM für
Teilabläufe.
Zur Auswertung der Tasten bietet sich die "bulletproof"-Lösung
von Peter Danegger an - läuft bei mir überall, ab AT90S1200,
auch für die beiden Tasten der Heizgriff-Steuerung...
@Hans
Es geht durchaus schlechter, man kann z.B. einen Timer-Interrupt
für die Watchdog-Triggerung benutzen... :-/
Ahoi, Martin
Martin Schneider wrote:
> Es geht durchaus schlechter, man kann z.B. einen Timer-Interrupt> für die Watchdog-Triggerung benutzen... :-/
Das ist durchaus ne sehr gute Lösung, wenn mans richtig macht.
Jeder wichtige Prozeß kriegt nen Counter zugewiesen, denn er nach
Ausführung auf das gewünschte Timeout setzt.
Und der Timerinterrupt zählt nun alle diese Counter runter und bleibt
stehen (Endlosschleife), wenn einer Null ist, bis eben der Watchog
zuschlägt.
Nur wenn keiner Null war, dann triggert er den Watchdog.
Damit ist man sehr flexibel und kann mehrere wichtige Prozesse mit
unterschiedlichen Timeouts überwachen.
Peter
Ulrich wrote:
> In der Main habe ich dann eine große Whileschleife, die die "SM" bildet.> Funktioniert bei vielen Projekten und Personen wunderbar. Macht es sonst> noch jemand so?
Ich mache das auch immer so.
Der Trick dabei ist, man muß ein wenig umdenken.
Man macht einfach sämtliche Warteschleifen abweisend.
Statt darin hängen zu bleiben, bis das gewünschte Ereignis eintritt,
geht man zum Main zurück, solange das Ereignis nicht eintritt.
Das Main ruft einen dann immer wieder neu auf, bis das Ereignis da war
und man weitermachen kann.
Das ist kaum aufwendiger als die wartende Programmierung, ergibt aber
ein echtes Multitasking-Gefühl (superschnelle Reaktion, mehrere Aktionen
gleichzeitig).
Manchmal muß man sich bloß ne Merkvariable anlegen, damit man beim
nächsten Aufruf weiß, wo man weitermachen muß (switch-Statement mit den
einzelnen Aktionen).
Peter
Ulrich wrote:
> In der Main habe ich dann eine große Whileschleife, die die "SM" bildet.> Funktioniert bei vielen Projekten und Personen wunderbar. Macht es sonst> noch jemand so?
Habe ich bisher auch so gemacht. Funktioniert recht gut.
Für ein aktuelles Projekt verwende ich aber direkt einen kooperativen
Scheduler. Die Methode finde ich persönlich noch angenehmer da ich kaum
noch globale state Variblen brauche und einfach Funktionen wie
wait_until_key_pressed();
in Menüs verwenden kann. Nebenbei wird nach einem Watchdog Reset gleich
ausgelsesen welcher Task zuletzt lief - wer also wahrscheinlich der
Schuldige ist. (wait_until_key_pressed() muss dann natürlich intern für
eine Taskumschaltung sorgen.)
Der Watchdog Reset erfolgt in einem eigenem Task (auf Empfehlung von
Peter Dannegger).