QP 状态机学习笔记2(第四章)

QEP层次式事件处理器

Q-SPY 软件追踪输出

事件实例= 信号 + 事件变量

用父类指针指向子类对象,在使用子类的时候需要将其转换成子类指针。

事件实例主要被当做“包”来使用,来传递信号和事件参数。

关键语句

问题

文中关键语句:

QEP内部维护一个不变的保留事件数组

QEP_reservedEvt_[]
关键结构体
typedef struct {
    QSignal sig;              /*!< signal of the event instance */
    uint8_t poolId_;          /*!< pool ID (0 for static event) */
    uint8_t volatile refCtr_;    /*!< reference counter */
} QEvt;

typedef QEvt QEvent;

union QHsmAttr {

    QStateHandler  fun;        /*!< pointer to a state-handler function */

    QActionHandler act;        /*!< pointer to an action-handlerfunction */

   struct QMState const *obj;         /*!< pointer to QMState object */

   struct QMTranActTable const *tatbl;     /*!< transition-action table*/

};

 

 

typedef struct {

   struct QHsmVtbl const *vptr;  /*!< virtual pointer */

   union QHsmAttr state;  /*!

   union QHsmAttr temp;  /*!

} QHsm;

typedefQHsm     QFsm;  //也就是说 QFsm和QHsm一样

这个实现的和应用程序相关的部分提供的要素展示在图3.9 的虚线部分。这些要素是:

1.   从QEvent结构派生的带有参数的事件

2.   从QFsm 派生的包含全部扩展状态变量的状态机结构

3.  全部状态处理函数

QEP_TRIG_函数  :触发一个状态。

状态机转换的优化

    对需要高效执行的最常用的状态转换类型的工作量所做的优化。

使用QEP实现HSM步骤的概要

1.  枚举信号、

2.  定义事件

3.  派生特定的状态机

4.  定义初始伪状态

5.  定义状态处理函数

UML状态机结合成系统:

    生成事件->对事件进行排队->围绕状态机编写代码让他们全部运行->用一种即时方式通信并且不会产生并发危急



你可能感兴趣的:(状态机)