目录
为什么要写这篇
关注了一些微信公众号,推送的文章中提到了一个概念:状态机,当时本着收藏,等到想看的时候再看的想法,就这么一点点积累,等到后来意识到这个概念相关文章已经攒了6篇,后来很少看到相关文章了,而这个概念还没学会,又了解到这个和设计模式有关,设计模式和面向对象编程息息相关。
收藏第一篇关于状态机的文章到开始写这篇博客,整整三个月了,想想都觉得自己的拖延症。。。
状态机粗浅认识
状态机是一个抽象的概念,因此通过代码表达出来形式多种多样,那怎么算是状态机,就像什么是链表,栈和队列一样。
状态机是有限状态自动机(FSM)的简称,是现实事物运行规则抽象而成的一个数学模型。
有限状态自动机FSM,有限状态,它的状态是有限的。自动,给定一个状态机,同时给定它的当前状态以及输入,那么输出状态是可以明确的运算出来的。可以理解到状态机相关的概念中肯定有两个概念:输入状态(当前状态),输出状态(下一个状态)。
到这儿为止感觉和编程还没有多大关联,只是觉得和逻辑门电路(与门,或门,非门等)有一些相似,
为什么和编程还没什么关系呢?程序 = 数据结构 + 算法。 状态机是个抽象的概念,链表也是个抽象的概念,链表需要用一种结构来表示,状态机也需要一种结构来表示,数据结构就有了。链表需要提供操作接口,主要的就是增 、删、改、查,初始化和清空。这些操作接口的实现方法就属于算法。状态机同样需要提供操作接口,操作接口的实现也属于算法呀。
对于单片机编程从某种层面来说可以粗略地理解为传感器采集发生了哪些事件,然后做了相应处理动作。
明白了这些大致就了解状态机是什么了。相关的概念就是四个:当前的状态(逻辑状态输入),发生的事件(单片机输入),执行的功能函数(单片机输出),下一个状态(逻辑状态输出)
我联想到“黑盒”和“模块化”:状态机是个黑盒,给它确定的输入,就会有对应的输出。状态机可以看作是个模块,与硬件关联不大,可以写成独立的模块文件,方便移植。
我认为状态机的作用是为了得到输出,输出有两个,执行功能函数 和 下一个状态,下一个状态 <