1、消息在头文件中定义为如下格式:
enum GameSignals { /* signals used in the game /
TIME_TICK_SIG = Q_USER_SIG, /
published from tick ISR /
PLAYER_TRIGGER_SIG, /
posted by Player (ISR) to trigger the Missile /
TAKE_OFF_SIG, /
from Tunnel to Ship to grant permission to take off /
HIT_WALL_SIG, /
from Tunnel to Ship when Ship hits the wall /
HIT_MINE_SIG, /
from Mine to Ship or Missile when it hits the mine */
};

2、状态设计的时候,触发消息的填充,去掉第一步定义的SIG,比如
PLAYER_TRIGGER
Q_TIMEOUT
TIME_TICK
HIT_WALL

3、条件分支的习惯约定:
guard可以不起名,但名字下面的框必须填条件,不需要if
(me->blink_ctr & 1U) != 0U
分支的另外一端,可以直接填else,或者没有分支也可以。

4、每一个状态机的entry和exit,最好都加上打印,
entry用来改变成员变量的数据,以及启动timer。
exit用来清除timer。

5、消息处理,放在内部,需要转换状态的,再拉到外面。

6、内部有子状态机的,需要指定初始状态:

7、状态机的进入和退出:
因为每当一个状态被进入时,与之联合的进入动作被自动执行,它们常常决定操作的条件或状态的一致性,非常像一个类构造函数在决定被构建对象的特性。例如, heating 状态的特性通过加热器被打开这个事实被确定。在进入 heating 的任何子状态前这个条件必须确立,因为到 heating 子状态的进入动作,比如 toasting,依靠 heating 超状态的适当的初始化,并仅执行和这个初始化不同的部分。因此,进入动作的执行必须总是按从最外层状态到最里层状态的次序被处理。退出动作的执行,对应于析构函数调用,按精确的相反的次序执行,从最里层的状态开始(对应于从最远的派生类开始)。

8、内部转换:
内部转换不造成状态切换,在e和x下面逐条加上即可,比如下面的any_key。

9、自转换:
和内部转换不同的是,自转换会造成状态的x和e。

10、本地转换:
本地转换在主目标状态是主源的一个子状态时,并不会导致从主源状态的退出。另外,本地状态转换在主目标是主源状态的一个超状态时,不会导致退出和重新进入目标状态。QP实现的是本地转换,不做退出和重新进入。

11、转换的执行次序:

T1 引起监护条件 g() 的评估,假设监护条件 g( ) 被评估为真,后面是动作的执行序列: a( ) ; b( ) ; t( ) ; c( ) ; d( ) 和 e( )

UML 规范规定,一个牵涉到退出所有被嵌套状态的转换,从当前活动状态
直到但是不包含主源和主目标状态的最少共同祖先 least common ancestor(LCA)状态。如名字所示,LCA是源和目标状态的最低的组合状态同时也是它们二者的超状态(祖先)。如上所叙,退出动作的执行次序总是从最深层嵌套状态(当前活动状态)向上沿着层次直到 LCA,但是不退出 LCA。例如,图2.9 所示的状态 s1和 s2的 LCA(s1,s2) 是状态 s 。

来一个更复杂的:


总结如下规律:
1、进入每个状态机时,先执行e。
2、如果有上一级的初始转换,则直接进入所指的目标状态,不执行3。
3、否则,则执行本级状态机的初始转换,跳转到子状态。
4、如果收到一个消息,当前状态无法处理,那在父类处理,然后再执行状态转换。s21-g,s211-exit,s21-exit,s2-eixt,s1-entry,s1-init,s11-entry
5、同上,如果不需要进行状态转换,那在上一级处理完即可,依然留在当前子状态。s1-I
6、退出的时候,先执行能处理这个消息的那一级的处理函数,然后一级一级执行e,直到共同的父类,再进入目标状态机。
7、从子状态转换到父状态,先处理消息,然后e,接着执行上一级的init
D:s11-D;s11-exit;s1-init;s11-entry;
8、如果同一个消息,子状态和父状态都有处理函数,那由子状态处理即可。S2-I

来一个复杂例子,计算器的状态机:

