用状态机思路来进行嵌入式编程

嵌入式ARM 2019-03-13 18:14


状态机的概念


状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。


比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。


进一步看,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。


同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。


显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。


当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。

程序其实就是状态机。


也许你还不理解上面这句话。请想想看,计算机的大厦不就是建立在“0”和“1”两个基本状态的地基之上么?


状态机的要素


状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:


① 现态:是指当前所处的状态。


② 条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。


③ 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。


④ 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。


如果我们进一步归纳,把“现态”和“次态”统一起来,而把“动作”忽略(降格处理),则只剩下两个最关键的要素,即:状态、迁移条件。


状态机的表示方法有许多种,我们可以用文字、图形或表格的形式来表示一个状态机。


纯粹用文字描述是很低效的,所以就不介绍了。接下来先介绍图形的方式。


状态迁移图(STD)


状态迁移图(STD),是一种描述系统的状态、以及相互转化关系的图形方式。状态迁移图的画法有许多种,不过一般都大同小异。我们结合一个例子来说明一下它的画法,如图1所示。


图1状态迁移图


①状态框:用方框表示状态,包括所谓的“现态”和“次态”。


②条件及迁移箭头:用箭头表示状态迁移的方向,并在该箭头上标注触发条件。


③节点圆圈:当多个箭头指向一个状态时,可以用节点符号(小圆圈)连接汇总。


④动作框:用椭圆框表示。


⑤附加条件判断框:用六角菱形框表示。


状态迁移图和我们常见的流程图相比有着本质的区别,具体体现为:在流程图中,箭头代表了程序PC指针的跳转;而在状态迁移图中,箭头代表的是状态的改变。


我们会发现,这种状态迁移图比普通程序流程图更简练、直观、易懂。这正是我们需要达到的目的。


状态迁移表


除了状态迁移图,我们还可以用表格的形式来表示状态之间的关系。这种表一般称为状态迁移表。


表1就是前面介绍的那张状态迁移图的另一种描述形式。


表1状态迁移表


①采用表格方式来描述状态机,优点是可容纳更多的文字信息。例如,我们不但可以在状态迁移表中描述状态的迁移关系,还可以把每个状态的特征描述也包含在内。


②如果表格内容较多,过于臃肿不利于阅读,我们也可以将状态迁移表进行拆分。经过拆分后的表格根据其具体内容,表格名称也有所变化。


③比如,我们可以把状态特征和迁移关系分开列表。被单独拆分出来的描述状态特征的表格,也可以称为“状态真值表”。这其中比较常见的就是把每个状态的显示内容单独列表。这种描述每个状态显示内容的表称之为“显示真值表”。同样,我们把单独表述基于按键的状态迁移表称为“按键功能真值表”。另外,如果每一个状态包含的信息量过多,我们也可以把每个状态单独列表。


④由此可见,状态迁移表作为状态迁移图的有益补充,它的表现形式是灵活的。


⑤状态迁移表优点是信息涵盖面大,缺点是视觉上不够直观,因此它并不能取代状态迁移图。比较理想的是将图形和表格结合应用。用图形展现宏观,用表格说明细节。二者互为参照,相得益彰。


状态机思路实现一个时钟程序


接下来,我将就状态机的应用,结合流程图、状态迁移图和状态迁移,举一个实际例子。下面这张图是一个时钟程序的状态迁移图,如图2所示。


图2时钟程序状态迁移图


把这张图稍做归纳,就可以得到它的另一种表现形式——状态迁移表,如表2所示。


表2时钟程序状态迁移表


状态机应用的注意事项


基于状态机的程序调度机制,其应用的难点并不在于对状态机概念的理解,而在于对系统工作状态的合理划分。


初学者往往会把某个“程序动作”当作是一种“状态”来处理。我称之为“伪态”。那么如何区分“动作”和“状态”。本匠人的心得是看二者的本质:“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。


初学者的另一种比较致命的错误,就是在状态划分时漏掉一些状态。我称之为“漏态”。


“伪态”和“漏态”这两种错误的存在,将会导致程序结构的涣散。因此要特别小心避免。


更复杂的状态机


前面介绍的是一种简单的状态结构。它只有一级,并且只有一维,如图3所示。


