软件开发通用之状态机初认识-基本概念及简单应用

0 前言

在程序开发阶段(其实也不限于程序,还包含硬件电路设计,协议设计等),无论使用何种语言,何种工具,何种系统,程序的运行必须符合开发者的预设逻辑,而单独通过大脑记忆是很难梳理出一个完整,完整严谨的逻辑图的;所以一般我们会使用很多种方式来梳理程序开发的逻辑,比如我此前的开发中经常使用visio的流程图来梳理开发逻辑和任务;而状态机也是一个很好的工具;
下面将会从状态机的起源 普及 基本概念 设计规则 如何使用 及支持的工具来介绍;

1 状态机的起源与普及

​起源

状态机的概念最早由 ​Warren McCulloch 和 ​Walter Pitts 在 1943 年提出,用于描述神经网络的行为。后来,​Edward F. Moore 和 ​George H. Mealy 在 1950 年代进一步发展了状态机的理论,分别提出了 ​Moore 机 和 ​Mealy 机。

​普及原因

状态机被广泛推广的原因包括:

​清晰性:能够清晰地描述系统的行为模式。
​模块化:将复杂系统分解为多个状态,便于理解和维护。
​可预测性:状态转换明确,便于测试和验证。
​广泛应用:适用于硬件设计、软件工程、协议设计等多个领域。

二、状态机的基本概念

摘要:6个概念 核心为4个基本概念,覆盖状态转换所需要的输入,输出,状态和状态切换时的动作;

状态(State)​

系统在某一时刻的特定条件或模式。
例如,一个灯泡的状态可以是“开”或“关”。

​事件(Event)​

触发状态转换的外部输入或条件。
例如,按下开关按钮是一个事件。

转换(Transition)​

从一个状态到另一个状态的变化。
由事件触发,可能伴随某些动作。

​动作(Action)​

在状态转换过程中执行的操作。
例如,打开灯泡是一个动作。

初始状态(Initial State)​

系统启动时的默认状态。

​终止状态(Final State)​

系统结束时的状态(如果有),

三、状态机的类型

​Moore 机

输出仅依赖于当前状态。
动作在进入状态时执行。
输出信号:Moore机的输出仅依赖于当前状态,与输入信号无关。
​公式表示:输出 = f(当前状态)。
​特点:
输出在状态转换时同步变化。
输出信号相对稳定,延迟较小。
设计相对简单,适合对输出稳定性要求高的场景。

Mealy 机

输出依赖于当前状态和输入事件。
动作在状态转换时执行。
​输出信号:Mealy机的输出依赖于当前状态和输入信号。
​公式表示:输出 = f(当前状态, 输入)。
​特点:
输出在输入信号变化时可能立即变化。
输出信号对输入信号更敏感,响应更快。
设计相对复杂,适合对响应速度要求高的场景。

如何更好的理解这个呢,其实专业角度来讲,moore机只依赖当前状态,无论输入什么信号,只要有信号输入,下一个状态就应该是设计的状态;而Mealy多了一个输入信号的条件,不同的输入导致不同的输出,而且状态也有可能跳转到不同的状态,具体实践应用时可以通过这个概念来理解你要设计的系统是一个什么类型的。一般Mealy状态机情况多一点,毕竟很多情况都对输入信号敏感,需要判逻辑;但是mealy机中也存在moore仅依赖状态的输出情况,所以混合使用也会经常出现。只要明确基本概念,确定输出和输入&状态的关系就可以确定其是什么类型的了

举例说明

​Moore机
​适用场景:
输出信号需要稳定且不受输入信号干扰的场景。
状态转换逻辑简单,设计复杂度要求低的场景。
对响应速度要求不高的场景。
​典型应用:
交通灯控制系统(输出仅依赖于当前状态)。
简单的序列检测器。
计数器(如二进制计数器)。
Moore机示例
设计一个检测“101”序列的Moore机:
​状态:S0(初始状态)、S1(检测到1)、S2(检测到10)、S3(检测到101)。
​输出:仅在S3状态输出1,其他状态输出0。
​特点:输出仅与状态相关。
​Mealy机
​适用场景:
输出信号需要快速响应输入信号变化的场景。
状态转换逻辑复杂,设计灵活性要求高的场景。
对状态数量要求较少的场景。
​典型应用:
通信协议解析器(如UART、SPI)。
复杂的序列检测器。
实时控制系统(如传感器信号处理)

四、状态机的设计规则(设计时很关键 一定要闭环 覆盖所有场景)

1.明确状态

定义所有可能的状态,确保覆盖所有情况。
避免状态过多,保持简洁。

​2.定义事件

明确触发状态转换的所有事件。
确保事件与状态转换一一对应。

3. ​描述转换

为每个状态定义可能的转换。
确保所有转换都有明确的触发条件。

4. ​处理异常

定义异常状态和恢复机制。
确保系统在异常情况下能够安全处理。

5. ​验证与测试

通过模拟或实际测试验证状态机的正确性。
确保所有状态和转换都被覆盖。

五、状态机的应用实例

1. ​硬件设计

描述数字电路的行为,如计数器、控制器等。

2. ​软件工程

实现复杂的业务逻辑,如订单处理系统、游戏引擎等。

3. ​协议设计

描述通信协议的状态转换,如 TCP/IP 协议。

4. ​嵌入式系统

控制设备的行为,如家电、汽车电子等。

六、状态机的设计工具

1. ​图形化工具

​UML 状态图:用于软件工程中的状态机设计。
​Stateflow:MATLAB 中的状态机设计工具。

2. ​文本化工具

​Mermaid:通过文本描述生成状态图。
​PlantUML:支持多种图表类型,包括状态图。

​Mermaid文本化工具应用举例(涵盖只依赖状态和依赖输入和状态机器的混合状态机):

stateDiagram-v2
    [*] --> Off
    Off --> On: PowerOn
    state On {
        [*] --> Idle
        Idle --> Running: Start
        Running --> Paused: Pause
        Paused --> Running: Resume
        Running --> Stopped: Stop
        Stopped --> [*]
    }
    On --> Off: PowerOff

stateDiagram-v2:声明状态图类型
[*]:初始状态
–>:状态转换
: 后跟触发事件(如 Start、Pause)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值