QP(状态机事件驱动型框架)

news/2025/11/4 11:21:39/文章来源:https://www.cnblogs.com/FBsharl/p/19189602

1 QP框架为什么简称QP

QP 这个简称可以理解为:

1)Quantum(量子) +  Platform(平台) = QP

2)量子跃迁是指微观粒子(如原子或分子)从一个量子态突然转变到另一个量子态的过程,伴随能量的吸收或释放。

3)一个借鉴了“量子跃迁”理念的、用于构建基于层次式状态机事件驱动型应用程序的完整开发平台

 

2 QP框架概述

image

3 层次式状态机是什么

       层次状态机即HFSM。在开发过程中,角色和系统的行为复杂性不断增加。传统状态机在处理复杂逻辑时,可能导致状态间的逻辑层次混乱。尤其是当一个状态需要包含多个子状态时,维护这些状态变得非常困难。引入层次状态机HFSM可以很好地解决这些问题。
  层次状态机的核心思想是,将一个状态机也作为状态,这样就能够在状态机内部嵌套多个子状态机,实现更复杂的状态切换逻辑,特别是互斥状态间的隔离,与包含状态间的共存。例如,角色可以有一个 移动状态 ,但这个状态下还可以细分为 行走 和 奔跑 子状态,明显的移动状态与行走和奔跑状态属于包含关系。角色还可以有一个 闲置状态 ,明显的闲置状态与移动状态属于互斥关系。
  层次状态机可以帮助我们清晰地管理这种复杂逻辑,使代码的组织结构更加合理,满足更多更复杂的需求

 

4 UML状态机

UML状态机,即是Unified Modeling Language State Machine。更详细的说是:用统一的建模语言,更加可视化、更加简洁、更加清晰的建立状态机。

 

 

5.1构造状态机的步骤

/*************************步骤1:定义状态机结构体*************************/
typedef struct {QHsm super;      /* 必须作为第一个成员 - 继承来自QHsm的必要属性 *//* 状态机特定属性 */uint32_t pressCount;uint32_t holdTime;
} ButtonStateMachine;//按键状态机结构体/*************************步骤2:声明状态处理函数*************************/
/*          按键状态机初始伪状态函数 */
QState ButtonStateMachine_initial(ButtonStateMachine * const me, QEvt const * const e);
/* idle     按键状态机空闲状态处理函数 */
QState ButtonStateMachine_idle(ButtonStateMachine * const me, QEvt const * const e);
/* pressed  按键状态机按压状态处理函数 */
QState ButtonStateMachine_pressed(ButtonStateMachine * const me, QEvt const * const e);
/* held     按键状态机按住状态处理函数 */
QState ButtonStateMachine_held(ButtonStateMachine * const me, QEvt const * const e);/*************************步骤3:实现状态机构造函数*************************/
void ButtonStateMachine_ctor(ButtonStateMachine * const me) {/* 调用QHsm_ctor()构造状态机me,并指定伪状态函数 */QHsm_ctor(&me->super, Q_STATE_CAST(&ButtonStateMachine_initial));/* 初始化状态机属性 */me->pressCount = 0;me->holdTime = 0;printf("ButtonStateMachine constructed\n");
}/* 初始伪状态函数 */
QState ButtonStateMachine_initial(ButtonStateMachine * const me, QEvt const * const e) {(void)e; /* 避免未使用参数警告 *//* 执行初始转换到idle状态 */return Q_TRAN(&ButtonStateMachine_idle);
}/* idle状态处理函数 */
QState ButtonStateMachine_idle(ButtonStateMachine * const me, QEvt const * const e) {switch (e->sig) {case Q_ENTRY_SIG: {printf("Entering IDLE state\n");return Q_HANDLED();}case BUTTON_PRESSED_SIG: {me->pressCount++;printf("Button pressed, count: %lu\n", me->pressCount);return Q_TRAN(&ButtonStateMachine_pressed);}}return Q_SUPER(&QHsm_top);
}/* pressed状态处理函数 */
QState ButtonStateMachine_pressed(ButtonStateMachine * const me, QEvt const * const e) {switch (e->sig) {case Q_ENTRY_SIG: {printf("Entering PRESSED state\n");me->holdTime = 0;return Q_HANDLED();}case BUTTON_RELEASED_SIG: {printf("Button released after %lu ms\n", me->holdTime);return Q_TRAN(&ButtonStateMachine_idle);}case TIMEOUT_SIG: {me->holdTime += 100; /* 假设100ms超时 */if (me->holdTime >= 1000) { /* 按住1秒进入held状态 */return Q_TRAN(&ButtonStateMachine_held);}return Q_HANDLED();}}return Q_SUPER(&QHsm_top);
}/* held状态处理函数 */
QState ButtonStateMachine_held(ButtonStateMachine * const me, QEvt const * const e) {switch (e->sig) {case Q_ENTRY_SIG: {printf("Entering HELD state - long press detected!\n");return Q_HANDLED();}case BUTTON_RELEASED_SIG: {printf("Long press released\n");return Q_TRAN(&ButtonStateMachine_idle);}}return Q_SUPER(&QHsm_top);
}

 

