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

xiaoxiao2021-02-28  56

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;  /*!<current active state (state-variable) */

   union QHsmAttr temp;  /*!<temporary: tran. chain, target state, etc. */

} QHsm;

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

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

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

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

3.  全部状态处理函数

QEP_TRIG_函数  :触发一个状态。

状态机转换的优化

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

使用QEP实现HSM步骤的概要

1.  枚举信号、

2.  定义事件

3.  派生特定的状态机

4.  定义初始伪状态

5.  定义状态处理函数

UML状态机结合成系统:

    生成事件->对事件进行排队->围绕状态机编写代码让他们全部运行->用一种即时方式通信并且不会产生并发危急
转载请注明原文地址: https://www.6miu.com/read-2621666.html

最新回复(0)