Forum: Compiler & IDEs Hilfe bei Statemachine (Yakindu C-Code)


von Michael S. (michael8192)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe gerade das Statemachine Turorial gelesen:
http://www.mikrocontroller.net/articles/Statemachine
und einen ersten Versuch mit dem Yakindu SCT gemacht (das Ampelbeispiel 
1, allerdings wird der Statewechsel nicht mit einem Timer sondern auf 
Tastendruck durchgeführt).
Der C-Code Genarator erstellte mir 4 Files (Anhang).
Wie kann ich diese Statemachine jetzt in einem Programm verwenden. Ich 
weiss nicht, was ich als Funktionsparameter übergeben soll.

Als erstes muss wohl die SM initialisiert werden mit der Funktion:
1
void ampel_init(Ampel* handle) //was muss ich hier genau übergeben?
2
{
3
...
4
}

Vielleicht hat jemand schon Erfahrung mit dem Codegenerator gemacht und 
kann mir mal die ersten Schritte erklären.

Danke.

von Mike (Gast)


Lesenswert?

Michael S. schrieb:
> Ich weiss nicht, was ich als Funktionsparameter übergeben soll.

Du brauchst eine Variable vom Typ Ampel. Übergeben tust du einen 
Pointer auf diese Variable

von Michael S. (michael8192)


Lesenswert?

Danke für Deine Antwort.

Der Datentyp "Ampel" ist in ampel.h als structure definiert:
1
/*! Type definition of the data structure for the Ampel state machine.
2
This data structure has to be allocated by the client code. */
3
typedef struct
4
{
5
    AmpelStates stateConfVector[AMPEL_MAX_ORTHOGONAL_STATES];
6
    sc_ushort stateConfVectorPosition; 
7
    AmpelIfaceUser ifaceUser;
8
} Ampel;

Mike schrieb:
> Du brauchst eine Variable vom Typ Ampel. Übergeben tust du einen
> Pointer auf diese Variable

Aber welches Element muss ich dann uebergeben
und welchen Zweck haben diese?
Wie übergebe ich dann den Pointer in diesem Fall?
1
void main (void)
2
{
3
    ampel_init(Ampel.stateConfVector); //Element ist ein Array, kein Adressoperator?
4
    ampel_init(&Ampel.stateConfVectorPosition); //???
5
    ampel_init(&Ampel.ifaceUser);  //???
6
}

von Mark B. (markbrandis)


Lesenswert?

Das ist nun nicht schwer:

1
Ampel my_ampel;        // Eine Variable von Typ "Ampel" anlegen
2
ampel_init(&my_ampel); // Adresse der angelegten Variable übergeben

von Mark B. (markbrandis)


Lesenswert?

Im übrigen kann man die Variable auch auch dem Heap anlegen anstatt (wie 
in meinem Beispiel) auf dem Stack. Dann würde man malloc() verwenden.

von Michael S. (michael8192)


Lesenswert?

Danke,

ich habe mir das falsch gedacht...
Ich habe gedacht, dass ich an die Funktion die Adresse von einem 
"Handler" mit einer ID oder sowas übergeben muss, die ich vorher 
festlege.

Mark Brandis schrieb:
> Ampel my_ampel;        // Eine Variable von Typ "Ampel" anlegen
> ampel_init(&my_ampel); // Adresse der angelegten Variable übergeben

Also ich lege eine Variable (typ structure) an und übergebe diese ohne 
irgendeine Zuweisung. Die Variable wird dann in der Funktion 
weiterverarbeitet (und weitergegeben als Adresszeiger).

Ok. Also nach der Initialisierung kann ich dann direkt auf die SM 
ampel_runCycle() zugreifen?
Der Codegenerator hat recht viele Funktionen erstellt (in ampel.c), 
deren Zweck ich noch nicht erkennen kann.
Ich muss ja jetzt in den State 0 gelangen (Ampel rot) und dann durch 
eine Benutzeraktion (Tastendruck) in den Zustand State 1 gelangen usw.
Vielleicht kann mir da jemand helfen?
1
char getbutton(void)
2
{
3
    //Tastenabfrage
4
    return (1);
5
}
6
7
8
void main (void)
9
{
10
    Ampel my_ample;
11
    Nop();
12
    Nop();
13
    Nop();
14
    ampel_init(&my_ample);
15
    ampel_enter(&my_ample);
16
    while(1)
17
    {
18
        if(getbutton()==1)
19
        {
20
            ampelIfaceUser_raise_tick(&my_ample);
21
        }
22
        ampel_runCycle(&my_ample);
23
    }
24
}

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.