层次状态机在数字对讲机中的应用与实现
2019-10-17吕金华
吕金华
摘 要:文章阐述数字对讲机系统的状态管理设计方案,着重描述了层次状态机的原理与实现,阐述了其功能与特点。
关键词:状态;层次状态机;对讲机
对讲机手持终端随着信令的引入,增加了大量的功能,从模拟对讲机到数字对讲机的过渡,从while大循环到操作系统的引入,系统越来越庞大,对讲机的状态越来越多。这是由于大量地使用了相互关联的条件编码,导致系统复杂且不容易理解。如果能消除这些条件分支的一部分,代码就会更容易理解和测试,并且减少代码相互关联的分支,使得代码呈数量级减少。因此,引入状态来管理复杂的交互系统是很重要的。
不妨从以下几方面一起探讨状态管理的实现。
1 方案背景
数字对讲机系统是交互状态较多的系统,状态存在内嵌情况,对讲机的整体状态调度所使用的是平面状态机(Plane State Machine,FSM),可以实现功能派发,而扫描功能内部就使用了层次状态机(Hierarchical State Machine,HSM)实现功能的嵌套情况[1]。实际上,HSM与FSM是可以相互转换的,可以把HSM展开用FSM来实现,而FSM也可以看作是单层的HSM,若在嵌套情况较多的系统中,用FSM实现会较为庞大。综合以上的方案比较,建议使用层次状态机框架(Hierarchical State Machine frame,HSM frame)实现数字对讲机系统的状态管理设计。
2 状态管理设计实现
HSM是对状态行为建模最直观的方法,也是实现事件驱动系统的一种很好的形式方法[2]。主要用来描述对象、子系统、系统的生命周期。通过层次状态机可以了解到一个对象能到达的所有状态以及对象收到的事件对对象状态的影响等。状态机指定对象的行为以及不同状态行为的差异。同时,它还能说明事件是如何改变一个对象的状态。因此,非常适用于软件开发。
层次状态机的事件处理算法简单描述如下:(1)首先,在当前状态以及其祖先状态的状态事件表中搜索匹配事件,如果搜索到,保存操作以及目的状态标识。(2)在old栈中保存当前状态到根节点路径,在new栈中保存目的状态到根节点路径。(3)将old栈中的顶层元素依次与new栈的顶层元素匹配,如果匹配则都出栈,不匹配,停止。(4)当前的old栈中节点即为该事件导致的退出状态,从栈底扫描到栈顶,依次执行exit_func。(5)执行以前保存的操作。(6)扫描new栈,从栈顶到栈底依次执行enter_func。(7)最后检测目的状态是否是叶节点状态,否,则依次进入default_child节点,并执行enter_func。
2.1 状态基本概念
为便于理解,下面给出HSM中的相关概念。
2.1.1 State(状态)
就是一个系统在其生命周期中某一时刻的运行情况,此时,系统会执行一些动作,或者等待一些外部输入。
2.1.2 Guard(条件)
状态机对外部消息进行响应的时候,除了需要判断当前的状态,还要判断跟这个状态相关的一些条件是否成立。这种判断称为guard(条件)。guard通过允许或者禁止某些操作来影响状态机的行为[3]。
2.1.3 Event(事件)
就是在一定的时间和空间上发生的对系统有意义的事情,它可以触发状态转换。
2.1.4 Action(动作)
当一个Event被状态机系统分发的时候,状态机用Action(动作)来进行响应,比如修改一下变量的值、进行输入输出、产生另外一个Event或者迁移到另外一个状态等。
2.1.5 Transition(迁移)
从一个状态切换到另一个状态被称为Transition(迁移)。引起状态迁移的事件被称为triggering event(触发事件),或者简称为trigger(触发)[4]。
2.1.6 HSM
层次状态机主要用来描述对象、子系统、系统的生命周期。通过层次状态机可以了解到一个对象能到达的所有状态以及对象收到的事件对对象状态的影响等。状态机指定对象的行为以及不同状态行为的差异。同时,它还能说明事件是如何改变一个对象的状态。因此,非常适用于软件开发。
层次状态机较之经典的平面状态机,最重要的改进就是引入了层次式状态。状态层次嵌套的主要特性来自抽象与层次的结合。这是一种降低复杂性的传统途径,也就是软件中的继承。在面向对象中,类继承概念描述了类和对象之间的关系。状态嵌套允许子状态继承来自其超状态的状态行为,因此,它被称为行为继承。
2.2 层次状态机的功能与特点
状态机所描述的行为不像传统的数据处理,它完全是由事件驱动的,事件能以任何顺序、在任何时刻出现,状态机必须随时准备好处理这些事情。状态机分平面式状态机和层次式状态机,这里只用到层次式状态机。
如图1所示:a中top为顶层状态,s1,s2为两个独立的状态,s21,s22为s2的子状态。b为状态机在代码中的数据组织,在代码中,每种状态都对应于一个结构体,它里面有一个super指针,指向其超状态,top狀态的super指针为空指针,这样就构成了层次状态机。
利用层次状态机的原理,适配到对讲机系统中,把系统划分为九个二级状态,分别是守候、接收、发射、省电、读写频、遥毙、扫描、紧急报警、监听。若二级存在内嵌状态(即进入了某种状态后还需要回来继续进行原状态的动作),则进一步划分该状态的子状态。
2.3 基于数字对讲机系统的状态管理设计
對讲机状态转换过程由对讲机状态机控制,状态机为层次状态机(HSM),层次状态机响应外部事件,做出相应的处理。应用状态机必须构造状态机。
图2构造的对讲机状态机为其在代码中的组织形式,每种状态都对应于一个结构体,它里面有一个super指针,指向其超状态,其中,top为顶层状态,top状态的super指针为空指针,另外,每个状态还有一个指向该状态的消息响应函数指针hndlr,这样就构成了层次状态机。
状态机运行时会不断地检测自己的消息队列里有没有事件,如果有,则执行当前状态下的事件响应函数,如果没有发生状态转换,则流程结束,如果发生了状态转换,则将从当前状态一层一层退出到与目标状态共同的超状态。每退出一层状态,都会响应该层的退出事件,执行退出事件响应函数,然后由该共同的超状态一层层进入到目标状态,每进入一层状态,都会响应该层的进入事件,执行进入事件响应函数,直到进入目标状态为止[5]。
各状态需要提供的函数如下:
(1)进入状态的初始化函数(ENTRY_EVT时执行)。
(2)退出状态的清除函数(EXIT_EVT时执行)。
(3)监听条件函数(参看上文Guard的概念,不是必需提供的,这个判断可以放在各状态内执行,也可以放在状态管理内执行)。
3 结语
状态管理的实现可以有多种方法,在数字对讲机项目中,引入层次状态机的思想实现状态管理,其结构清晰,层层进入、层层退出的状态迁移思想,使得状态在迁移过程中各层次的进入退出函数都得以执行,保证了各状态迁移路径的正确性,增强了系统的稳定性和可靠性。
[参考文献]
[1] MIRO S,PAUL M.State-Oriented programming[C].San Diego:2007 Summer Computer Simulation Conference,2003.
[2]MIRO S.嵌入式系统的微模块化程序设计:实用状态图C_C++实现[M].北京:北京航空航天大学出版社,2004.
[3]詹姆斯,艾娃,格拉迪.UML参考手册[M].姚淑珍,译.北京:机械工业出版社,2005.
[4]吴继华,王诚.设计与验证—Verilog.hdl[M].北京:人民邮电出版社,2006.
[5]池元武.用状态机原理进行软件设计[EB/OL].(2012-03-15)[2019-07-10].http://www.doc88.com/p-296208942779.html.
Application and implementation of hierarchical state machine in digital interphone
Lyu Jinhua
(Guangzhou Haige Communications Group Incorporated Company, Guangzhou 510663, China)
Abstract:This paper expounds the design scheme of state management for digital two-way-radio system, emphatically describes the principle and implementation of hierarchical state machine, and expounds its functions and characteristics.
Key words:state; hierarchical state machine; two-way-radio