层次状态机编程二:设计QM状态机的基本约定相关推荐

  1. 【智能车竞赛】状态机编程在智能车竞速赛道中的应用 - 编程小记

    我曾试图通过一些代码上的小技巧,优化智能车竞速赛道的元素处理逻辑. 后来学长告诉我这叫做 "状态机" . --2022.07.20 一.我们为什么需要状态机? 定宽的白色赛道,在深 ...

  2. 编程入门笔记:状态机模式在工控机中的体现

    2021.11.06 -- 参考文献 [1] 李霞,王永章,梁宏斌,等.有限状态机在开放式数控系统中的应用[J].计算机集成制造系统,2005(3):428-432. [2] 余孟尝. 数字电子技术基 ...

  3. QP状态机的优势以及QM的使用

    https://zhuanlan.zhihu.com/p/375285086 QP状态机的优势以及QM的使用​mp.weixin.qq.com 本文主要着重于讲解如何使用QM来绘制状态机图,现代分层状 ...

  4. C语言状态机编程思想

    关注.星标公众号,直达精彩内容 文章来源:头条-嵌入式在左C语言在右 链接:https://www.toutiao.com/i6843028812112855564/ 有限状态机概念 有限状态机是一种 ...

  5. 嵌入式状态机编程简介

    不知道大家有没有这样一种感觉,就是感觉自己玩单片机还可以,各个功能模块也都会驱动,但是如果让你完整地写一套代码,却无逻辑与框架可言,上来就是开始写!东抄抄西抄抄,说明编程还处于比较低的水平.那么,如何 ...

  6. 基于STM32F103移植华为LiteOS_任务挂起与恢复_面向对象编程思想之按键状态机

    华为LiteOS_任务挂起与恢复_面向对象编程思想之按键状态机 因为在做华为LiteOS任务挂起和恢复需要使用到按键去触发任务挂起和恢复动作,因为我就萌发出使用状态机这种架构做一个按键检测触发.回想已 ...

  7. c语言按键状态机,C语言状态机编程思想

    原标题:C语言状态机编程思想 有限状态机概念 有限状态机是一种概念思想,把复杂的控制逻辑分解成有限个稳定状态,组成闭环系统,通过事件触发,让状态机按设定的顺序处理事务.单片机C语言的状态机编程,是利用 ...

  8. 吃透Chisel语言.30.Chisel进阶之通信状态机(二)——FSMD:以Popcount为例

    Chisel进阶之通信状态机(二)--FSMD:以Popcount为例 上一篇文章以闪光灯为例,介绍了通信状态机的写法,用于将大的复杂的状态机分解为小的多个相互通信的状态机来实现,可以保证使用资源更少 ...

  9. 如何写好状态机(二)

    今天给大侠带来如何写好状态机(二),由于篇幅比较长,如何写好状态机分成三篇呈现.上一篇已经说了状态机的基本概念,此篇带来如何写好状态机部分,话不多说,上货. 如何写好状态机(一) 主要内容预览: 状态 ...

最新文章

  1. ​一文读懂EfficientDet
  2. php pdo 方法,PHP使用PDO修改数据的方法
  3. 查看swintransformer的网络结构.children()
  4. 批量输入ISA防火墙的URL对象
  5. javaScript js 可滑动的div块
  6. Nodejs之旅开始
  7. mysql不能访问order,使用ORDER BY时,MySQL不使用索引(“Using filesort”)
  8. NG-ZORRO 7.0.1 发布,Ant Design 的 Angular 实现
  9. Java添加水印+图片水印+文字水印
  10. QT5实现摄像头预览与扑捉图像
  11. C#指南,重温基础,展望远方!(8)C#数组
  12. 《JAVA程序设计教程 第7版》pdf 附下载链接
  13. 电脑qq浏览器怎么滚动截长图_电脑上如何滚动截屏长图?这样做最简单
  14. 软件工程 实践者的研究方法 中文题答案
  15. ArcGIS应用视频教程(视频+PPT+实验数据)
  16. SHELLEXECUTEINFO,ShellExecuteEx
  17. 【历史上的今天】7 月 3 日:人体工程学标准法案;消费电子领域先驱诞生;育碧发布 Uplay
  18. Ruby在Windows下安装
  19. pt与px的对应关系
  20. Axure软件的简单使用

热门文章

  1. java毕业设计石家庄学院学生实习管理系统mybatis+源码+调试部署+系统+数据库+lw
  2. linux之mysql客户端安装
  3. 深圳IO:Shenzhen IO Mac版(烧脑编程游戏) v1.4
  4. 【Day24】 LeetCode算法题 (注释详细+解题思路)[43. 字符串相乘 ] [1800. 最大升序子数组和]
  5. 直播一对一社交源码交友软件平台搭建解决方案
  6. 基于联发科MTK6761多功能 8寸三防平板/方案定制
  7. Android sutdio创建完项目报错Failed to open zip file
  8. html 获取cookie的值,js获取cookie值的方法
  9. 用A4折出正方形,等边三角形,正八边形,正六边形,正五边形,正七边形
  10. 安鸾靶场-LFI本地文件包含 LFI本地文件包含LF2 文件包含漏洞练习记录