FSST - Hardwarenahe Programmierung

Zustandsdiagramm

C++ Seite

Ein Zustandsdiagramm (auch Zustandsmaschine, State Machine Diagram - kurz STM, Zustandsautomat, genannt) ist ein Graph mit Zuständen als Knoten und Zustandsübergängen als Kanten, die durch Ereignisse (Events) ausgelöst werden. In jedem Zustand wird schließlich eine Aktivität (Task) ausgeführt. In der Objektorientierung handelt es sich normalerweise um die Zustände eines Objekts einer gewissen Klasse.


Bulme PE Coding Style (siehe auch State Machine Design in C++ (Code Project) und C++ Coding Style):


Zustände der State Machine (STM):

  • Zustände (states) werden als Konstante oder Aufzählungstypen (enumerations) definiert.
  • Namen der Zustande (states) werden groß geschrieben und für eine eindeutige Zuordnung zur State Machine (STM) ein "ST_" vorangestellt (Präfix).

// Constants
const int ST_IDLE = 0;
const int ST_NEXT = 1;
// Declaration of variable state
uint8_t state;

oder mit enum ein "neuer" Datentype State erzeugt:

// Enumerations
enum State {ST_IDLE=0, ST_NEXT};
// Declaration of variable state 
State state;

oder mit enum mit Type aliases (typedef)

// Enumerations with typedef
typedef enum {ST_IDLE=0, ST_NEXT} State;
// Declaration of variable state
State state;


Funktionen der State Machine (STM)

  • heißen gleich wie der Zustand (state): Präfix ""ST_" und Zustandsname, der allerdings in PascalCase auch UpperCamelCase geschrieben wird.
  • haben keinen, also einen leeren (void) Rückgabetype und keine (also auch void) Parameter.

// State machine state functions prototyping
void ST_Idle(void);
void ST_Next(void);

Funktionenimplementierungen bestehen aus entry, do Aktivität (Task) und exit, wobei entry und exit auch weggelassen werden kann:

// State function for i.e. idle state
void ST_Idle(){
    // entry
    // do
    while(true) {
        led1 = 1;                 // Task
        if(CheckFlag()) {         // Event driven
            state = ST_NEXT;
            // exit
            return;
        }
    }
}


Hauptfunktion der State Machine (STM) (oder in main) mit switch case:

void stateMachine()
{
    switch (state)
    {
    case ST_IDLE: ST_Idle();
        break;
    case ST_NEXT: ST_Next();
        break;
    default: ST_Error();  // sollte nicht auftreten :-)
        break;
    }
}

int main()
{
    sw1.attach_fall(&fall);   // Event for CheckFlag-function
    while(1) {
        stateMachine(); 
    }
}

Zuständen


All wikipages