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).
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.