Hi,
ich möchte für ein Softwareprojekt eine State Machine in Ansi C
programmieren. Wie realisiert man dies in der Programmiersprache Ansi C?
Ich suche dazu ein kleines anschauliches Beispiel. Kann mir jemand sagen
wo ich dazu Unterlagen im Netz finden kann?
Hmmm... aus diesem Beitrag kann ich nichts entnehmen, was ich für mich
brauchen könnte. Hier wird der Funktionszeiger erwähnt. Kann mir
trotzdem nicht vorstellen wie das funktionieren soll. Hat dazu jemand
ein kleines Beispiel mit Funktionszeiger?
Progger schrieb:
> Hmmm... aus diesem Beitrag kann ich nichts entnehmen, was ich für mich> brauchen könnte. Hier wird der Funktionszeiger erwähnt. Kann mir> trotzdem nicht vorstellen wie das funktionieren soll. Hat dazu jemand> ein kleines Beispiel mit Funktionszeiger?
Für deine erste Statemachine würde ich dir keine Funktionszeiger
empfehlen, solange du noch danach fragen musst. Du hast sonst zuviele
Baustellen.
Nimm die klassische Form:
* Es gibt States
* Jeder State hat eine Nummer (die sofort mit einem #define einen
symbolischen Namen bekommt)
* Der momentan aktive State ist in einer (globalen) Variablen
gespeichert
* Wird aufgrund irgendwelcher Bedingungen der State gewechselt, dann
ist das einfach eine Zuweisung an diese Variable
* Die Statemachine wird periodisch aufgerufen und macht ihr Ding
je nachdem in welchem State (=Zustand) sie ist
* Die eigentliche Statemaschine ist ein
1
switch(state){
2
3
caseZUSTAND_1:
4
// mach irgendwas
5
break;
6
7
caseZUSTAND_2:
8
// mach was anderes
9
break;
10
11
caseZUSTAND_3:
12
// und jetzt ganz was anderes
13
14
// der nächste Zustand ist ZUSTAND_2
15
state=ZUSTAND_2;
16
break;
17
18
caseZUSTAND_4:
19
// je nachdem
20
if(....)
21
state=ZUSTAND_1;
22
else
23
state=ZUSTAND_2;
24
brea;
25
26
....
27
28
default:
29
// ungültiger Zustand!
30
// Sollte eigentlich nie auftreten
31
}
Deine erste Statemachine wird noch nicht allzuviele Zustände haben,
sodass das organisatorisch noch gut zu handhaben ist.
Die Hauptarbeit beim Bau einer Statemachine ist ja auch nicht die
Programmierung, sondern das Identifizieren welche States es geben soll
und wie und warum die Statemachine von einem Zustand in einen anderen
Zustand überwechselt und welche Aktionen dabei ausgeführt werden sollen.
Hast du dir mal Wikipedia durchgelesen?
http://de.wikipedia.org/wiki/Endlicher_Automat
ist ganz gut beschrieben.
Ganz einfach ist das Beispiel mit der Tür.
Nach tür-öffnen kommt tür-schließen.
tür-schließen bei Tür-zu ist ja irgendwie sinnlos.
Hier noch eine weitere Methode einer (stark
vereinfachten)tabellengesteuerten Zustandsmaschine. Die Grundidee stammt
aus einem Artikel, der ca 1990 im C-Users Journal veröffentlicht wurde.
Das Bemerkenswerte hier ist, dass die Wahrheitstabelle, wie man sie etwa
auf dem Papier erstellen und optimieren würde, direkt die Maschinentafel
übernommen wird.
Auf des Grund des strukturierten Datentyps sind beliebige Erweiterungen,
Verschachtelungen, Abwandlungen usw. der Zustandsmaschine möglich.
Im vorliegenden Programm wird Tastenfolge 'quertz' oder 'querty'
abgefragt.
Für den Einstieg wurden genüg Beispiele gezeigt.
Du brauchst keinen Quellcode zum Copy/Reinpasten ;)
Abtippen ist angesagt. Glaub mir :)
Was FSM angeht, so gibt es viele Möglichkeiten denkbar.
a) Eine uC timer interrupt routine, die regelmässig aufwacht,
ihre inputs (Pins zB) checkt, dann neuen Zustand berechnet und
neue Ausgaben (Pins zB beschreibt). => Input kommt aus Jetzt!
=> reaktives System
b) Compiler kann als FSM betrachtet werden. Tokens, also Input,
wird Zeichen oder Tokenweise aus einer bereits stehenden Quelle(Datei)
geholt. => Input kommt Stückweise, aber an sich aus einem Guss.
c) wenn Software auf mehrere Threads verteilt ist, so ist die
Situation ähnlich Punkt a). Inputs stammen aber aus anderen Thread.
Der Thread mit FSM kann zb blockierd warten. => siehe zB Kernel.
Falls jemand noch etwas einfällt bitte eintragen.
Ich denke das meiste ist damit erschlagen ;)
@progger,
der Linker beschwert sich, weil er einige Objekte in deinem
(Programm)-Fragment nicht finden kann. Kann ich ihm nachfühlen, denn der
Quelltext, so wie in deinem Beitrag abgebildet, ist nicht vollständig
übernommen bzw verstümmelt.
Bitte daran denken, dass das Beispiel unter Windows als
'Konsole-Anwendung'(Dos läßt grüßen) laufen sollte.
mfg
Was soll man da noch machen?
Das obige Beispiel von G.O.
(Beitrag "Re: State Machine in Ansi C")
IST lauffähig unter VC++ 6.0 (zumindest wenn man den Aufruf von
clrscr() entfernt, ein echter "Progger" schafft das, und sogar
ich als Maschinenbauer habe es hinbekommen).
Auch wenn man es genau so nicht übersetzt bekommt, könnte man
mit etwas gutem Willen daran sehen, wie ein Automat funktionieren
kann - deiner wird sowieso etwas anderes machen müssen als Tasten
abzufragen.
Progger schrieb:
> Für den Einstieg bräuchte ich ein lauffähiges Beispielprogramm in AnsiC.
ANSI-C und Visual C++ 6.0 sind zwei verschiedene Dinge.
Das obige Beispiel ist wie gesagt lauffähig (vom clrscr() abgesehen).
Wenn du es nicht schaffst, das zu übernehmen, ohne es zu verhunzen,
kann ich dir ein günstiges Angebot machen, vor Ort den Quelltext
in deinen Editor zu kopieren. Spesen gehen extra.
> Kennt jemand da eine gute Quelle?
Ja.
BTW:
Wofür steht eigentlich der schöne Name "Progger"?
Progger schrieb:
> Ich hab nun mal den Code vom obigen Beitrag "Datum: 25.06.2009 15:14 "> in ein neus Visual Studio 6.0 C++ Projekt eingefügt. Der Compiler spuckt> mir immer folgende Fehlermeldungen aus:
Die sollte mann dann auch lesen und wenigstens versuchen zu verstehen.
So schwer ist das nicht.
Der Linker (nicht der Compiler) beschwert sich, dass er print_e nicht
finden kann. Also vergleichst du einfach mal wo in deinem Programm
print_e vorkommt und wo in deiner Vorlage print_e vorkommt.
Ich habe nichts gegen copy&paste Programmierung. Ab und an braucht man
einfach eine Vorlage, die man studieren kann. Aber dann sollte man
wenigstens in der Lage sein, die Vorlage komplett zu kopieren!
Und ob du bei derartigen Problemen eine Statemachine, die auf
Funktionspointern beruht in Eigenregie zum laufen kriegst, da hab ich so
meine Zweifel.
@Progger
Na dann funktionierts ja wohl.
@Karl heinz Buchegger
Nicht so streng, jeder hat 'mal angefangen.
An dieser Stelle soll noch der erwähnte Artikel nachgereicht werden:
Alan Cline: Build Applications Faster with State Transition Automatons,
erschienen Dezember 1992 ab Seite 93 im 'C Users Journal'. Der Quellcode
war oder ist im Rahmen der Wal-Nut-Creek Cd-Rom im Internet verfügbar.
Ich finde Clines Konzept einfach genial. Von allen Methoden
Zustandsmaschinen zu konstruieren, ist diese die einfachste und
flexibelste, die ich kenne. Mit ihr lassen sich besonders gut Tokeniser,
Parser, Protokollstack(zB Carson: PPP Design, Implementation and
Debugging (!mehrdimensionale Maschinentafel!)) usw. aufbauen. Ich
verwende sie hauptsächlich für die Programmierung umfangreicher
Menüstrukturen (Wettbewerbsbeitrag 2008: Tinykon).
mfg
Hi,
Have a look here: http://code.google.com/p/fwprofile/
It's an open source version (GNU GPLv3) of the state machine implemented
in C. The concept and implementation is well-suited for use in
mission-critical applications. There are deployments in industrial
applications.
Regards
Vaclav
We're not really keen on digging up threads that have been dead or
dormant for a long time. You've just managed to do so with a thread
three years old.
Do you really think that the participants were sitting in front of their
computers for three years, waiting for your contribution to arrive?
So, please refrain from attempts to rise the un-dead.
Yes, someone is still redanig it The point is, though, that currently
we have 2 different editions . One with full Unicode capabilities and
one with ANSI only. ANSI is also always slower, because all the ANSI
APIs on Windows NT and later convert the string to Unicode anyway (well,
as much as a mapping is possible). 64bit and ANSI is pointless. But
should we drop ANSI ultimately (not necessarily the option to get back
to it, but cease to develop that branch, so to speak or should we
continue ANSI + Unicode 32bit + Unicode 64bit.BTW: The performance
impact on WOW64 programs is minimal. Has to do with how the stuff is
passed to the kernel. And depending on what you consider low-level, I
cannot really see what information is hidden from WDS that would be
interesting for this kind of application
Progger schrieb:> Für den Einstieg bräuchte ich ein lauffähiges Beispielprogramm in AnsiC.
Das ist schon mal kein ANSI-C
#include <conio.h>
#include <windows.h>
> Kennt jemand da eine gute Quelle?
Die besten Quellen die ich kenne sind meine eigenen :-))