呂金華
摘? ?要:文章闡述數(shù)字對講機(jī)系統(tǒng)的狀態(tài)管理設(shè)計(jì)方案,著重描述了層次狀態(tài)機(jī)的原理與實(shí)現(xiàn),闡述了其功能與特點(diǎn)。
關(guān)鍵詞:狀態(tài);層次狀態(tài)機(jī);對講機(jī)
對講機(jī)手持終端隨著信令的引入,增加了大量的功能,從模擬對講機(jī)到數(shù)字對講機(jī)的過渡,從while大循環(huán)到操作系統(tǒng)的引入,系統(tǒng)越來越龐大,對講機(jī)的狀態(tài)越來越多。這是由于大量地使用了相互關(guān)聯(lián)的條件編碼,導(dǎo)致系統(tǒng)復(fù)雜且不容易理解。如果能消除這些條件分支的一部分,代碼就會(huì)更容易理解和測試,并且減少代碼相互關(guān)聯(lián)的分支,使得代碼呈數(shù)量級減少。因此,引入狀態(tài)來管理復(fù)雜的交互系統(tǒng)是很重要的。
不妨從以下幾方面一起探討狀態(tài)管理的實(shí)現(xiàn)。
1? ? 方案背景
數(shù)字對講機(jī)系統(tǒng)是交互狀態(tài)較多的系統(tǒng),狀態(tài)存在內(nèi)嵌情況,對講機(jī)的整體狀態(tài)調(diào)度所使用的是平面狀態(tài)機(jī)(Plane State Machine,F(xiàn)SM),可以實(shí)現(xiàn)功能派發(fā),而掃描功能內(nèi)部就使用了層次狀態(tài)機(jī)(Hierarchical State Machine,HSM)實(shí)現(xiàn)功能的嵌套情況[1]。實(shí)際上,HSM與FSM是可以相互轉(zhuǎn)換的,可以把HSM展開用FSM來實(shí)現(xiàn),而FSM也可以看作是單層的HSM,若在嵌套情況較多的系統(tǒng)中,用FSM實(shí)現(xiàn)會(huì)較為龐大。綜合以上的方案比較,建議使用層次狀態(tài)機(jī)框架(Hierarchical State Machine frame,HSM frame)實(shí)現(xiàn)數(shù)字對講機(jī)系統(tǒng)的狀態(tài)管理設(shè)計(jì)。
2? ? 狀態(tài)管理設(shè)計(jì)實(shí)現(xiàn)
HSM是對狀態(tài)行為建模最直觀的方法,也是實(shí)現(xiàn)事件驅(qū)動(dòng)系統(tǒng)的一種很好的形式方法[2]。主要用來描述對象、子系統(tǒng)、系統(tǒng)的生命周期。通過層次狀態(tài)機(jī)可以了解到一個(gè)對象能到達(dá)的所有狀態(tài)以及對象收到的事件對對象狀態(tài)的影響等。狀態(tài)機(jī)指定對象的行為以及不同狀態(tài)行為的差異。同時(shí),它還能說明事件是如何改變一個(gè)對象的狀態(tài)。因此,非常適用于軟件開發(fā)。
層次狀態(tài)機(jī)的事件處理算法簡單描述如下:(1)首先,在當(dāng)前狀態(tài)以及其祖先狀態(tài)的狀態(tài)事件表中搜索匹配事件,如果搜索到,保存操作以及目的狀態(tài)標(biāo)識(shí)。(2)在old棧中保存當(dāng)前狀態(tài)到根節(jié)點(diǎn)路徑,在new棧中保存目的狀態(tài)到根節(jié)點(diǎn)路徑。(3)將old棧中的頂層元素依次與new棧的頂層元素匹配,如果匹配則都出棧,不匹配,停止。(4)當(dāng)前的old棧中節(jié)點(diǎn)即為該事件導(dǎo)致的退出狀態(tài),從棧底掃描到棧頂,依次執(zhí)行exit_func。(5)執(zhí)行以前保存的操作。(6)掃描new棧,從棧頂?shù)綏5滓来螆?zhí)行enter_func。(7)最后檢測目的狀態(tài)是否是葉節(jié)點(diǎn)狀態(tài),否,則依次進(jìn)入default_child節(jié)點(diǎn),并執(zhí)行enter_func。
2.1? 狀態(tài)基本概念
為便于理解,下面給出HSM中的相關(guān)概念。
2.1.1? State(狀態(tài))
就是一個(gè)系統(tǒng)在其生命周期中某一時(shí)刻的運(yùn)行情況,此時(shí),系統(tǒng)會(huì)執(zhí)行一些動(dòng)作,或者等待一些外部輸入。
2.1.2? Guard(條件)
狀態(tài)機(jī)對外部消息進(jìn)行響應(yīng)的時(shí)候,除了需要判斷當(dāng)前的狀態(tài),還要判斷跟這個(gè)狀態(tài)相關(guān)的一些條件是否成立。這種判斷稱為guard(條件)。guard通過允許或者禁止某些操作來影響狀態(tài)機(jī)的行為[3]。
2.1.3? Event(事件)
就是在一定的時(shí)間和空間上發(fā)生的對系統(tǒng)有意義的事情,它可以觸發(fā)狀態(tài)轉(zhuǎn)換。
2.1.4? Action(動(dòng)作)
當(dāng)一個(gè)Event被狀態(tài)機(jī)系統(tǒng)分發(fā)的時(shí)候,狀態(tài)機(jī)用Action(動(dòng)作)來進(jìn)行響應(yīng),比如修改一下變量的值、進(jìn)行輸入輸出、產(chǎn)生另外一個(gè)Event或者遷移到另外一個(gè)狀態(tài)等。
2.1.5? Transition(遷移)
從一個(gè)狀態(tài)切換到另一個(gè)狀態(tài)被稱為Transition(遷移)。引起狀態(tài)遷移的事件被稱為triggering event(觸發(fā)事件),或者簡稱為trigger(觸發(fā))[4]。
2.1.6? HSM
層次狀態(tài)機(jī)主要用來描述對象、子系統(tǒng)、系統(tǒng)的生命周期。通過層次狀態(tài)機(jī)可以了解到一個(gè)對象能到達(dá)的所有狀態(tài)以及對象收到的事件對對象狀態(tài)的影響等。狀態(tài)機(jī)指定對象的行為以及不同狀態(tài)行為的差異。同時(shí),它還能說明事件是如何改變一個(gè)對象的狀態(tài)。因此,非常適用于軟件開發(fā)。
層次狀態(tài)機(jī)較之經(jīng)典的平面狀態(tài)機(jī),最重要的改進(jìn)就是引入了層次式狀態(tài)。狀態(tài)層次嵌套的主要特性來自抽象與層次的結(jié)合。這是一種降低復(fù)雜性的傳統(tǒng)途徑,也就是軟件中的繼承。在面向?qū)ο笾校惱^承概念描述了類和對象之間的關(guān)系。狀態(tài)嵌套允許子狀態(tài)繼承來自其超狀態(tài)的狀態(tài)行為,因此,它被稱為行為繼承。
2.2? 層次狀態(tài)機(jī)的功能與特點(diǎn)
狀態(tài)機(jī)所描述的行為不像傳統(tǒng)的數(shù)據(jù)處理,它完全是由事件驅(qū)動(dòng)的,事件能以任何順序、在任何時(shí)刻出現(xiàn),狀態(tài)機(jī)必須隨時(shí)準(zhǔn)備好處理這些事情。狀態(tài)機(jī)分平面式狀態(tài)機(jī)和層次式狀態(tài)機(jī),這里只用到層次式狀態(tài)機(jī)。
如圖1所示:a中top為頂層狀態(tài),s1,s2為兩個(gè)獨(dú)立的狀態(tài),s21,s22為s2的子狀態(tài)。b為狀態(tài)機(jī)在代碼中的數(shù)據(jù)組織,在代碼中,每種狀態(tài)都對應(yīng)于一個(gè)結(jié)構(gòu)體,它里面有一個(gè)super指針,指向其超狀態(tài),top狀態(tài)的super指針為空指針,這樣就構(gòu)成了層次狀態(tài)機(jī)。
利用層次狀態(tài)機(jī)的原理,適配到對講機(jī)系統(tǒng)中,把系統(tǒng)劃分為九個(gè)二級狀態(tài),分別是守候、接收、發(fā)射、省電、讀寫頻、遙斃、掃描、緊急報(bào)警、監(jiān)聽。若二級存在內(nèi)嵌狀態(tài)(即進(jìn)入了某種狀態(tài)后還需要回來繼續(xù)進(jìn)行原狀態(tài)的動(dòng)作),則進(jìn)一步劃分該狀態(tài)的子狀態(tài)。
2.3? 基于數(shù)字對講機(jī)系統(tǒng)的狀態(tài)管理設(shè)計(jì)
對講機(jī)狀態(tài)轉(zhuǎn)換過程由對講機(jī)狀態(tài)機(jī)控制,狀態(tài)機(jī)為層次狀態(tài)機(jī)(HSM),層次狀態(tài)機(jī)響應(yīng)外部事件,做出相應(yīng)的處理。應(yīng)用狀態(tài)機(jī)必須構(gòu)造狀態(tài)機(jī)。
圖2構(gòu)造的對講機(jī)狀態(tài)機(jī)為其在代碼中的組織形式,每種狀態(tài)都對應(yīng)于一個(gè)結(jié)構(gòu)體,它里面有一個(gè)super指針,指向其超狀態(tài),其中,top為頂層狀態(tài),top狀態(tài)的super指針為空指針,另外,每個(gè)狀態(tài)還有一個(gè)指向該狀態(tài)的消息響應(yīng)函數(shù)指針hndlr,這樣就構(gòu)成了層次狀態(tài)機(jī)。
狀態(tài)機(jī)運(yùn)行時(shí)會(huì)不斷地檢測自己的消息隊(duì)列里有沒有事件,如果有,則執(zhí)行當(dāng)前狀態(tài)下的事件響應(yīng)函數(shù),如果沒有發(fā)生狀態(tài)轉(zhuǎn)換,則流程結(jié)束,如果發(fā)生了狀態(tài)轉(zhuǎn)換,則將從當(dāng)前狀態(tài)一層一層退出到與目標(biāo)狀態(tài)共同的超狀態(tài)。每退出一層狀態(tài),都會(huì)響應(yīng)該層的退出事件,執(zhí)行退出事件響應(yīng)函數(shù),然后由該共同的超狀態(tài)一層層進(jìn)入到目標(biāo)狀態(tài),每進(jìn)入一層狀態(tài),都會(huì)響應(yīng)該層的進(jìn)入事件,執(zhí)行進(jìn)入事件響應(yīng)函數(shù),直到進(jìn)入目標(biāo)狀態(tài)為止[5]。
各狀態(tài)需要提供的函數(shù)如下:
(1)進(jìn)入狀態(tài)的初始化函數(shù)(ENTRY_EVT時(shí)執(zhí)行)。
(2)退出狀態(tài)的清除函數(shù)(EXIT_EVT時(shí)執(zhí)行)。
(3)監(jiān)聽條件函數(shù)(參看上文Guard的概念,不是必需提供的,這個(gè)判斷可以放在各狀態(tài)內(nèi)執(zhí)行,也可以放在狀態(tài)管理內(nèi)執(zhí)行)。
3? ? 結(jié)語
狀態(tài)管理的實(shí)現(xiàn)可以有多種方法,在數(shù)字對講機(jī)項(xiàng)目中,引入層次狀態(tài)機(jī)的思想實(shí)現(xiàn)狀態(tài)管理,其結(jié)構(gòu)清晰,層層進(jìn)入、層層退出的狀態(tài)遷移思想,使得狀態(tài)在遷移過程中各層次的進(jìn)入退出函數(shù)都得以執(zhí)行,保證了各狀態(tài)遷移路徑的正確性,增強(qiáng)了系統(tǒng)的穩(wěn)定性和可靠性。
[參考文獻(xiàn)]
[1] MIRO S,PAUL M.State-Oriented programming[C].San Diego:2007 Summer Computer Simulation Conference,2003.
[2]MIRO S.嵌入式系統(tǒng)的微模塊化程序設(shè)計(jì):實(shí)用狀態(tài)圖C_C++實(shí)現(xiàn)[M].北京:北京航空航天大學(xué)出版社,2004.
[3]詹姆斯,艾娃,格拉迪.UML參考手冊[M].姚淑珍,譯.北京:機(jī)械工業(yè)出版社,2005.
[4]吳繼華,王誠.設(shè)計(jì)與驗(yàn)證—Verilog.hdl[M].北京:人民郵電出版社,2006.
[5]池元武.用狀態(tài)機(jī)原理進(jìn)行軟件設(shè)計(jì)[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