图3 线性状态机结构


如果有必要,我们可以建立更复杂的状态机模型。


(1)多级状态结构


状态机可以是多级的。在分层的多级状态机系统里面,一个“父状态”下可以划分多个“子状态”,这些子状态共同拥有上级父状态的某些共性,同时又各自拥有自己的一些个性。


在某些状态下,还可以进一步划分子状态。比如,我们可以把前面的时钟例子修改如下:


把所有和时钟功能有关的状态,合并成1个一级状态。在这个状态下,又可以划分出3个二级子状态,分别为显示时间、设置小时、设置分钟;


同样,我们也可以把所有和闹钟功能有关的状态,合并成1个一级状态。在这个状态下,再划分出4个二级子状态,分别为显示闹钟、设置“时”、设置“分”、设置鸣叫时间。


我们需要用另一个状态变量(寄存器)来表示这些子状态。


子状态下面当然还可以有更低一级的孙状态(子子孙孙无穷尽也),从而将整个状态体系变成了树状多级状态结构,如图4所示。


图4树状多级状态结构


(2)多维状态结构


状态结构也可以是多维的。从不同的角度对系统进行状态的划分,这些状态的某些特性是交叉的。比如,在按照按键和显示划分状态的同时,又按照系统的工作进程做出另一种状态划分。这两种状态划分同时存在,相互交叉,从而构成了二维的状态结构空间。

 

举一个这方面的例子,如:空调遥控器,如图5所示。


图5多维状态机结构


同样,我们也可以构建三维、四维甚至更多维的状态结构。每一维的状态都需要用一个状态变量(寄存器)来表示。


无论多级状态结构和多维状态结构看上去多么迷人,匠人的忠告是:我们依然要尽可能地简化状态结构,能用单级、单维的结构,就不要给自己找事,去玩那噩梦般的复杂结构。


简单的才是最有效的

嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论 (0)
  • 压缩空气作为工业生产中的三大动力之一,是仅次于电力的第二大动力能源,工业生产中所谓的“水电气”即包括压缩空气。目前,我国80%以上的规模工厂都配置有压缩空气动力,而空气压缩机(空压机)作为压缩空气的主要生产设备,是工业现代化、自动化的基础动力产品,是工业活动中必不可少的设备之一。数据来源:贝哲斯据行业研究机构贝哲斯咨询公布数据显示,2024年全球空压机市场规模已达380亿美元,预计到2029年,全球空压机市场规模将增至580亿美元,市场前景持续向好。而气压传感器作为空压机系统中的“神经末梢”,肩
    华普微HOPERF 2025-04-02 15:54 6浏览
  • 北京贞光科技有限公司作为紫光同芯授权代理商,专注于为客户提供车规级安全芯片的硬件供应与软件SDK一站式解决方案,同时配备专业技术团队,为选型及定制需求提供现场指导与支持。随着新能源汽车渗透率突破40%(中汽协2024数据),智能驾驶向L3+快速演进,车规级MCU正迎来技术范式变革。作为汽车电子系统的"神经中枢",通过AEC-Q100 Grade 1认证的MCU芯片需在-40℃~150℃极端温度下保持μs级响应精度,同时满足ISO 26262 ASIL-D功能安全要求。在集中式
    贞光科技 2025-04-02 14:50 304浏览
  •   通信链路模拟训练仿真系统设计方案:多维度考量下的构建蓝图   通信链路模拟训练仿真系统的设计方案,需全面统筹系统目标、功能需求、技术落地以及性能评测等多个关键维度。以下是基于这些综合考量所构建的详细设计方案。   一、系统核心目标   通信链路模拟训练仿真系统旨在打造一个极度贴近真实场景的通信链路模拟环境。其首要目的在于为通信工程师与技术人员提供专业培训平台,助力他们深入理解通信链路的内在工作原理,熟练掌握故障排查技巧以及性能优化方法。   二、功能需求详述   通信链路建模功能
    北京华盛恒辉软件开发 2025-04-03 11:24 24浏览
  • 随着汽车向智能化、场景化加速演进,智能座舱已成为人车交互的核心承载。从驾驶员注意力监测到儿童遗留检测,从乘员识别到安全带状态判断,座舱内的每一次行为都蕴含着巨大的安全与体验价值。然而,这些感知系统要在多样驾驶行为、复杂座舱布局和极端光照条件下持续稳定运行,传统的真实数据采集方式已难以支撑其开发迭代需求。智能座舱的技术演进,正由“采集驱动”转向“仿真驱动”。一、智能座舱仿真的挑战与突破图1:座舱实例图智能座舱中的AI系统,不仅需要理解驾驶员的行为和状态,还要同时感知乘员、儿童、宠物乃至环境中的潜在
    康谋 2025-04-02 10:23 279浏览
  •   通用卫星通信模拟仿真系统软件:卫星通信模拟的得力工具   通用卫星通信模拟仿真系统软件,作为专业用于模拟卫星通信环境的利器,能够精准模拟卫星与地面站之间的通信进程,以及全方位考量卫星信号在传播过程中所受的各类影响因素。以下为您详细阐述这类软件的关键要点。   一、核心功能展示   卫星轨道与姿态模拟功能   多样轨道模拟:该软件可逼真模拟卫星于不同轨道上的动态运行状态。   姿态变化模拟:   通信链路模拟功能   链路搭建模拟:   传播因素考量:   信号处理与解调功能
    北京华盛恒辉软件开发 2025-04-02 21:53 28浏览
  • 海信家电发2024年年报,那业绩数据一出来,着实让人眼前一亮。全年营业收入达到927.46 亿元,同比增长8.35%;归母净利润更是高达33.48亿元,同比增长17.99%。这净利润的涨幅,在竞争激烈的家电市场里,相当吸睛。 这对股东来说,可是实打实的利好,也侧面反映出海信家电过去一年的盈利能力杠杠的。从业务板块来看,全品类业务像是开了挂。暖通空调、冰洗厨、汽车热管理等业务全面开花,璀璨套系业务更是增速迅猛,营收同比增长52%,高端家电市场的渗透率一路飙升。 中央空调领域,海
    用户1742991715177 2025-04-02 23:01 19浏览
  • 在智能化设备快速普及的今天,语音交互功能已成为提升用户体验的核心要素之一。WT588F语音芯片,凭借其灵活的存储容量、高兼容性及低功耗设计,成为工业、消费电子、智能家居等领域的优选方案。本文将从技术特性、应用场景及服务支持等维度,解析WT588F如何助力产品智能化升级。一、产品概述:多容量适配,满足多样化需求WT588F语音芯片提供2Mbit、4Mbit、8Mbit三种存储容量版本,支持用户根据实际需求灵活选择。其存储时长与音频格式、码率等参数密切相关,例如:WT588F02B(2Mbit):在
    广州唯创电子 2025-04-03 08:15 21浏览
  • 3月28日~3月30日,飞凌嵌入式技术团队先后走进成都理工大学、厦门大学、厦门理工学院及集美大学,正式启动全国大学生嵌入式芯片与系统设计竞赛西南赛区师资培训与南部赛区的赛题宣讲。旨在通过技术赋能提升竞赛作品质量,深化产教融合影响力。成都理工大学活动现场厦门大学活动现场厦门理工学院活动现场集美大学活动现场活动中飞凌嵌入式的技术专家对“瑞芯微赛道飞凌嵌入式方向选题”进行了深入解读,详细剖析了选题的背景、目标和要求,让参训师生们对竞赛方向有了更清晰的认识;随后对参赛平台(基于RK3588设计的ELF
    飞凌嵌入式 2025-04-02 16:42 16浏览
  • 探针本身不需要对焦。探针的工作原理是通过接触被测物体表面来传递电信号,其精度和使用效果取决于探针的材质、形状以及与检测设备的匹配度,而非对焦操作。一、探针的工作原理探针是检测设备中的重要部件,常用于电子显微镜、坐标测量机等精密仪器中。其工作原理主要是通过接触被测物体的表面,将接触点的位置信息或电信号传递给检测设备,从而实现对物体表面形貌、尺寸或电性能等参数的测量。在这个过程中,探针的精度和稳定性对测量结果具有至关重要的影响。二、探针的操作要求在使用探针进行测量时,需要确保探针与被测物体表面的良好
    锦正茂科技 2025-04-02 10:41 164浏览
  • 在如今工业智能化快速发展的时代,工业HMI的响应速度、显示效果与系统稳定性已成为设备竞争力的核心要素。触觉智能RK3506核心板59元售价,深度融合LVGL开源图形框架,以2.5秒极速启动、20ms超低触控延时、400MB/s显示带宽的硬核性能,为工业HMI、智能终端等场景提供低成本、高可靠性的解决方案。LVGL图形界面库LVGL是什么LVGL(Light and Versatile Graphics Library)是一个免费的轻量级开源图形库。具有丰富部件与高级图形特性,支持多种输入设备和多
    Industio_触觉智能 2025-04-02 18:13 14浏览
  • 实例1:设置GPIO为输入或输出完成读取状态和驱动LED功能。下面这个电路使用3个gpio 用于读取拔码开关的设置和驱动3个LED流水灯显示。拔码开关在开机时需要读取一次。使用过程中不需要使用。如果单独使用3个GPIO口很浪费。电路功能是,如果GPIO设置为输入,则可读入拔码开关设置,设置为输出则能分别点亮3个LED灯。拔码开关使用优先编码器将输入6个位置转换成3个编码输出。(历史原因,这个编码器电路的设计得不好。),LED使用非门驱动。当FLOWLED设置为输入时,可以读入A0 A1 A2 的
    southcreek 2025-04-03 09:49 16浏览
  • 近日,飞凌嵌入式FET3576-C核心板正式发布了新系统Forlinx Desktop 24.04。至此,FET3576-C核心板已完成Linux 6.1、Android 14、Forlinx Desktop 24.04等多种操作系统的适配,充分展现了其在系统丰富性方面的卓越实力。1、多系统适配,满足多样化需求飞凌嵌入式FET3576-C核心板基于Rockchip RK3576处理器开发设计,该处理器集成了4个ARM Cortex-A72和4个ARM Cortex-A53高性能核,内置6TOPS
    飞凌嵌入式 2025-04-02 16:39 4浏览
  • 教大家介绍在更换用户名和修改密码的方法,此方法不适用于Buildroot系统。使用触觉智能RK3568工控主板(型号为IDO-SBC3528)演示,搭载了瑞芯微RK3568四核处理器,板载2路RS232+4路隔离RS485,集成DIDO,自研RS485自动收发驱动,支持超2KM传输距离,并率先适配了电鸿物联操作系统!更改用户名与密码首先开始更改用户名,Ubuntu20.04直接进行如下步骤即可:root@ido:~# pkill -9 -u ido #杀死所有ido相关进程,该操作会使ido退出
    Industio_触觉智能 2025-04-02 18:15 16浏览
  • 作为电气工程专业大三学生,期末实验周总能看到实验室外排着长队等设备的同学。今年开学,我终于不用再抢实验室了 —— thanks to 刚入手的 EGBox Nano,这个比手机大不了多少的 "掌上实验室",让我在宿舍床上就能完成整流电路实验。巴掌大的机身藏着硬核配置第一次从快递盒里拿出 EGBox Nano 时,着实吃了一惊。84*181*51mm 的尺寸比我的 iPhone 大不了多少,600 克的重量塞进书包毫无压力。对比室友那台占满整张桌子的传统 HIL 设备,这个 "掌中宝" 简直是降维
    不喝酒的就下班 2025-04-03 10:29 20浏览
  • 在智能家居快速发展的今天,智能闹钟凭借其多功能性和交互体验,逐渐成为家庭、办公场景中的核心设备。然而,如何在实现丰富功能的同时控制成本与开发复杂度,成为厂商关注的重点。WT588F02KD语音芯片方案,凭借其高度集成化设计、灵活功能扩展及超低功耗特性,成为智能闹钟领域的优选解决方案。一、方案核心优势:单芯片集成,降本增效WT588F02KD语音芯片以“多、快、省”为核心设计理念,突破传统智能闹钟方案需多颗芯片(如MCU、语音芯片、显示驱动IC等)的复杂架构,通过单芯片实现语音播报、数码管驱动、触
    广州唯创电子 2025-04-03 08:34 21浏览
我要评论
0
2
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