Forum: Compiler & IDEs Schlechter Programmierstil oder einzige Möglichkeit?


von Hans (Gast)


Lesenswert?

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

von der mechatroniker (Gast)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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?

von Rahul, der Trollige (Gast)


Lesenswert?

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

von Martin Schneider (Gast)


Lesenswert?

@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

von Peter D. (peda)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Malte _. (malte) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.