FSST - Hardwarenahe Programmierung
Zustandsdiagramm
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(); } }