www.mikrocontroller.net

Forum: Compiler & IDEs Implementierung einer komplizierten Hierarchische State Machine


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte eine ziemlich komplizierte Hierarchische State Machine in C 
implementieren.

Hier sehe ich folgende zwei Ansätze:

-mit switch-Anweisungen (siehe auch Artikelsammlung)

-oder mit Funktionszeigern (hier habe ich einige Ansätze gesehen, aber 
leider noch nicht ganz verstanden, z.B. hier www.state-machine.com/ bzw. 
http://www.accu-usa.org/Slides/samek0311.pdf oder kennt jemand hier ein 
besseres Bsp.)


Ist der Weg über Funktionszeiger bei komplizierten Projekten nun 
besser/übersichtlicher/SICHERER???

Welchen Weg würdet ihr warum wählen?

Autor: Oiver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank schrieb:
> Ist der Weg über Funktionszeiger bei komplizierten Projekten nun
> besser/übersichtlicher/SICHERER???

Jain. Alles ist relativ ;-)

Schau die mal die Zustandsmaschine aus der Software zum Atmel butterfly 
an. Die findest du auch in einer Version für avr-gcc im Netz.

Oliver

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm das in diesen paar Folien referenzierte Buch ("Practical 
Statecharts in C / C++") und arbeite es durch. Sobald du es verstanden 
hast, siehst Du dann weiter.

Meine Meinung (ich habe das Buch vor Jahren gelesen):
Zu komplex! Das, was der C++-Compiler an Funktionspointerei aus gutem 
Grund vor dem Anwendungsentwickler verbirgt, genau das darf jetzt der 
Anwendungsentwickler "von Hand zu Fuß" implementieren.

Bernhard

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Prinzip per Funktionspointer, aber praktisch per Index.
D.h. für 5 Ebenen brauchst Du nur 5 Indexe und hangelst Dich daran 
entlang.

Der Vorteil eines Index gegenüber einem Pointer ist, Du kannst einfach 
damit rechnen (nächter, vorheriger) und er kann nicht in den Wald 
laufen.
Kleiner als 0 geht nicht und der Überlauf kann vor dem Zugriff einfach 
abgeprüft werden (>=sizeof(array)).

Und wenn die Menüs nicht >256 sind, ist ein Index auch codesparender.


Peter

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

gibt's dafür ein Beispiel?

Autor: Ano Nym (oorim)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich hab vor längerem mal eine FSM gebaut (Finite State Machine). Das 
ganze funktioniert mit Fuktionspointer und Priorität. Schaus dir einfach 
mal an.

Grüße


Edit: An den Zuständen und Events nicht stören, das war eine Stoppuhr ;)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank schrieb:
> gibt's dafür ein Beispiel?

Kann ich aber nicht veröffentlichen.

Im Prinzip hast Du eine einzige Menüfunktion.
Der wird ein Pointer auf einen Menüeintrag übergeben. Dieser zeigt auf 
den Formatstring, einen Zeiger auf die Tastaturliste und Zeiger auf 
Parameter.

Der Formatstring stellt den Menütext dar und optional einige Parameter.

Die Tastaturliste enthält die Tastenbelegung, d.h. was beim Drücken 
einer Taste passieren soll.
Z.B. in ein Menü hinein, zurück zum übergeordneten Menü, einen Menüpunkt 
hoch/runter, einen Parameter auswählen, ändern usw.

Da ja die meisten Menüpunkte die gleiche Tastenbelegung haben werden, 
eine extra Liste. Spart Platz gegenüber der Definition aller Tasten in 
allen Menüs.

Wieviel Zeiger auf Parameter man benötigt, muß man vorher festlegen, 
d.h. wieviel ein Menü maximal anzeigen kann.


Peter

Autor: StinkyWinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde die Methode mittels Funktionspointern bevorzugen, weil man 
handlichere Einheiten bekommt, die mittels Unit-Tests besser zu prüfen 
sind als ein riesiges Switch-Case gewurstel.

Autor: Ano Nym (oorim)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe mein Beispielcode :D

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.