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;
}
************************************************************
Hsm状态机init()和dispatch()流程的更多相关文章
- QEP之init()和dispatch()流程图
抽象状态机类QFsm或QHsm有一个函数指针,用于在继承的具体状态机类中指向具体的状态函数,其有两个对外的接口函数init()和dispatch(),其工作原理是理解状态机处理事件过程的关键. 具体状 ...
- Android的init过程:init.rc解析流程
这几天打算看下安卓的代码,看优秀的源代码也是一种学习过程,看源代码的过程就感觉到,安卓确实是深受linux内核的影响,不少数据结构的使用方法全然一致.花了一中午时间,研究了下init.rc解析过程,做 ...
- ARM-Linux移植之(三)——init进程启动流程分析
我们通常使用Busybox来构建根文件系统的必要的应用程序.Busybox通过传入的参数来决定执行何种操作.当init进程启动时,实际上调用的是Busybox的init_main()函数,下面我们来分 ...
- kubeadm init 命令执行流程
- (转)Ubuntu init启动流程分析
原文 upstart homepage 现行的Linux distros主流的有两种init方式:一种是广为流传的System V initialization,它来源于Unix并且至今仍被各种Lin ...
- BusyBox init工作流程
linux启动完成后,运行由Busybox产生的init进程. /sbin/init是系统启动的第一个用户进程,pid=1.init的工作是根据/etc/inittab脚本来进行系统的初始化工作,关机 ...
- MapReduce源码分析之作业Job状态机解析(一)简介与正常流程浅析
作业Job状态机维护了MapReduce作业的整个生命周期,即从提交到运行结束的整个过程.Job状态机被封装在JobImpl中,其主要包括14种状态和19种导致状态发生的事件. 作业Job的全部状态维 ...
- 内核启动流程3--Busybox的init进程
Busybox是用来制作文件系统的一个工具集,可以用来替换GNU fileutils shellutils等工具集,它为各种小型的或者嵌入式系统提供了比较完全的工具集. 它提供的核心程序中包括了用户空 ...
- Hogp连接流程分析
当BLE设备已经完成配对,并且完成GATT服务的搜索,下一步就开始profile 的连接流程了,一般LE设备都是走的HOGP的流程,我们这篇文章就分析一下hogp的连接流程. 连接是从framewor ...
- openwrt procd启动流程和脚本分析
Linux内核执行start_kernel函数时会调用kernel_init来启动init进程,流程如下图: graph LR A[start_kernel] -->B(rest_init) B ...
随机推荐
- 基于ZR.VUE 前端的改造,页面刷新报错
问题描述: 前后端分离开发,分开部署. 页面刷新 直接报404 错误的解决办法 提示: 先在 .env.development 中 配置 VUE_APP_BASE_API , 将 '/' 替换为 后 ...
- 模仿 vscode-server 把本地代码目录映射到外网
目录 概述 分析 解决方案 准备一台VM 创建容器 SmartIDE 创建 直接使用 docker 创建 SSH 远程转发 内网穿透 ngrok frp 服务端 客户端 本文模仿 vscode-ser ...
- CH334U与FE1.1S功能对比
CH334U与FE1.1S功能对比 介绍: CH334U是符合 USB2.0 协议规范的高性能MTT 4 端口 USB2.0 HUB 控制器芯片,高ESD特性,工业级设计,外围精简,可应用于计算机和 ...
- Proxmark3 Easy 如何流畅的在Linux中操作?
前言 Proxmark3 Easy可谓是国内能买到的比较便宜的RFID卡防设备了,曾在部分hv中出现. Proxmark3 Easy是国内简化的一种设备,利用的是较早的Proxmark3的开源,基础的 ...
- Java中Elasticsearch 实现分页方式(三种方式)
目录 ES 简介 ES 的特点: 一.from + size 浅分页 二.scroll 深分页 scroll删除 三.search_after 深分页 ES 简介 Elasticsearch 是一个基 ...
- Js生成图片验证码
上代码 /** * [使用说明] * 1.生成验证码 * 函数: * generateRandomCode( dom对象Id ); * 例: * generateRandomCode( 'id' ); ...
- P8844 [传智杯 #4 初赛] 小卡与落叶
简要题意 给出一个 \(n\) 个节点的以 \(1\) 为根的树,每一个节点 \(i\) 带权 \(w_i\),初始时所有节点的权均为 \(0\).有 \(m\) 个操作,支持以下操作: 1 x,对于 ...
- 使用Lighthouse更好推动项目性能优化,性能指标详解,优化方法,需要关注指标分析
Lighthouse是什么---一种工具 Lighthouse 是一个开源的自动化工具,用来测试页面性能. 为什么要用Lighthouse----提升用户体验 Web性能可以直接影响业务指标,例如转化 ...
- 作业详解及流程控制之for循环
作业详解及流程控制之for循环 目录 作业详解及流程控制之for循环 一.作业详解 1.根据用户输入内容打印其权限 2.编写用户登录程序 4.猜年龄的游戏 二.流程控制之for循环 三.while循环 ...
- ATM购物车大作业
项目开发流程 1.需求分析:品经理与架构师,根据客户的需求,理出一套比较容易编写的流程 2.架构设计:架构师根据具体的业务需求选择 具体的开发编程语言与项目框架,所需要的数据库(主库,从库).与开发目 ...