04.27 有限狀態機(Finite-state machine, FSM)的C語言實現

有限狀態機(Finite-state machine, FSM)的C語言實現

有限狀態機,也稱為FSM(Finite State Machine),其在任意時刻都處於有限狀態集合中的某一狀態。當其獲得一個輸入字符時,將從當前狀態轉換到另一個狀態,或者仍然保持在當前狀態。任何一個FSM都可以用狀態轉換圖來描述,圖中的節點表示FSM中的一個狀態,有向加權邊表示輸入字符時狀態的變化。如果圖中不存在與當前狀態與輸入字符對應的有向邊,則FSM將進入“消亡狀態(Doom State)”,此後FSM將一直保持“消亡狀態”。狀態轉換圖中還有兩個特殊狀態:狀態1稱為“起始狀態”,表示FSM的初始狀態。狀態6稱為“結束狀態”,表示成功識別了所輸入的字符序列。

在啟動一個FSM時,首先必須將FSM置於“起始狀態”,然後輸入一系列字符,最終,FSM會到達“結束狀態”或者“消亡狀態”。

有限狀態機(Finite-state machine, FSM)的C語言實現

狀態機的要素

狀態機可歸納為4個要素,即現態、條件、動作、次態。“現態”和“條件”是因,“動作”和“次態”是果。

  • 現態:是指當前所處的狀態。

  • 條件:又稱為“事件”。當一個條件被滿足,將會觸發一個動作,或者執行一次狀態的遷移。

  • 動作:條件滿足後執行的動作。動作執行完畢後,可以遷移到新的狀態,也可以仍舊保持原狀態。動作不是必需的,當條件滿足後,也可以不執行任何動作,直接遷移到新狀態。

  • 次態:條件滿足後要遷往的新狀態。“次態”是相對於“現態”而言的,“次態”一旦被激活,就轉變成新的“現態”了。

c語言實現

直接先上個圖,就按照這個狀態來寫:

有限狀態機(Finite-state machine, FSM)的C語言實現

當事件是1的時候,進入的是週一,它的下一個狀態是週二。依次類推

  • 定義我們上圖的狀態

有限狀態機(Finite-state machine, FSM)的C語言實現

  • 繼續定義出觸發的事件

有限狀態機(Finite-state machine, FSM)的C語言實現

  • 定義狀態表的數據結構

有限狀態機(Finite-state machine, FSM)的C語言實現

  • 定義出FSM的狀態表

有限狀態機(Finite-state machine, FSM)的C語言實現

  • 狀態機的註冊和狀態轉移

有限狀態機(Finite-state machine, FSM)的C語言實現

  • 事件處理的動作實現

有限狀態機(Finite-state machine, FSM)的C語言實現

  • 再在主函數中調用就好了。

看完整的代碼:

有限狀態機(Finite-state machine, FSM)的C語言實現

運行的效果:

有限狀態機(Finite-state machine, FSM)的C語言實現

有限狀態機(Finite-state machine, FSM)的C語言實現

更多的內容請關注:小5嵌入式


分享到:


相關文章: