软件开发通用之状态机初认识-基本概念及简单应用
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[*] --> OffOff --> On: PowerOnstate On {[*] --> IdleIdle --> Running: StartRunning --> Paused: PausePaused --> Running: ResumeRunning --> Stopped: StopStopped --> [*]}On --> Off: PowerOff
stateDiagram-v2:声明状态图类型
[*]:初始状态
–>:状态转换
: 后跟触发事件(如 Start、Pause)
这里多了个嵌套语法:
State 状态{
新的状态图
} 本质上是定义个新的状态机转换图
如果需要会议上演示实时绘制状态图的话,可以使用Markdown 幻灯片工具(如 Marp)实时绘制状态图,marp的使用可以参考Marp:把你的Markdown文稿变成PPT
七、总结
状态机是一种强大的工具,能够清晰地描述系统的行为模式。其起源可以追溯到 20 世纪 40 年代,由于其在清晰性、模块化和可预测性方面的优势,被广泛应用于硬件设计、软件工程、协议设计等多个领域。设计状态机时,需要明确状态、定义事件、描述转换、处理异常,并通过验证与测试确保其正确性。掌握状态机的概念和设计规则,对于理解和开发复杂系统具有重要意义。
通过这篇应该对状态机有个基本的了解,并能学会文本化工具mermaid基本使用,当让详细的使用后面有机会再介绍。
参考资料:
Marp:把你的Markdown文稿变成PPT
相关文章:
软件开发通用之状态机初认识-基本概念及简单应用
0 前言 在程序开发阶段(其实也不限于程序,还包含硬件电路设计,协议设计等),无论使用何种语言,何种工具,何种系统,程序的运行必须符合开发者的预设逻辑,而单独通过大脑记…...
蓝桥杯 之 第27场月赛总结
文章目录 习题1.抓猪拿国一2.蓝桥字符3.蓝桥大使4.拳头对决 习题 比赛地址 1.抓猪拿国一 十分简单的签到题 print(sum(list(range(17))))2.蓝桥字符 常见的字符匹配的问题,是一个二维dp的问题,转化为对应的动态规划求解 力扣的相似题目 可以关注灵神…...
适配器模式 (Adapter Pattern)
适配器模式 (Adapter Pattern) 是一种结构型设计模式,它将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。 在现实生活中,适配器的例子随处可见,比如电源适配器,它将不同电压的电流转换为设备所需的电压,确保设备能正…...
操作系统WIN11无法出现WLAN图标(解决方案)
本人操作系统WIN11之后无网络图标 于是在设置里查看了一下,是网卡驱动没了 网上去下载一个驱动类软件自行处理即可。 本人使用手机USB网络连的电脑,然后发现网卡驱动凭空出现了,就很困惑,没有下载驱动就恢复了。...
HCL—我与虚拟机的爱恨情仇[特殊字符][特殊字符][特殊字符]️
时隔了三周,我可能算是了解了虚拟机了吧。自从上一次的安装虚拟机,我与HCL、虚拟机就没有停止过纠缠。 为什么很多win11电脑使用不了HCL,或者无法启动HCL设备? 首先来解答,为什么很多win11电脑使用不了HCL,…...
illustrate:一款蛋白/核酸结构快速渲染为“卡通风格”的小工具
本期向大家介绍一款蛋白/核酸结构快速渲染(卡通风格)的小工具——illustrate。放心!本期完全不涉及代码,不折腾人,请放心食用。 结构渲染效果示例如下: PDB ID: 1ttt 该小工具适用绘制蛋白或复合物整体轮廓…...
Linux上位机开发实战(能用的开发板计算资源)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 大家所能想到的嵌入式上位机开发,如果是linux,同时涉及到嵌入式的话,一般都会认为是把pc linux的软件port到板子…...
kotlin 内联函数 inline
高阶函数实现的原理:函数类型其实是生成了一个对象 。 inline翻译成中文的意思就是内联,在kotlin里面inline被用来修饰函数,表明当前函数在编译时是以内嵌的形式进行编译的,从而减少了一层函数调用栈: inline fun fun…...
vue3配置代理实现axios请求本地接口返回PG库数据【前后端实操】
前端编写 安装 axios 如果当前未安装axios,可以执行如下指令安装 npm install axios配置代理 当前为基于Vite构建的项目,在 vite.config.ts 中配置代理,在defineConfig中新增server配置,主要关注两个点: 一、需要代…...
论文阅读:2023 arxiv Multiscale Positive-Unlabeled Detection of AI-Generated Texts
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Multiscale Positive-Unlabeled Detection of AI-Generated Texts https://arxiv.org/abs/2305.18149 https://www.doubao.com/chat/2114270649152258 https://github.com/YuchuanTi…...
【数学建模】最大最小值模型详解
数学建模中的最大最小值模型详解 文章目录 数学建模中的最大最小值模型详解引言最大最小值模型的基本概念最大化问题最小化问题 常见的求解方法1. 微积分法2. 线性规划3. 非线性规划4. 动态规划 实际应用案例案例1:生产规划问题案例2:投资组合优化 最大最…...
Camera2 实现重力感应四个方向调试相机预览
Camera2API 实现重力感应四个方向调试相机预览 文章目录 需求场景 需求实现setAspectRatio 设置显示长宽postScale postRotate 设置缩放和旋转manager.openCamera 打开相机startPreviewgetPreviewRequestBuilder 设置预览参数:createCaptureSession 预览准备工作set…...
C++::多态
目录 一.多态的概念 二.多态的定义及实现 二.1多态的构成条件 二.2虚函数 1.虚函数的写法 2.虚函数的重写/覆盖 3.协变 二.3析构函数的重写 二.4override和final关键字 编辑二.5重载/重写/隐藏的对比 三.多态的运行原理(一部分) 四.多态的常…...
278.缀点成线
1232. 缀点成线 - 力扣(LeetCode) class Solution {public boolean checkStraightLine(int[][] coordinates) {if(coordinates.length2){return true;}int xcoordinates[1][0]-coordinates[0][0];int ycoordinates[1][1]-coordinates[0][1];for(int i1;i…...
xssgame第8关注入详解
1.SVG利用实现xss攻击 1.代码如下: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>tes…...
《数据库原理》SQLServer期末复习_题型+考点
目录 题型: 一. 概况分析题(5小题,每小题2分,共10分) 二. 计算题(3小题,每小题5分,共15分) 三. 数据库设计(2小题,每小题10分,共2…...
RK3588开发笔记-RTL8852wifi6模块驱动编译报错解决
目录 前言 一、问题背景 二、驱动编译 总结 前言 在基于 RK3588 进行开发,使用 RTL8852 WiFi6 模块时,遇到了一个让人头疼的驱动编译报错问题:“VFs_internal_I_am_really_a_filesystem_and_am_NoT_a_driver, but does”。经过一番摸索和尝试,最终成功解决了这个问题,在…...
机器学习算法实战——天气数据分析(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 引言 天气数据分析是气象学和数据科学交叉领域的一个重要研究方向。随着大数据技术的发展,气象数据的采集、存储和分…...
java项目之基于ssm的毕业论文管理系统(源码+文档)
项目简介 毕业论文管理系统实现了以下功能: 本毕业论文管理系统主要实现的功能模块包括学生模块、导师模块和管理员模块三大部分,具体功能分析如下: (1)导师功能模块:导师注册登录后主要功能模块包括个人…...
【Vue3入门1】02- vue3的基本操作(上)
本文介绍vue3中的一些方法的操作。 目录 1. 绑定事件 v-on 2. 按键修饰符 3. 显示和隐藏 v-show 4. 条件渲染 v-if 5. 条件渲染if-else 1. 绑定事件 v-on 点击事件 v-on:click" 发生事件 " <body><div id"app">{{ msg }} <h2&g…...
Redis集群搭建和高可用方案(Java实现)
Redis集群搭建和高可用方案(Java实现) 我将详细介绍如何使用Java技术搭建Redis集群并实现高可用方案。 1. Redis集群架构概述 Redis集群可以通过以下几种方式实现: 主从复制Sentinel哨兵模式Redis Cluster集群模式2. 使用Java实现Redis集群连接 2.1 使用Jedis客户端 Je…...
【大模型算法工程】大模型应用工具化、忠诚度以及知识库场景下PDF双栏解析问题的讨论
1. 大模型时代应用工具化以及无忠诚度现象讨论 接触大模型久了,也慢慢探到一些大模型能力表现非常自然和突出的场景,比如AI搜索(依赖大模型的理解总结能力)、AI对话(即chat,依赖大模型的生成能力࿰…...
Rust语言学习
Rust语言学习 通用编程概念所有权所有权引用和借用slice struct(结构体)定义并实例化一个结构体使用结构体方法语法 枚举 enums定义枚举match控制流运算符if let 简单控制流 使用包、Crate和模块管理不断增长的项目(模块系统)包和crate定义模块来控制作用…...
AI比人脑更强,因为被植入思维模型【16】反脆弱
毛选中就有言,不经历困难,我们就不会掌握战胜困难的方法。 这个世界纷繁复杂,不是强者总是运气好,而是他们能够失败后快速复原,不断找到战胜困难的方法。 定义 马斯洛需求层次模型是一种将人类需求从低到高按层次进…...
系统架构设计知识体系总结
1.技术选型 1.什么是技术选型? 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…...
计算机视觉的多模态模型
计算机视觉的多模态模型 是指能够同时处理和理解 多种类型数据(模态) 的模型。这些模态可以包括图像、文本、音频、视频、深度信息等。多模态模型的核心目标是利用不同模态之间的互补信息,提升模型的性能和泛化能力。 1. 多模态模型的核心思想…...
Scrapy 入门教程
Scrapy 入门教程 Scrapy 是一个用于爬取网站数据的 Python 框架,功能强大且易于扩展。本文将介绍 Scrapy 的基本概念、安装方法、使用示例,并展示如何编写一个基本的爬虫。 1. 什么是 Scrapy? Scrapy 是一个开源的、用于爬取网站数据的框架…...
Oracle OCP认证是否值得考?
Oracle OCP(Oracle Certified Professional)认证是数据库领域的传统权威认证,但随着云数据库和开源技术的崛起,其价值正面临分化。是否值得考取,需结合你的职业定位、行业需求及长期规划综合判断。以下是关键分析&…...
OpenCV中距离公式
一、各类距离公式总结 常见距离公式 欧氏距离: 曼哈顿距离(L1): 切比雪夫距离(Chessboard): 1、点与点距离(欧氏距离) 二维空间 设两点坐标为 P1(x1,y1)、P2(x2,y2),其距离…...
DeepSeek自学手册:《从理论(模型训练)到实践(模型应用)》|73页|附PPT下载方法
导 读INTRODUCTION 今天分享是由ai呀蔡蔡团队带来的DeepSeek自学手册:《从理论(模型训练)到实践(模型应用)》,这是一篇关于DeepSeek模型训练、应用场景及替代方案的综合指南文章,主要介绍了Deep…...
Doris官网上没有的一些Fe参数了,都在源码中
一、FE配置源码 apache-doris-src\fe\fe-common\src\main\java\org\apache\doris\common\Config.java 二、BE配置源码 apache-doris-src\be\src\common\config.cpp 三、FE源码 package org.apache.doris.common;public class Config extends ConfigBase {ConfField(descri…...
(一)丶Windows安装RabbitMQ可能会遇到的问题
一丶可能会忘了配置ERLang的环境变量 二丶执行命令时报错 第一步 rabbitmq-plugins enable rabbitmq_management 第二部 rabbitmqctl status 三丶修改.erlang.cookie 文件 1.找到C盘目下的.erlang.cookie文件 C:\Users\admin\.erlang.cookie C:\Windows\System32\config\sys…...
stm32g030移植RT-Thread
移植流程 移植前需要安装Keil.STM32G0xx_DFP.1.2.0.pack组件,大致的移植过程: CubeMX配置RT-Thread组件配置工程模板配置 参考例程配置:拷贝仓库原有的stm32g070-st-nucleo工程,然后另起一个名字,目录结构如下 完整…...
Parsing error: Unexpected token, expected “,“
今天在使用Trae AI 编程工具开发大文件切片上传功能,使用的是VUE3,TS技术栈,开发完成运行时,编译报错(Parsing error: Unexpected token, expected ","),让AI自行修复此问题多次后还是没有解决&a…...
Day23: 数组中数字出现的次数
整数数组 sockets 记录了一个袜子礼盒的颜色分布情况,其中 sockets[i] 表示该袜子的颜色编号。礼盒中除了一款撞色搭配的袜子,每种颜色的袜子均有两只。请设计一个程序,在时间复杂度 O(n),空间复杂度O(1) 内找到这双撞色搭配袜子的…...
目标检测——清洗数据
清洗VOC格式数据集代码示例 import os import xml.etree.ElementTree as ETdef process_annotations(image_folder, annotation_folder):# 遍历标签文件夹中的所有XML文件for xml_file in os.listdir(annotation_folder):if not xml_file.endswith(.xml):continuexml_path os…...
嵌入式基础知识学习:UART是什么?
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种广泛应用于嵌入式系统和通信设备的异步串行通信协议。它通过两根数据线(TX和RX)实现设备间的全双工数据传输,无需共享时钟信号…...
SpringBoot项目实战(初级)
目录 一、数据库搭建 二、代码开发 1.pom.xml 2.thymeleaf模块处理的配置类 3.application配置文件 4.配置(在启动类中) 5.编写数据层 ②编写dao层 ③编写service层 接口 实现类 注意 补充(注入的3个注解) 1.AutoWir…...
合成层优化
以下是关于 合成层(Composite Layer)优化 的系统梳理,涵盖基础原理、触发条件、优化策略及进阶实践,帮助深入理解如何通过分层渲染提升页面性能: 一、合成层基础概念 1. 什么是合成层? 定义:浏览器将页面元素提升为独立的图形层(Graphics Layer),由 GPU 单独处理,避…...
什么是MCP|工作原理是什么|怎么使用MCP|图解MCP
写在前面 Manus的爆火似乎推动了MCP的出圈,虽然Manus没有用MCP。这篇文章我们就讲讲MCP,当然我也是最近才学习到MCP的,如果理解有误的地方,欢迎评论区指出! 1. 为什么需要MCP? 1.1 LLM 现状 我们都知道…...
《Partial-label learning with a guided Prototypical classifier》23年CVPR 文献速读
论文地址 1. 引言 本文介绍了一种用于部分标签学习(Partial-Label Learning, PLL)的新框架 PaPi(Partial-label learning with a guided Prototypical classifier),旨在提高在视觉任务中处理部分标签数据时的性能。部…...
GitLens with `Commit Graph`
文章目录 GitLens with Commit Graph GitLens with Commit Graph 自己打包的 GitLens,能够查看 commit graph。 GitLens 持续更新中 下载之后,通过 VSCode 插件直接安装即可使用。...
python每日十题(6)
】函数定义:函数是指一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需要调用其函数名即可。函数能提高应用的模块性和代码的重复利用率 在Python语言中,用关键字class来定义类 在Python语…...
UniRel论文复现过程中的问题解决办法(全)
注解写在前面:本文仅为解决各位同学在复现时面对的问题,有问题可以评论,看见会回复!!! [顶刊论文]UniRel:Unified Representation and Interaction for Joint Relational Triple Extraction2022.11.16&…...
js逆向之断点调试
1.XHR/提取断点用法 当刷新页面时候,有大量请求,并且你无法定位参数信息的时候,或者参数被混淆无法搜到,可以用该方法,该方法是会捕获所有请求连接,然后我们通过连接过滤出自己想要的请求,然后…...
Unity Shader编程】之渲染流程之深度及pass详解
关于透明物体的渲染,首先需要了解以下部分 深度缓冲区深度写入深度测试pass渲染和深度测试的过程深度测试和颜色混合过程 ** 一,深度缓冲区 ** 深度即物体距离相机的距离,深度写入即是把物体的距离相机信息记录下来,写入一个名…...
【算法笔记】图论基础(一):建图、存图、树和图的遍历、拓扑排序、最小生成树
目录 何为图论图的概念 图的一些基本概念有向图和无向图带权图连通图和非连通图对于无向图对于有向图 度对于无向图对于有向图一些结论 环自环、重边、简单图、完全图自环重边简单图 稀疏图和稠密图子图、生成子图同构 图的存储直接存边邻接矩阵存边邻接表存边链式前向星存边 图…...
Compose 原理解析
Compose 的组件都是放在 setContent() 之后才能显示的,那需要先看看这个函数的作用。 先看 ComponentActivity 的扩展函数 setContent(): /*** 将给定的可组合项合成到给定的 Activity 中。[content] 将成为给定 Activity 的根视图。* 这大致相当于使用…...
pyspark学习rdd处理数据方法——学习记录
python黑马程序员 """ 文件,按JSON字符串存储 1. 城市按销售额排名 2. 全部城市有哪些商品类别在售卖 3. 上海市有哪些商品类别在售卖 """ from pyspark import SparkConf, SparkContext import os import jsonos.environ[PYSPARK_P…...
个人学习编程(3-22) leetcode刷题
连续子数组:(难) 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 需要理解的知识&a…...