5.2状态处理函数如何被QP调用

- 1)在QP中,首先调用状态机构造函数QHsm_ctor(),用于构建状态机的静态结构;然后调用状态机初始化 QHsm_init(),启动状态机并执行初始转换;最后调用事件分发qhsm_dispatch(),向已初始化的状态机分发事件。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/955482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深圳市德恺检测有限公司:您的CNAS/CMA实验室认证咨询专业伙伴

深圳市德恺检测有限公司专注CNAS/CMA实验室认证一站式“包过”服务,10+年经验、500+成功案例,帮助企业高效获证,提升公信力与利润。覆盖双认证、扩项维护,适用于检测、校准领域,助力2025年市场竞争力。 在检测市场…

2025 最新智能食堂秤厂家/推荐排行榜:溯源 / 验收 / 留样秤品牌权威盘点及选购指南食堂验收智能秤/生鲜分拣智能秤/留样智能秤公司推荐

引言 智慧食堂建设的加速推进,让智能食堂秤成为保障食材计量精准、提升运营效率的核心设备,市场需求持续攀升。但当前市场乱象丛生:部分品牌缺乏核心技术,产品存在称重误差大、稳定性不足等问题;部分厂家服务体系…

贪心题目小结

题目壹 货物堆叠 时间限制:1秒 | 内存限制:128兆字节 题目描述 商店中有 n 件货物,每件货物 i 有重量 wi、初始体积 vi 和压缩系数 ci。将货物堆叠成一堆时,货物 i 的实际体积为 vi - ci * W,其中 W 是其上方所有…

faust-一个可以切换合成器音色的lfo demo

faust-一个可以切换合成器音色的lfo demoimport("stdfaust.lib");// 0 1 2 3: sin,tri,saw,square wave_shape = hslider("合成器波形选择[style:knob]",0,0,3,1);// 0 1 2 3: sin,tri,saw,square…

AGC052 VP

AGC 052 [AGC052A] Long Common Subsequence skip。 [AGC052B] Tree Edges XOR 给定一棵树,每条边有初始权值和目标权值,每次可以选择一条当前权值为 \(w\) 连接 \(u\),\(v\) 的边,将其他与 \(u\) 或 \(v\) 相连的…

2025 年液位计厂家最新推荐榜单:涵盖投入式 / 磁致伸缩 / 防爆 / 防水 / 浮球等类型,全面解析行业领先品牌技术与市场优势

引言 在工业生产与各类工程应用中,液位计是保障生产安全、提升效率的关键设备。但当前市场品牌繁杂,产品性能差异显著,为帮助用户精准选择,行业协会联合专业测评机构开展了 2025 年液位计品牌测评工作。 测评采用多…

