0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

状态机编程都有哪些优点?

奈因PCB电路板设计 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2021-07-27 11:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文总结下状态机编程的优点。

提高CPU使用效率

话说我只要见到满篇都是delay_ms()的程序就会头疼,动辄十几个ms几十个ms的软件延时是对CPU资源的巨大浪费,宝贵的CPU时间都浪费在了NOP指令上。那种为了等待一个管脚电平跳变或者一个串口数据,让整个程序都不动的情况也让我非常纠结,如果事件一直不发生电平跳变,你要等到世界末日么?

如果应用状态机编程思想,程序只需要用全局变量记录下工作状态,就可以转头去干别的工作了,当然忙完那些活儿之后要再看看工作状态有没有变化。只要目标事件(定时未到、电平没跳变、串口数据没收完)还没发生,工作状态就不会改变,程序就一直重复着“查询—干别的—查询—干别的”这样的循环,这样CPU就闲不下来了。

这种处理方法的实质就是在程序等待事件的过程中间隔性地插入一些有意义的工作,好让CPU不是一直无谓地等待。

逻辑完备性

逻辑完备性是状态机编程最大的优点。

不知道大家有没有用C语言写过计算器的小程序,我很早以前写过,写出来一测试,那个惨不忍睹啊!当我规规矩矩的输入算式的时候,程序可以得到正确的计算结果,但要是故意输入数字和运算符号的随意组合,程序总是得出莫名其妙的结果。

后来我试着思维模拟一下程序的工作过程,正确的算式思路清晰,流程顺畅,可要碰上了不规矩的式子,走着走着我就晕菜了,那么多的标志位,那么多的变量,变来变去,最后直接分析不下去了。

很久之后我认识了状态机,才恍然明白,当时的程序是有逻辑漏洞的。如果把这个计算器程序当做是一个反应式系统,那么一个数字或者运算符就可以看做一个事件,一个算式就是一组事件组合。对于一个逻辑完备的反应式系统,不管什么样的事件组合,系统都能正确处理事件,而且系统自身的工作状态也一直处在可知可控的状态中。反过来,如果一个系统的逻辑功能不完备,在某些特定事件组合的驱动下,系统就会进入一个不可知不可控的状态,与设计者的意图相悖。

状态机就能解决逻辑完备性的问题。

状态机是一种以系统状态为中心,以事件为变量的设计方法,它专注于各个状态的特点以及状态之间相互转换的关系。状态的转换恰恰是事件引起的,那么在研究某个具体状态的时候,我们自然而然地会考虑任何一个事件对这个状态有什么样的影响。这样,每一个状态中发生的每一个事件都会在我们的考虑之中,也就不会留下逻辑漏洞。

这样说也许大家会觉得太空洞,实践出真知,某天如果你真的要设计一个逻辑复杂的程序,会觉得状态机真香!

程序结构清晰

用状态机写出来的程序的结构是非常清晰的。

程序员最痛苦的事儿莫过于读别人写的代码。如果代码不是很规范,而且手里还没有流程图,读代码会让人晕了又晕,只有顺着程序一遍又一遍的看,很多遍之后才能隐约地明白程序大体的工作过程。有流程图会好一点,但是如果程序比较大,流程图也不会画得多详细,很多细节上的过程还是要从代码中理解。

相比之下,用状态机写的程序要好很多,拿一张标准的UML状态转换图,再配上一些简明的文字说明,程序中的各个要素一览无余。程序中有哪些状态,会发生哪些事件,状态机如何响应,响应之后跳转到哪个状态,这些都十分明朗,甚至许多动作细节都能从状态转换图中找到。可以毫不夸张的说,有了UML状态转换图,程序流程图写都不用写。

来源:STM32嵌入式开发

版权归原作者所有,如有侵权,请联系删除。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    90

    文章

    3708

    浏览量

    96781

原文标题:总结一下状态机编程的优点

