有限狀態機FSM和層次狀態機HSM


前言

  就單片機而言,程序可以分為兩類:帶操作系統的程序和前后台程序;前后台程序從架構上又分為順序機和狀態機。

  廣義地說, 任何一個程序都是一個狀態機, 因為它總是要記住一些狀態, 然后根據輸入進行輸出。 狹義上說,狀態機不是指隨隨便便的一個程序, 而是指某一類程序, 也就是狀態機編程程序。

FSM

  簡單講就是將行為分為一個一個的狀態,狀態與狀態之間的過渡通過事件的觸發來形成。比如士兵的行為有“巡邏”,“追擊敵人”,“攻擊敵人”,“逃跑”等行為,響應的事件就有“發現敵人”,“追到敵人”,“敵人逃跑”,“敵人死亡”,“自己血量不足”等。那么可以寫成這樣一個狀態機:

  1.士兵 “巡邏”,如果 “發現敵人”,那么,“追擊敵人”

  2.士兵 “追擊敵人”, 如果 “追到敵人”, 那么,“攻擊敵人”

  3.士兵 “追擊敵人”, 如果 “敵人死亡”, 那么,繼續 “巡邏”

  4.士兵 “攻擊敵人”, 如果 “敵人死亡”, 那么,繼續 “巡邏”

  5.士兵 “攻擊敵人”, 如果 “血量不足”, 那么,“逃跑”

  其中,士兵就是這個FSM的執行者,紅色的就是狀態,藍色的就是事件,整個狀態機的行為可以總結為:當前狀態=>是否滿足條件1,如果是,則跳轉到對應狀態,否則=>是否滿足條件2,如果是,則跳轉到對應狀態。

  由此可看出,狀態機是一種“事件觸發型”行為,就是只有事件的觸發才會發生引起狀態的變化。

HSM

  簡單來說,就是FSM當狀態太多的時候,不好維護,於是將狀態分類,抽離出來,將同類型的狀態做為一個狀態機,然后再做一個大的狀態機,來維護這些子狀態機。

  舉個決策小狗行為的例子:我們對小狗定義了有很多行為,比如跑,吃飯,睡覺,咆哮,撒嬌,搖尾巴等等,如果每個行為都是一個狀態,用常規狀態機的話,我們就需要在這些狀態間定義跳轉,比如在“跑”的狀態下,如果累了,那就跳轉到“睡覺”狀態,再如,在“撒嬌”的狀態下,如果感到有威脅,那就跳轉到“咆哮”的狀態等等,我們會考量每一個狀態間的關系,定義所有的跳轉鏈接,建立這樣一個狀態機。如果用層次化的狀態機的話,我們就先會把這些行為“分類”,把幾個小狀態歸並到一個狀態里,然后再定義高層狀態和高層狀態中內部小狀態的跳轉鏈接。

  其實層次化狀態機從某種程度上,就是限制了狀態機的跳轉,而且狀態內的狀態是不需要關心外部狀態的跳轉的,這樣也做到了無關狀態間的隔離,比如對於小狗來說,我們可以把小狗的狀態先定義為疲勞,開心,憤怒,然后這些狀態里再定義小狀態,比如在開心的狀態中,有撒橋,搖尾巴等小狀態,這樣我們在外部只需要關心三個狀態的跳轉(疲勞,開心,憤怒),在每個狀態的內部只需要關心自己的小狀態的跳轉就可以了。這樣就大大的降低了狀態機的復雜度,另外,如果覺得兩層的狀態機還是狀態太多的話,可以定義更多的狀態層次以降低跳轉鏈接數。

  QP就是一個面向MCU,面向並發的層次式狀態機模型。有人稱量子平台QP(Quantum Programming)叫作量子編程(Quantum Programming),也叫狀態機編程。

 

 參考文獻

http://www.cnblogs.com/jeason1997/p/5140201.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM