呂金華


摘? ?要:文章闡述數字對講機系統的狀態管理設計方案,著重描述了層次狀態機的原理與實現,闡述了其功能與特點。
關鍵詞:狀態;層次狀態機;對講機
對講機手持終端隨著信令的引入,增加了大量的功能,從模擬對講機到數字對講機的過渡,從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