有限状态机的编程 (有限状态机的英文)

本文目录导航:

有限状态机的编程

有限状态机体现了两点:首先是离散的,然后是有限的。

State:状态这个词有些难以定义,状态存储关于过去的信息,就是说它反映从系统开始到现在时刻的输入变化。

Actions & Transitions:转换指示状态变更,并且用必须满足来确使转移发生的条件来描述它。

动作是在给定时刻要进行的活动的描述。

Guards:检测器出现的原因是为了检测是否满足从一个状态切换到另外一个状态的条件。

Event:事件,又见事件,笼统说来,对系统重要的某件事情被称为事件。

恩,就这些了,有些迷惑么:),恩,我们来理清一下思路:先从事件说起,事件是有生命的,它经历:1).被产生(被接受,等待被处理,一般放入事件队列)2).被分发(从事件队列取出,分发到响应的状态机处理)3).死亡(当状态机处理了该事件,它随之死亡)从一个状态切换到另外一个状态被称为状态转换,而引起它的事件称为触发事件.(可以看到,不是所有的事件都会引起状态的转换).提到状态转换,不能不提及检测器(Guards),只有当检测器的值为TRUE时候,才能启动转换

有限状态机的编程 (有限状态机的英文)

状态机编程实例-嵌套switch-case法

嵌入式软件开发领域,状态机编程是一种实用的代码实现方式,尤其适用于事件驱动的系统。

本文以一个炸弹拆除的小游戏为例,阐述了状态机编程的方法。

C/C++语言中实现状态机编程的方法有很多,本文将首先介绍最简单且易于理解的switch-case方法。

1 状态机实例介绍1.1 炸弹拆除游戏这是一个自制的炸弹拆除小游戏,包含3个按键和一个屏幕,用于显示倒计时时间和输入的拆除密码。

1.2 状态图使用状态机编程,首先要绘制对应的UML状态图。

在绘制之前,需要明确状态机的状态和事件。

对于本例中的炸弹拆除小游戏,可以归纳为两个状态。

对于事件,有3个按键事件和一个Tick节拍事件。

相关的结构定义如下。

为了便于维护状态机,可以将其定义为一个数据结构体,如下。

数据结构定义好之后,可以设计UML状态图。

这里使用visio画图。

分析这个状态图。

1.3 事件表示上述状态机事件可以分为两类:按键事件(UP、DOWN和ARM)和Tick。

对于第一类事件,需要单一的事件变量来区分;对于第二类Tick,由于引入了1/10s的精细时间,所以需要一个额外的事件参数来表示此次Tick事件的精细时间。

这里介绍一个编程技巧,通过结构体的继承关系实现对事件数据结构的设计,如下。

子图(a)表示TickEvt与Event是继承关系,这是UML类图的画法。

子图(b)是这两个结构体的定义。

子图(c)是TickEvt数据结构在内存中的存储示意。

这两个结构体的定义如下。

这样定义的好处是,对于状态机事件调度函数Bomb1_dispatch的参数形式,可以统一使用(Event *)类型,将TickEvt类型传入时,可以取其地址,再转为(Event *)类型。

2 switch-case嵌套法状态图设计好之后,就可以对照着状态图进行编程实现了。

本文先使用最简单最容易理解的switch-case方法来实现状态机编程。

2.1 状态机处理使用switch-case法实现状态机,一般需要两层switch结构。

2.1.1 第一层switch处理状态2.1.2 第二层switch处理事件这里以状态机处于“设置状态”时,对事件(信号)的处理为例。

2.1.3 两层switch-case状态机完整代码2.2 主函数两层switch-case状态机逻辑编写好之后,还需要将状态机运行起来。

运行状态机的本质,就是周期性地调用状态机(上面实现的两层switch-case),当有事件触发时,设置对应的事件,状态机在运行时,即可处理对应的事件,从而实现状态的切换,或是其它的逻辑处理。

2.2.1 状态机的运行状态机运行的整体逻辑如下。

2.2.2 事件的触发在状态机的每个状态循环执行前,都检测一下是否有事件触发,本例中就是UP、DOWN和ARM的按键事件,另外Tick事件是周期性触发的。

UP、DOWN和ARM的按键事件的触发检测代码如下,检测到对应的按键事件后,则设置对应的事件给状态机,状态机即可在下次状态循环中进行处理。

3 测试本例程使用Arduino作为控制器进行测试,外接3个独立按键和一个IIC接口的OLED显示屏。

4 总结本文以一个炸弹拆除的小游戏为例,介绍了嵌入式软件开发中,状态机编程的思路。

另外,本文中,还需要体会的是,对事件的表示,通过结构体继承(嵌套)的方式,实现一个额外的事件参数这种用法。

编程思想之状态机详解(以STM32为例)

关注会变身的火娃,学编程思想不迷路(持续更新中~)编程思想专栏目录(更多精彩):编程思想专栏目录,带你探索编程的奥秘,涵盖各类编程技巧与实战案例。

1 STM32状态机编程----什么是状态机?万事万物都有其状态。

状态机是一种编程思路,用于抽象描述现实事物运行规则。

通过状态机,可以清晰表达对象在不同条件下的行为模式。

1.1 什么是状态状态是事物在不同阶段的表现形态。

比如,一个灯泡的状态可以是打开或关闭,一个人的状态可以是健康、感冒或康复中。

状态机通过描述对象的各个状态及其转换,实现对复杂逻辑的简化。

1.2 状态机要素状态机由现态、条件、动作和次态四个要素组成。

现态和条件触发动作,动作改变现态。

比如,健康状态的条件是吃药,吃药后状态转换为康复中。

1.3 有限状态机有限状态机是状态机的一种,特点是状态有限且可数。

状态机通过定义状态集合、事件和动作,描述系统在不同状态下的行为逻辑。

1.4 状态迁移图(STD)状态迁移图是状态机的可视化表示,用节点表示状态,连线表示状态间的转换。

通过状态迁移图,可以直观理解状态机的工作流程。

1.5 STM32中的状态机STM32处理器在按键处理中使用状态机简化程序逻辑。

状态机通过定义事件、状态和动作,实现按键状态的自动化处理。

引入状态机思维,能有效简化程序设计。

1.5.1 if else语句结构状态机使用if else结构的状态机在多条件判断时效率低下,浪费CPU资源。

相比之下,switch case结构更清晰,但实际运行效率并未显著提高。

1.5.2 switch case结构状态机switch case结构通过事件和状态映射简化状态转换逻辑,使程序结构更加清晰。

虽然实际运行效率没有明显提升,但代码可读性增强。

1.5.2.1 再说一下使用Switch编写状态机的两种写法状态机的实现可以采用事件驱动和状态驱动两种方式。

事件驱动在状态中检查事件,状态驱动在事件中检查状态。

尽管两者功能相同,但实际编写中应选择更简洁、易于维护的实现方式。

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

85阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

85阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

77阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读