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状态机结合成系统:
生成事件->对事件进行排队->围绕状态机编写代码让他们全部运行->用一种即时方式通信并且不会产生并发危急