打印
[开发资料]

嵌入式开发为何经常用到状态机架构?

[复制链接]
213|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powerantone|  楼主 | 2025-2-21 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、提高CPU使用效率

话说我只要见到满篇都是delay_ms()的程序就会头疼,动辄十几个ms几十个ms的软件延时是对CPU资源的巨大浪费,宝贵的CPU时间都浪费在了NOP指令上。
那种为了等待一个管脚电平跳变或者一个串口数据,让整个程序都不动的情况也让我非常纠结,如果事件一直不发生电平跳变,你要等到世界末日么?
如果应用状态机编程思想,程序只需要用全局变量记录下工作状态,就可以转头去干别的工作了,当然忙完那些活儿之后要再看看工作状态有没有变化。
只要目标事件(定时未到、电平没跳变、串口数据没收完)还没发生,工作状态就不会改变,程序就一直重复着“查询—干别的—查询—干别的”这样的循环,这样CPU就闲不下来了。
这种处理方法的实质就是在程序等待事件的过程中间隔性地插入一些有意义的工作,好让CPU不是一直无谓地等待。
二、逻辑完备性

逻辑完备性是状态机编程最大的优点。
不知道大家有没有用C语言写过计算器的小程序,我很早以前写过,写出来一测试,那个惨不忍睹啊!
当我规规矩矩的输入算式的时候,程序可以得到正确的计算结果,但要是故意输入数字和运算符号的随意组合,程序总是得出莫名其妙的结果。
后来我试着思维模拟一下程序的工作过程,正确的算式思路清晰,流程顺畅,可要碰上了不规矩的式子,走着走着我就晕菜了,那么多的标志位,那么多的变量,变来变去,最后直接分析不下去了。
很久之后我认识了状态机,才恍然明白,当时的程序是有逻辑漏洞的。
如果把这个计算器程序当做是一个反应式系统,那么一个数字或者运算符就可以看做一个事件,一个算式就是一组事件组合。
对于一个逻辑完备的反应式系统,不管什么样的事件组合,系统都能正确处理事件,而且系统自身的工作状态也一直处在可知可控的状态中。
反过来,如果一个系统的逻辑功能不完备,在某些特定事件组合的驱动下,系统就会进入一个不可知不可控的状态,与设计者的意图相悖。
状态机就能解决逻辑完备性的问题。
状态机是一种以系统状态为中心,以事件为变量的设计方法,它专注于各个状态的特点以及状态之间相互转换的关系。
状态的转换恰恰是事件引起的,那么在研究某个具体状态的时候,我们自然而然地会考虑任何一个事件对这个状态有什么样的影响。
这样,每一个状态中发生的每一个事件都会在我们的考虑之中,也就不会留下逻辑漏洞。
这样说也许大家会觉得太空洞,实践出真知,某天如果你真的要设计一个逻辑复杂的程序,会觉得状态机真香!
三、程序结构清晰

用状态机写出来的程序的结构是非常清晰的。
程序员最痛苦的事儿莫过于读别人写的代码,如果代码不是很规范,而且手里还没有流程图,读代码会让人晕了又晕,只有顺着程序一遍又一遍的看,很多遍之后才能隐约地明白程序大体的工作过程。
有流程图会好一点,但是如果程序比较大,流程图也不会画得多详细,很多细节上的过程还是要从代码中理解。
相比之下,用状态机写的程序要好很多,拿一张标准的UML状态转换图,再配上一些简明的文字说明,程序中的各个要素一览无余。
程序中有哪些状态,会发生哪些事件,状态机如何响应,响应之后跳转到哪个状态,这些都十分明朗,甚至许多动作细节都能从状态转换图中找到。
可以毫不夸张的说,有了UML状态转换图,程序流程图写都不用写。

使用特权

评论回复
沙发
LOVEEVER| | 2025-2-23 22:01 | 只看该作者
逻辑完备性是状态机编程最大的优点。

使用特权

评论回复
板凳
小小蚂蚁举千斤| | 2025-2-23 22:07 | 只看该作者
状态机就能解决逻辑完备性的问题

使用特权

评论回复
地板
canfeil| | 2025-3-11 12:45 | 只看该作者
状态机判断的方便,而且可以让程序执行的OK啊

使用特权

评论回复
5
pe66ak| | 2025-3-11 14:00 | 只看该作者
在嵌入式开发中,状态机架构被广泛使用,因为它能够清晰地描述系统的行为,并有效解决复杂逻辑的控制问题。

使用特权

评论回复
6
suiziq| | 2025-3-11 15:07 | 只看该作者
嵌入式系统通常需要处理多种状态和状态之间的转换(如按键操作、传感器数据、通信协议等)。

使用特权

评论回复
7
miltk| | 2025-3-11 16:12 | 只看该作者
状态机通过定义有限的状态和状态之间的转换条件,能够清晰地描述系统的行为逻辑。

使用特权

评论回复
8
yuliangren| | 2025-3-11 17:18 | 只看该作者
嵌入式系统通常需要处理复杂的控制逻辑(如通信协议解析、设备控制等)。使用状态机可以将复杂

使用特权

评论回复
9
gongqijuns| | 2025-3-11 19:08 | 只看该作者
提高代码可维护性,状态机的结构清晰,状态和转换条件明确,便于理解和维护。当需求变化时,只需调整状态或转换条件,而不需要大幅修改代码

使用特权

评论回复
10
gra22ce| | 2025-3-12 09:17 | 只看该作者
其实状态机的实现通常只需要少量的内存和 CPU 资源,适合资源受限的嵌入式系统。通过查表法或 switch-case 结构实现状态机,效率高且占用资源少。

使用特权

评论回复
11
eleg34ance| | 2025-3-12 11:26 | 只看该作者
状态机的行为是可预测的,每个状态和转换条件都可以单独测试。通过日志或调试工具,可以方便地跟踪状态机的运行过程,快速定位问题。

使用特权

评论回复
12
清芯芯清| | 2025-3-12 13:45 | 只看该作者
状态机广泛应用于嵌入式开发的多个领域,例如:通信协议:UART、I2C、SPI 等协议的解析和封装。用户界面:按键处理、菜单导航等。控制系统:电机控制、温度控制等。任务调度:多任务状态切换

使用特权

评论回复
13
星星点点didi| | 2025-3-12 20:15 | 只看该作者
事件驱动的高效处理,嵌入式系统通常是事件驱动的(如外部中断、定时器事件等)。状态机能够很好地处理事件驱动的逻辑,根据当前状态和事件类型执行相应的操作

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

599

主题

3088

帖子

4

粉丝