State machines in C

前端 未结 9 1740
一整个雨季
一整个雨季 2021-01-30 07:34

What is the best way to write a state machine in C?
I usually write a big switch-case statement in a for(;;), with callbacks to re-enter the state machine when an external

9条回答
  •  时光取名叫无心
    2021-01-30 08:14

    You can use minimalist uml-state-machine framework implemented in c. It supports both finite and hierarchical state machine. The framework is very minimalist. It has only 3 API's, 2 structures and 1 enumeration.

    The State machine is represented by state_machine_t structure. It is an abstract structure that can be inherited to create a state machine.

    //! Abstract state machine structure
    struct state_machine_t
    {
       uint32_t Event;          //!< Pending Event for state machine
       const state_t* State;    //!< State of state machine.
    };
    

    State is represented by pointer to state_t structure in the framework.

    If framework is configured for finite state machine then state_t contains,

    typedef struct finite_state_t state_t;
    
    // finite state structure
    typedef struct finite_state_t{
      state_handler Handler;        //!< State handler function (function pointer)
      state_handler Entry;          //!< Entry action for state (function pointer)
      state_handler Exit;           //!< Exit action for state (function pointer)
    }finite_state_t;
    

    If framework is configured to support hierarchical state machine. It contains additional three members to represent the hierarchical relation between the states.

    typedef struct hierarchical_state_t state_t;
    
    //! Hierarchical state structure
    typedef struct hierarchical_state_t
    {
      state_handler Handler;      //!< State handler function
      state_handler Entry;        //!< Entry action for state
      state_handler Exit;         //!< Exit action for state.
    
      const state_t* const Parent;    //!< Parent state of the current state.
      const state_t* const Node;      //!< Child states of the current state.
      uint32_t Level;                 //!< Hierarchy level from the top state.
    }hierarchical_state_t;
    
    

    The framework provides an API dispatch_event to dispatch the event to the state machine and two API's for the state traversal.

    state_machine_result_t dispatch_event(state_machine_t* const pState_Machine[], uint32_t quantity);
    
    state_machine_result_t switch_state(state_machine_t* const pState_Machine, const state_t* pTarget_State);
    
    state_machine_result_t traverse_state(state_machine_t* const pState_Machine, const state_t* pTarget_State);
    

    For more details refer to GitHub project.

提交回复
热议问题