1.什么是状态机
有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
将一个事件分成多个完整的状态,每个状态通过输入和输出进入下一个状态,这就是状态机思维。
优点:FSM可以把模型的多状态、多状态间的转换条件解耦,降低程序耦合度,使程序维护变得容易,代码也更具有可读性。
状态机中有几个术语:state(状态) 、transition(状态转移) 、action(动作) 、transition condition(转移条件)
2.状态
将一件事拆分为多件事,为每一件事赋予一个名字,这个名字就被称为FSM中的状态。因其状态有限,所以FSM被称为有限状态机。
例如:
风扇可划分为关、一档、二挡、三挡等状态。
电梯门可划分为关闭、正在开启、开启、正在关闭。
3.状态转移
当一个状态执行了某些动作转别为另外一个状态的过程就是一个状态转移。
状态转移就是在定义状态机的转移流程。
4.转移条件
指在某个状态下,达到了某个转移条件,才会按照状态机的转移流程转移到下一状态,并执行相应的动作。
5.动作
当转变为一个新状态时,在这个状态下需要做的事情,称为动作
6.FSM
大概解释图:
话不多说上代码!!!
首先创建状态,使用枚举为某个任务/某件事设立多个状态
设立转移条件,满足条件后,进行状态转移
这里是当检测到触摸时,将Touch_mode转变为对应的触摸状态。
如果未检测到触摸,则将状态归位。
在状态转移后,我们在mian中去处理每个状态对应的动作。
在主程序while中用Switch来判断当前状态,程序每运行一轮,就会进来看当前状态,并运行当前状态所需要做的动作。
可在动作中改变另一个状态机的状态,以此进行一些更复杂的操作。
也可以改变自身状态,以便进行衔接。
7.所遇问题(实际应用)
在使用AVR单片机时,MCC(代码配置器)生成的ADC转换函数。
问题点:在使用该函数时,程序会因等待ADC转换而造成卡顿,从而导致突发性的程序跑死。
解决方案:引用FSM状态机,将函数拆分为几个状态。
引用FSM前:
图为:引用FSM前,程序运行流程
引用FSM后:
图为:引用FSM后,程序运行流程
如何实现的呢?
首先设立状态
当需要ADC转换时,将状态切换至ADC_start,之后便开始转换,每完成一步则切换下一步的状态,在等待转换完成时,程序并不会等待,而是会直接跳出,等下一轮时再来看是否完成,直到完成为止。
使程序更加顺滑,节约程序运行时间。