以STM32为例 编程思想之状态机详解 (以STM32为主控芯片设计一款电子智能产品)
本文目录导航:
编程思想之状态机详解(以STM32为例)
关注会变身的火娃,学编程思想不迷路(持续更新中~)编程思想专栏目录(更多精彩):编程思想专栏目录,带你探索编程的奥秘,涵盖各类编程技巧与实战案例。
1 STM32状态机编程----什么是状态机?万事万物都有其状态。
状态机是一种编程思路,用于抽象描述现实事物运行规则。
通过状态机,可以清晰表达对象在不同条件下的行为模式。
1.1 什么是状态状态是事物在不同阶段的表现形态。
比如,一个灯泡的状态可以是打开或关闭,一个人的状态可以是健康、感冒或康复中。
状态机通过描述对象的各个状态及其转换,实现对复杂逻辑的简化。
1.2 状态机要素状态机由现态、条件、动作和次态四个要素组成。
现态和条件触发动作,动作改变现态。
比如,健康状态的条件是吃药,吃药后状态转换为康复中。
1.3 有限状态机有限状态机是状态机的一种,特点是状态有限且可数。
状态机通过定义状态集合、事件和动作,描述系统在不同状态下的行为逻辑。
1.4 状态迁移图(STD)状态迁移图是状态机的可视化表示,用节点表示状态,连线表示状态间的转换。
通过状态迁移图,可以直观理解状态机的工作流程。
1.5 STM32中的状态机STM32处理器在按键处理中使用状态机简化程序逻辑。
状态机通过定义事件、状态和动作,实现按键状态的自动化处理。
引入状态机思维,能有效简化程序设计。
1.5.1 if else语句结构状态机使用if else结构的状态机在多条件判断时效率低下,浪费CPU资源。
相比之下,switch case结构更清晰,但实际运行效率并未显著提高。
1.5.2 switch case结构状态机switch case结构通过事件和状态映射简化状态转换逻辑,使程序结构更加清晰。
虽然实际运行效率没有明显提升,但代码可读性增强。
1.5.2.1 再说一下使用Switch编写状态机的两种写法状态机的实现可以采用事件驱动和状态驱动两种方式。
事件驱动在状态中检查事件,状态驱动在事件中检查状态。
尽管两者功能相同,但实际编写中应选择更简洁、易于维护的实现方式。

状态机的几种骚操作,看完恍然大悟!
状态机的实现方式多种多样,本文将详细阐述几种常见的方法。
理解状态机的基本术语与传统有限状态机(FSM)概念对于深入探讨至关重要。
以一个定时计数器为例,其存在设置状态和计时状态两种状态。
实现状态机时,可以采用嵌套switch结构。
这种方法简洁明了,便于代码阅读和理解。
然而,其缺点是函数粒度过于细小,当状态和事件数量较多时,代码量会迅速膨胀,导致逻辑分散,且不提供状态进入和退出动作的实现。
另一种实现方式是使用二维状态转换表,该表能清晰地表示状态之间的转换。
但是,这种方法存在函数粒度过小的问题,当状态和事件数量庞大时,会显著增加代码量,同时不支持状态进入和退出动作。
为解决上述问题,一维状态转换表成为一种更高效的选择。
它通过优化函数粒度和简化状态转换逻辑,使得代码结构更为紧凑。
但同样,它未能提供状态进入和退出动作的实现。
引入嵌套式实时框架(QP)时,事件驱动型编程成为一种流行的实现方式。
QP根据好莱坞原则构造系统,强调“不要调用我,我会调用你”。
这与传统的顺序式编程形成鲜明对比。
QP框架允许通过类和单一继承实现面向对象的设计,从而提高代码的可维护性和复用性。
使用QM(状态机建模工具)和QS(软件追踪工具)可以便捷地通过UML类图描述状态机,并自动生成C代码。
这不仅简化了状态机的创建过程,还能确保代码的准确性和一致性。
实现层次状态机时,需要解决初始化过程中的路径搜索问题。
通过顶层状态到底层状态的路径确定,确保正确的状态进入和退出事件得以执行。
此外,内存管理成为关键组成部分,采用内存池技术可以有效管理事件队列,适应低性能微控制器的内存限制,同时确保事件的高效处理。
在QP实时框架中,事件队列设计允许不同类型的事件通过基础事件进行派生,并在活动对象中维护各自的事件队列。
通过强制转换,可以轻松获取附加参数,实现事件的灵活处理。
遵循代码风格规范,确保代码可读性和可维护性。
本文提供的资源链接/s/18LQhr7... 提取码:qqqq更多详细信息,请参考/ (QP官网)原文链接/qq_...
单片机编程思想——状态机
单片机编程思想——状态机状态机(state machine)有5个要素:状态(state)、迁移(transition)、事件(event)、动作(action)、条件(guard)。
状态:一个系统在某一时刻所存在的稳定的工作情况。
迁移:系统从一个状态转移到另一个状态的过程称作迁移,迁移不是自动发生的,需要外界对系统施加影响。
事件:某一时刻发生的对系统有意义的事情。
动作:在状态机的迁移过程中,状态机会做出一些其它的行为,这些行为就是动作,动作是状态机对事件的响应。
条件:状态机对事件并不是有求必应的,有了事件,状态机还要满足一定的条件才能发生状态迁移。
状态机编程中,正确的顺序应该是先有状态转换图,后有程序,程序应该是根据设计好的状态图写出来的。
以按键控制流水灯状态转换图为例,用UML(统一建模语言)的语法元素画出,说明事件、条件和动作。
程序代码实现按键控制流水灯的状态转换,包含初始化、检测按键、状态机主循环和状态迁移逻辑。
状态机结构体变量包含u8LedStat和u8KeyCnt两个成员,u8LedStat表示状态,u8KeyCnt记录按键次数。
状态机可以用结构体变量实现,u8LedStat作为主变量,u8KeyCnt作为辅助变量,辅助变量的积累引发主变量的变化。
采用结构体变量的状态机被称为Extended State Machine。
通过状态机编程,可以清晰地定义系统的行为逻辑,简化程序代码,提高程序的可读性和可维护性。
在单片机编程中,状态机是一种有效且实用的编程思想。