Hsm状态机init()和dispatch()流程

 

(LCA)共同祖先状态:首先找到s(原状态)能处理t(目标状态)的超状态,然后找到t(目标状态)到上一步超状态的退出路径p[]并保存,
最后沿着退出路径进入t目标状态。

 

 

QHsm_dispatch_(QHsm * const me, QEvt const * const e) {(通过函数参数me传入终状态)

typedef QState (*QStateHandler)(void * const me, QEvt const * const e);(QStateHandler为函数指针,QState为unsigned int类型)
QStateHandler  path[QHSM_MAX_NEST_DEPTH_];(QHSM_MAX_NEST_DEPTH_为状态机嵌套的最大深度)

s(source,源状态)

t(target,终状态)

r(return,状态函数返回值)

******************************************************

s = me->temp.fun;

在initial时会使用Q_TRAN(target_),  Q_TRAN调用会将状态事件函数指针传入(me)->temp.fun

r = (*s)(me, e);调用状态处理程序

1.函数调用流程#define Q_TRAN(target_)  \
    ((Q_HSM_UPCAST(me))->temp.fun = Q_STATE_CAST(target_), (QState)Q_RET_TRAN)(将target_转化为具体事件的状态变化函数)

    程序调用完成返回status_ = Q_HANDLED();

    #define Q_HANDLED()      ((QState)Q_RET_HANDLED)      Q_RET_HANDLED为传递给子机超状态的事件

2.参数e的调用流程 在QF_run(void) {函数中 得到e = QActive_get_(a); 调用 QHSM_DISPATCH(&a->super, e, a->prio);将e值传递

    #define QHSM_DISPATCH(me_, e_, dummy) \
          ((*(me_)->vptr->dispatch)((me_), (e_)))

 

void QHsm_ctor(QHsm * const me, QStateHandler initial) {
    static struct QHsmVtbl const vtbl = { /* QHsm virtual table */
        &QHsm_init_,
        &QHsm_dispatch_
    };
    me->vptr      = &vtbl;
    me->state.fun = Q_STATE_CAST(&QHsm_top);
    me->temp.fun  = initial;
}

************************************************************

 

posted @ 2021-06-02 09:07  最好不过如今  阅读(899)  评论(0)    收藏  举报