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

1 状态机实例介绍 1.1 炸弹拆除游戏 这是一个自制的炸弹拆除小游戏,包含3个按键和一个屏幕,用于显示倒计时时间和输入的拆除密码。1.2 状态图 使用状态机编程,首先要绘制对应的UML状态图。在绘制之前,需要明确状态机的状态和事件。对于本例中的炸弹拆除小游戏,可以归纳为两个状态。对于事件,有3...
状态机编程实例-嵌套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 总结
本文以一个炸弹拆除的小游戏为例,介绍了嵌入式软件开发中,状态机编程的思路。

另外,本文中,还需要体会的是,对事件的表示,通过结构体继承(嵌套)的方式,实现一个额外的事件参数这种用法。2024-08-12
mengvlog 阅读 34 次 更新于 2025-09-10 15:59:20 我来答关注问题0
  •  翡希信息咨询 状态机编程实例-嵌套switch-case法

    第一层switch处理状态:根据当前状态,选择进入对应的case分支。第二层switch处理事件:在选定状态对应的case分支内,再根据发生的事件,选择进入对应的子case分支进行处理。4. 状态机运行 周期性调用状态机,以处理可能的事件。在每次状态循环执行前,检测是否有事件触发。对于按键事件,可以通过读取按键状态...

  • 使用switch-case法实现状态机,一般需要两层switch结构。2.1.1 第一层switch处理状态 2.1.2 第二层switch处理事件 这里以状态机处于“设置状态”时,对事件(信号)的处理为例。2.1.3 两层switch-case状态机完整代码 2.2 主函数 两层switch-case状态机逻辑编写好之后,还需要将状态机运行起来。运...

  •  文暄生活科普 嵌软开发思维:状态机的三种实现方法

    深入探讨了C语言实现状态机的三种方法:switch-case法、表格驱动法、函数指针法。每个方法都围绕着状态、事件与响应进行解析。switch-case法通过嵌套switch-case结构实现状态与事件的交互,状态和事件分别使用switch进行组织,将频繁发生的事件代码集中于某个状态的case中,以提升效率。此法有状态嵌套事件和事件...

  •  翡希信息咨询 编程思想之状态机详解(以STM32为例)

    编程思想之状态机详解(以STM32为例)状态机是一种编程思路,是现实事物运行规则抽象而成的一个数学模型。在STM32等微控制器的编程中,状态机是一种非常有用的工具,用于管理和处理复杂的逻辑状态转换。1.1 什么是状态状态是人或事物表现出来的形态,是指现实(或虚拟)事物处于生成、生存、发展、消亡...

  •  誉祥祥知识 基于Simulink代码生成(4)——if-else和switch-case实现方式

    switch-case实现方式1. Multiport Switch使用场景:输入条件是状态信号或者枚举信号,且被选择的是常数或者很简单的逻辑。Multiport Switch是一种直接且简单的方式来实现switch-case逻辑。它允许根据输入信号的值选择多个输出中的一个。在Simulink模型中,Multiport Switch的输入端口可以接收一个标量或向量信号...

檬味博客在线解答立即免费咨询

编程相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部