程序小白
认证:优质创作者
所在专题目录 查看专题
【第一章】有限状态机理论速成笔记
【第二章】HSM层次式状态机理论(进阶版)
【第三章】有限状态机(FSM)之炸弹项目(实战1)
【第四章】有限状态机(FSM)之炸弹项目(实战2)
【第五章】有限状态机(FSM)之炸弹项目(实战3)
【第六章】层次式状态机HSM = 有限状态机FSM + 面向对象
作者动态 更多
小小调度器——开局default,优雅总藏于细节之中
04-02 09:23
小小调度器——调度器核心的纯C实现
04-01 14:09
小小调度器——原来C代码还能这么写,原作者没少挨打吧!
03-27 15:42
解析由系统库引发的hardfault血案(RT-Thread+ESP32)
2023-07-17 16:04
TINA瞬时现象仿真分析——运放缓冲器振铃
2023-02-28 11:38

【第二章】HSM层次式状态机理论(进阶版)

      传统的有限状态机理论只是根基,现在很少真正把它应用到我们的项目中,它已经不足以应对我们如今在嵌入式系统的软件设计中遇到的问题了。

      那么啥是HSM? 大牛是这么讲的,说实话有点难懂,我从入门到放弃到再入门了好几遍,我不打算对这些概念做什么解释,假如有一天你觉得你的理论不够用了再回去翻可能效果更好,或者你听我扯完蛋,再去看发现也不是那么难懂,我就满足了。

      我的理解:HSM就是一个状态机包含子状态机,从而形成的层次结构,这不就是面向对象理论和有限状态机理论结合的产物?对的,这年头,你搞嵌入式软件设计,要是没点面向对象的思想在里面,出门都不好意思和同行打招呼(他有女朋友,我有对象~!)

对比一下传统的FSM状态机,可能更好懂一些,(请忽略内部那些e/x后面再说)如下:

为什么要引入层次式状态机,这种嵌套的结构明显会将事情搞复杂。

      层次式状态机的设计和实现说实话灰常复杂,你要是没学好数据结构和算法,就不要去看他的源码了,挫败感瞬间会涌上心头。那么为啥还要用呢,设计层次式状态机是复杂,但是应用起来并不复杂,没有啥比调用函数API解决问题更简单的方式了,而很有意思的是,应用它你的应用会变得无比清晰和简明。

      软件界中,最糟糕的设计之一,重复造轮技术,因为随着需求的爆发,它最终会演变成你我都看不懂的存在(哪怕你用作文写注释)。

      我们由一个现实的问题,来切入到从传统的有限状态机(FSM)切换到层次状态机(HSM)所带来的好处举一个空调的运行控制的例子吧,空调大家都熟悉,内部四大件:压缩机 四通阀 冷凝器(带风扇)蒸发器(带风扇)。

      当你从关机状态到制冷模式和制热模式两种状态,其实两个风机都要开,压机也都要开,区别在于四通阀的方向不一样。

      传统FSM: 关机状态, 制冷状态,制热状态等三个状态。在制冷制热状态都要开风机和压机,代码里面你要写两遍(再现重复造轮技术)。

      进阶HSM: 关机状态,运行状态,运行子状态:制冷,运行子状态:制热,开风机和压机的操作扔进运行状态处理(也叫超状态,可以类比) ,这样代码中写一遍就可以(复用的艺术)。

      这里应用到了面向对象的核心之一,继承思想来实现复用,在软件设计中,没有比这更实用的技术。

      既然提到了面向对象,提一下三大核心概念,封装继承和多态,上面应用的就是继承思想,在事件驱动型系统中,我们叫行为继承,接下来介绍那两大概念。

      封装技术是基于抽象而来的,抽象抽象是抽成一头象,不是真让你去抽象(可能有绳命危险),他的作用主要是,能让你缩放自如,代码界大牛总是能以难以想象的速度定位bug,增加需求等其实用的就是缩放技术(并不是他的脑回路连接方式和我们的不同)。

      运用这个技术可以让你以各种方式把大象放进冰箱,是开/关门一头放,还是切了放,完全取决于你是不是认为他是一头象。这么说有点抽象,具体点,你去四儿子店告诉销售,你要买辆车,他会立即向你介绍各种车型,假如你说我要四个轮子,一个发动机,一个变速箱,一个车壳,加一个底盘等等。他可能会怀疑人生。

      多态对应我们的状态机就更好理解了,例如制冷状态 制热都是针对运行状态的多种状态的扩展,基于同一个超状态扩展多个子状态。

      到这里关于层次式状态机是个啥,他为何而来,他到底怎么来的 ,你可能脑子里有个大体的印象了。这里层次式状态机虽然是基于面向对象技术而产生,但是他不等于面向对象编程,和我们传统的对象和类的概念还是不小的区别,实践中慢慢体会吧 。

      经典状态机分两种:Mealy 机和 Moore机。

      简单介绍:Mealy 机 没有进入动作和退出动作,只有状态和转换动作。

                       Moore 机 有进入动作和退出动作,没有转换动作。

      这里不打算分开讲了,UML对经典状态机进行了扩展,合二为一,也就是一个状态机有:状态,进入动作,退出动作,转换动作组成。关于啥是UML(这个叫做统一建模语言,我建议你不要去看,这颗思想的种子需要挖一个好大的坑,容易闪腰)。

      看到这里,你应该知道什么是层次式状态机了,也知道了怎么构造他,但这还不够,下面还有个大活,就是层次式状态机是如何转换的,说实话我看完原著没怎么懂,只有自己真的上机执行 和操作过了以后,算是基本搞明白了,所以这里,我不打算展开去讲理论如何转换的,书里讲的比我专业很多。

      我想告诉大家基于层次式状态机设计的几个属性,记住他们,你就可以直接上例子,我们再例子里面慢慢聊了。

      划重点:一、状态机可以分层次,但是系统停留阶段只能是最终的子状态,他不能停留在任何层次的超状态,这个停留的状态称为活动状态。例如上面空调的例子,运行状态无法停留,他是一个过渡状态,执行他是有意义的,但停留没有意义,最终活动状态要么制冷要么制热状态。

     划重点:二、状态机本身是不会有任何动作的,只有触发相关事件,他才会执行程序上下文,每个事件会有对应的动作范型,这里讲一下一个状态机必备的事件-动作范型。

            初始事件-动作范型:也就是状态机在初始化过程中需要执行的程序上下文。

            进入事件-动作范型:切换状态机时,目标状态机必须执行的程序上下文。

            退出事件-动作范型:切换状态机时,源状态机必须执行的程序上下文。

            转换事件-动作范型:切换状态机时,先于进入/退出动作执行的程序上下文。

      层次式状态机的内部实现复杂,应用只是看着复杂,当你真正理解以后,会觉得无比清晰和简单。下一届讲大活,层次式状态机的转换执行的顺序和动作集,下期再见~!

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 8
收藏 9
关注 117
成为作者 赚取收益
全部留言
0/200