单片机编程思想 (单片机编程思路怎么写)
本文目录导航:
单片机编程思想——状态机
单片机编程思想——状态机状态机(state machine)有5个要素:状态(state)、迁移(transition)、事件(event)、动作(action)、条件(guard)。
状态:一个系统在某一时刻所存在的稳定的工作情况。
迁移:系统从一个状态转移到另一个状态的过程称作迁移,迁移不是自动发生的,需要外界对系统施加影响。
事件:某一时刻发生的对系统有意义的事情。
动作:在状态机的迁移过程中,状态机会做出一些其它的行为,这些行为就是动作,动作是状态机对事件的响应。
条件:状态机对事件并不是有求必应的,有了事件,状态机还要满足一定的条件才能发生状态迁移。
状态机编程中,正确的顺序应该是先有状态转换图,后有程序,程序应该是根据设计好的状态图写出来的。
以按键控制流水灯状态转换图为例,用UML(统一建模语言)的语法元素画出,说明事件、条件和动作。
程序代码实现按键控制流水灯的状态转换,包含初始化、检测按键、状态机主循环和状态迁移逻辑。
状态机结构体变量包含u8LedStat和u8KeyCnt两个成员,u8LedStat表示状态,u8KeyCnt记录按键次数。
状态机可以用结构体变量实现,u8LedStat作为主变量,u8KeyCnt作为辅助变量,辅助变量的积累引发主变量的变化。
采用结构体变量的状态机被称为Extended State Machine。
通过状态机编程,可以清晰地定义系统的行为逻辑,简化程序代码,提高程序的可读性和可维护性。
在单片机编程中,状态机是一种有效且实用的编程思想。

有限状态机的编程
有限状态机体现了两点:首先是离散的,然后是有限的。
State:状态这个词有些难以定义,状态存储关于过去的信息,就是说它反映从系统开始到现在时刻的输入变化。
Actions & Transitions:转换指示状态变更,并且用必须满足来确使转移发生的条件来描述它。
动作是在给定时刻要进行的活动的描述。
Guards:检测器出现的原因是为了检测是否满足从一个状态切换到另外一个状态的条件。
Event:事件,又见事件,笼统说来,对系统重要的某件事情被称为事件。
恩,就这些了,有些迷惑么:),恩,我们来理清一下思路:先从事件说起,事件是有生命的,它经历:1).被产生(被接受,等待被处理,一般放入事件队列)2).被分发(从事件队列取出,分发到响应的状态机处理)3).死亡(当状态机处理了该事件,它随之死亡)从一个状态切换到另外一个状态被称为状态转换,而引起它的事件称为触发事件.(可以看到,不是所有的事件都会引起状态的转换).提到状态转换,不能不提及检测器(Guards),只有当检测器的值为TRUE时候,才能启动转换
状态机编程实例-面向对象的状态设计模式
面向对象的状态设计模式的核心思想在于通过不同的类表示不同的状态,状态机从一个状态转换到另一个状态时,表现为在运行时改变自己的类。
此模式引入了一个炸弹状态的抽象基类BombState,用于派生具体的工作状态类,例如设置状态(SettingState)和倒计时状态(TimingState)。
在模式下,BombState类为炸弹的两个工作状态声明了一些公共的接口:onUP、onDOWN、onARM和onTICK。
具体的工作状态类通过定义自己的onUP等操作,实现各自状态类需要处理的功能。
为了实现状态的维护,模式设计了一个上下文类Bomb3,它通过一个抽象类BombState的指针来实现。
上下文(context)可以理解为环境或语境,每一段程序都有很多的外部变量,要想让程序独立运行,必须把所有外部变量的值传进去,这些值的集合就是上下文。
在本例中,BombState的运行需要一个上下文类作为其参数,这个参数就是Bomb3类。
上下文类Bomb3中还包含需要用到的扩展状态变量,并通过提供对BombState一样的接口,即每派生一个事件对应一个操作。
上下文类中的事件处理是通过state_指针实现的,它代表了对当前状态对象的全部特定请求,状态的改变对应于当前工作状态类对象的改变,通过上下文操作tran()实现状态转换。
在C++语言中实现面向对象的状态设计模式,需要定义几个关键类:状态基类与派生类、炸弹业务类(上下文类)、以及主函数。
状态基类定义了通用接口,派生类则具体实现了不同的状态行为。
炸弹业务类提供通用的事件处理接口,其内部根据具体状态调用对应状态类的事件处理函数。
主函数简洁,主要调用通用的事件处理接口,实现状态转换和业务逻辑。
总结,面向对象的状态设计模式利用C++的继承特性及类指针,为状态机编程提供了一种高效、灵活的实现方式,简化了状态转换的管理,并通过上下文类实现了状态的动态维护。
通过本篇内容,重点理解了如何通过类的设计实现状态机的动态改变,以及上下文类在状态机中的作用。