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 @   最好不过如今  阅读(813)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示