www.mikrocontroller.net

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


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Martin Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.