落地案例分享 | 个人决策平台界面设计

落地案例分享 | 个人决策平台界面设计

2025学习机黑马登场!松鼠AI S20实测两个月——孩子主动刷题、精准提分不是梦

🏁 开篇:松鼠AI S20,2025年学习机中的真正黑马 2025年9月选学习机时,我没有追随“热门大牌”,而是选择了深耕自适应教育11年的专业品牌——松鼠AI。最终花近6000元入手它的旗舰机型:松鼠AI S20学习机。 作为测评…

【URP】Unity[后处理]颜色查询ColorLookup

技术定义与核心作用 ColorLookup是基于LUT(Lookup Table)技术的颜色映射系统,通过预定义的256x16像素条状PNG纹理实现全局色彩替换。其核心价值在于: ‌风格统一‌:批量修【从UnityURP开始探索游戏渲染】专栏-直达…

2025年11月常州光伏公司排名:前十强企业综合评估与选择指南

摘要 随着全球能源转型加速,常州作为中国光伏产业的重要基地,近年来在光伏技术研发、制造和应用领域取得了显著进展。本文基于行业数据、企业口碑及技术实力,整理出常州光伏公司排名前十的榜单,旨在为投资者、合作…

11/4

11/411:05基础 HTTP GET 接口请求测试操作步骤: 1.打开 JMeter,新建测试计划,右键添加线程组”(线程数1、循环次数1)。 2.线程组下添加HTTP请求”,服务器名称/IP填写httpbin.org,端口80,请求方法选GET,路径填写…

网站地址

dbeaver下载地址: https://dbeaver.io/download/

2025年吸烟亭公司排名前十:合肥荣东智能环保科技有限公司领跑行业

摘要 吸烟亭行业在2025年迎来快速发展,随着公共场所控烟政策加强和环保意识提升,专业吸烟亭需求激增。本文基于市场调研和用户反馈,综合评估吸烟亭公司的技术实力、产品质量和服务口碑,推出排名前十的企业名单,并…

2025年吸烟亭厂家综合排名:合肥荣东智能环保领衔行业标杆

文章摘要 随着环保政策加强和公共场所吸烟区需求增长,吸烟亭行业在2025年迎来快速发展。本文基于产品工艺、成本控制及客户案例,深度解析前十名吸烟亭厂家排名,为采购商提供权威参考。表单数据来源于市场调研和用户…

jmx接口

3. 简单接口并发测试 操作步骤: 1. 新建线程组,设置线程数5、循环次数2、 ramp-up时间3秒(每秒启动约2个线程)。2. 添加HTTP请求(GET方法,服务器httpbin.org,路径/delay/1,模拟1秒响应接口)。3. 添加“聚合报…

实用指南:【金仓数据库】ksql 指南(二) —— 创建与管理本地数据库

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年移动厕所厂家推荐:荣东智能环保领跑行业

文章摘要 本文针对2025年移动厕所厂家推荐需求,深入分析用户选择痛点,重点介绍合肥荣东智能环保科技有限公司的核心优势。荣东品牌拥有ISO认证、全国18家生产基地、年产量超10000个产品,并服务过淮南寿县文旅、中铁…

CF1780E Josuke and Complete Graph

考虑一个数 \(x\) 能够计入答案要满足什么条件,即存在一组 \(\gcd(a,b)=x\)。等价于 \(x|a,x|b,\gcd(\frac{a}{x},\frac{a}{x})=1\)。 贪心的想要满足 \(l\le a,b\le r\),那么 \(a\) 取最小的满足能整除 \(x\) 的数即…

线程组查看结果树与聚合报告

基础HTTP GET接口请求测试操作步骤:打开JMeter,新建测试计划,右键添加“线程组”(线程数1、循环次数1)。线程组下添加“HTTP请求”,服务器名称/IP填写httpbin.org,端口80,请求方法选GET,路径填写/get。添“察…