Eventmanager für Statemachines gesucht (C oder C++ ist egal)



  • Hallo Leute,

    ich habe sagen wir mal n StateMachines {SM1..n }, die quasi parallel abgearbeitet werden (über einen Loop) und alle durch „globale“ Events gesteuert werden sollen und auch solche Events auslösen können – etwa so:

    // specific Events for all state machines ...
    enum SM_Events {No_Event = 0, SM1_ready,SM2_ready, SM3_ready, Time_Out}; // 
    SM_Events Glob_SM_Events;
    

    Ob die StateMachines nun nach Miro Samek (Practical Statecharts in C/C++ - Quantum Programming for Embedded Systems) Vorschlag C++ basierend Aktionen aufgrund der Koinzidenz von State und Event aus struct-Arrays „StateTables“, als Funktionenpointer entnehmen und ausführen:

    void dispatch(unsigned const event) { 
    Transition const t_loc = (&StateTable)[currState][event];//get the struct	
    (this->*((&t_loc)->action))();  //execute Action 
    currState = (&t_loc)->nextState; //set the current state
    }
    
    .
    .
    .
    
    while(true) {
    dispatch(Glob_SM_Events);
    }
    

    oder nach Martin Gomez‘s (Embedded State Machine Implementation) Vorschlag, State-Funktionen aus einem 1D Funktionenpointer- Array, aufgrund eines State- Index aufrufen, der eventbasiert in den State-Funktionen festgelegt wird,

    void (*state_machine_1[])() = {SM1_State_1, SM1_State_2, SM1_State_3};
    
    .
    .
    .
    
    while (true) {
     state_machine_1[curr_SM1_State_Ptr]();
    }
    

    scheint für meine Frage egal zu sein. Also spielt es vermutlich keine Rolle nach welchem Konzept die StateMachines funktionieren – ich habe allerdings nur die genannten beiden Konzepte ausprobiert.

    Das bei mir in beiden Fällen auftretende Problem ist, dass es (noch) keinen Eventmanager gibt, d.h. wenn der Event irgendwo in einer der StateMachines zur Aktionenauslösung gelangt ist, ist der Event immer noch da und zwar so lange, bis ein neuer Event (irgendwo anders) generiert wurde. Andernfalls könnte der neue Event auch zu früh generiert worden sein, weshalb der ursprüngliche Event keine Wirkung erzielen konnte.
    Man müsste jetzt also den Event immer dort zurücksetzen, wo dieser zuletzt eine Aktion ausgelöst hatte.

    Kann mir jemand einen Tipp geben , wie dieses Problem am besten gelöst werden könnte ? Vielleicht gibt es ja auch schon für quasi - parallele StateMachines ein besseres Konzept, bei dem dieses Problem bereits gelöst ist.

    Vielen Dank erstmal fürs lesen.

    PS: Ich bitte um das Verschieben meiner Frage, sofern dies hier das falsche Subforum sein sollte.



  • 7x7-7 schrieb:

    Das bei mir in beiden Fällen auftretende Problem ist, dass es (noch) keinen Eventmanager gibt, d.h. wenn der Event irgendwo in einer der StateMachines zur Aktionenauslösung gelangt ist, ist der Event immer noch da und zwar so lange, bis ein neuer Event (irgendwo anders) generiert wurde. Andernfalls könnte der neue Event auch zu früh generiert worden sein, weshalb der ursprüngliche Event keine Wirkung erzielen konnte.
    Man müsste jetzt also den Event immer dort zurücksetzen, wo dieser zuletzt eine Aktion ausgelöst hatte.

    Wenn du dich so schwammig ausdrückst, werden dir wohl nur Leute helfen können, die diese Bücher gelesen haben.



  • Hier ist mal eine Verdeutlichung meines Problems:

    +----+EVENT1  +----+ EVENT2 +----+
     | A1 +----->  | A2 +------> | A3 |
     +----+       ++-------+     +----+
                  |EVENT A2|           
                  +---+----+           
                      |                
                      +-----+          
     +----+ EVENT3 +----+   |    +----+
     | B1 +----->  | B2 +---+--> | B3 |
     +----+        +----+        +----+
    
    +-----------------+                
    | Event Generator |                
    | 1. EVENT 1      |                
    | 2. EVENT 2      |                
    | 3. EVENT 3      |                
    +-----------------+
    

    Zwei parallele SateMachines A& B werden durch externe Events 1,2 & 3 gesteuert.
    Außerdem wird StateMachine B durch einen intern generierten Event A2 gesteuert. In diesem Beispiel geht nun nun Event A2 verloren, da dieser von Event 2 überschrieben wird.
    Ich bin also auf der Suche nach Ideen, wie man mehrere Events verwalten könnte.



  • 7x7-7 schrieb:

    In diesem Beispiel geht nun nun Event A2 verloren, da dieser von Event 2 überschrieben wird.

    Was hält dich davon ab, es korrekt zu implementieren? Bedenke: Wir können weder in deinen Code, noch in deinen Kopf hineinsehen.



  • Was du wolle ? 😕


Log in to reply