码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2021-06-02 20:51:10      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:cto   type   hand   ***   source   事件   值传递   函数返回   idt   

技术图片

 

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_)

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;
}

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

 

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

标签:cto   type   hand   ***   source   事件   值传递   函数返回   idt   

原文地址:https://www.cnblogs.com/zhanyaowang/p/14839809.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!