文章出处:【微信号:pcbgood,微信公众号:奈因PCB电路板设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一个面向单片、事件驱动的嵌入式开发平台介绍

    线程(状态机)拥有自己的事件队列的方式,只有一个全局事件队列,极限压缩对RAM的占用。 3、协作式内核,优点是不会产生资源竞争,极度可靠。 4、极度轻量,便于嵌入其他系统,除事件总线外的所有特性
    发表于 12-05 06:26

    睿远研究院丨IO-Link规范解读(十一):ISDU状态机与EVENT事件

    上篇我们介绍了ISDU的典型编码格式和应用案例,本篇我们就来详细介绍下,ISDU的状态机,并把EVENT事件的逻辑,给大家好好解析下。 1主站ISDU状态机 如上图所示,ISDU的状态机的核心
    的头像 发表于 11-29 18:28 2995次阅读
    睿远研究院丨IO-Link规范解读(十一):ISDU<b class='flag-5'>状态机</b>与EVENT事件

    什么是状态机

    /OFF 状态转换图 在状态机编程中,正确的顺序应该是先有状态转换图,后有程序,程序应该是根据设计好的状态图写出来的。下面这张按键控制流水灯
    发表于 11-27 08:15

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

    ,这样CPU就闲不下来了。 这种处理方法的实质就是在程序等待事件的过程中间隔性地插入一些有意义的工作,好让CPU不是一直无谓地等待。 二、逻辑完备性 逻辑完备性是状态机编程最大的优点。 不知道大家
    发表于 11-25 07:08

    睿远研究院丨IO-Link规范解读(八):M-Sequence Type 与消息处理状态机

    丢弃,减少后端工作量。 那么今天我们就来深入研究下,消息处理模块中提到的各类M-Sequence,以及主从站的消息处理状态机!   1 M-Sequence Type 上回讲到主站发出来的MC和CKT
    的头像 发表于 11-07 16:18 5743次阅读
    睿远研究院丨IO-Link规范解读(八):M-Sequence Type 与消息处理<b class='flag-5'>状态机</b>

    睿远研究院丨IO-Link规范解读(六):主从站状态机解析

    前言 书接上文,今天我们就来好好聊聊主从站的DL-Mode状态机,还请各位童鞋前排坐好! 1主站状态机解析 主站的DL-Mode状态机有5个大状态,也是我们很熟悉的 建立通信、开始、预
    的头像 发表于 10-28 17:34 5937次阅读
    睿远研究院丨IO-Link规范解读(六):主从站<b class='flag-5'>状态机</b>解析

    JTAG标准的状态机实现

    JTAG作为一项国际标准测试协议(IEEE1149.1兼容),主要用于芯片内部测试和调试。目前的主流芯片均支持JTAG协议,如DSP、FPGA、ARM、部分单片等。标准的JTAG接口是20Pin,但JTAG实际使用的只有4根信号线,再配合电源、地。
    的头像 发表于 08-21 15:12 2112次阅读
    JTAG标准的<b class='flag-5'>状态机</b>实现

    请问如何在FX10上使用GPIF III状态机 *.h 文件?

    LVCMOS 2 位 SlaveFIFO GPIF III 状态机的演示中有一个 cy_gpif_header_lvcmos.h 文件。 我想知道如何使用.h文件,只需放入.h文件放入 FX10 项目? 您有它的用户指南文档吗?
    发表于 07-16 08:17

    NVMe高速传输之摆脱XDMA设计之八:PCIe初始化状态机设计

    PCIe配置初始化状态机实现PCIe设备枚举和配置空间初始化过程,在完成链路训练后,使用DFS(深度优先搜索)算法枚举PCIe总线上的设备,完成PCIe总线域的地址分配和设备的初始化。PCIe配置
    发表于 07-05 22:00

    有可能在 FX3 GPIF2 中创建两个独立的状态机吗?

    我想,如果我想通过 FX3 GPIF2 创建两个独立的传输流接口,我需要在 GPIF2 设计器中创建两个独立的状态机,我是否有可能在 GPIF2 设计器中创建两个独立的状态机
    发表于 05-20 06:14

    cypress3014视频格式改变的话,GPIF状态机需不需要重新配置?

    你好,请问视频格式改变的话,GPIF状态机需不需要重新配置
    发表于 05-14 07:28

    [Actor]在程序框图编程时,如何操作消息和方法对应的VI

    actor应用的关键: 当在程序框图编程时,核心是针对“消息”vi 进行操作,并不操作消息对应的方法vi(具体要实现的功能)。 调用的消息vi时,后台自动调用对应方法vi。 相当于在队列状态机中,队列元素的进、出操作 与 该元素对应的
    发表于 05-13 18:10

    求助,关于srammaster.cydsn中状态机的问题求解

    晚上好。 我目前正在学习 GPIF II。 查看..EZ-USB FX3 SDK1.3firmwaregpif_examplescyfxsrammastersrammaster.cydsn中的状态机,有状态START和START1。 这意味着什么?
    发表于 05-12 06:20

    树莓派Pico不带CAN接口怎么办?难道要换方案?

    状态机,以及实现额外的外设(如这里的CAN)。PIO引擎不易编程,也不易学习。但有一些很好的示例可供参考。我正在复习KevinO'Connor精彩的can204
    的头像 发表于 03-25 09:32 910次阅读
    树莓派Pico不带CAN接口怎么办?难道要换方案?

    Simulink中的状态机建模方法 Simulink数据可视化与分析功能

    1. Simulink中的状态机建模方法 1.1 理解状态机的基本概念 在开始建模之前,了解状态机的基本概念是必要的。状态机由以下几个部分组成:
    的头像 发表于 12-12 09:27 4305次阅读