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;
}
************************************************************
最新文章
- 网络知识学习1---(基础知识:ISO/OSI七层模型和TCP/IP四层模型)
- Java汉字转拼音
- mysql ODBC 在64位下提示找不到odbc驱动问题
- JAVA基础英语单词表(上)
- jquery在不同浏览器获取文件路径出现问题!
- Altium Designer 6 快速进行差分对走线
- javascript第十五课:DOM
- 十二、 Spring Boot 静态资源处理
- python中 functools模块 闭包的两个好朋友partial偏函数和wraps包裹
- IPython绘图和可视化---matplotlib
- CCS中cmd文件的编写
- MySQL 日期类型函数及使用
- ireport使用
- Asp.netMVC中Html.Partial,RenderPartial,Action,RenderAction区别和用法
- 20172301 2017-2018-2 《程序设计与数据结构》实验一《Java开发环境的熟悉》实验报告
- python 库资源大全
- sqoop2-1.99.5-cdh5.5.4.tar.gz的部署搭建
- Tensorboard 的使用笔记
- ssh &; sftp &; MacOS
- 大端小端转换,le32_to_cpu 和cpu_to_le32