有限状态机FSM和层次状态机HSM
前言
就單片機(jī)而言,程序可以分為兩類:帶操作系統(tǒng)的程序和前后臺程序;前后臺程序從架構(gòu)上又分為順序機(jī)和狀態(tài)機(jī)。
廣義地說, 任何一個程序都是一個狀態(tài)機(jī), 因為它總是要記住一些狀態(tài), 然后根據(jù)輸入進(jìn)行輸出。 狹義上說,狀態(tài)機(jī)不是指隨隨便便的一個程序, 而是指某一類程序, 也就是狀態(tài)機(jī)編程程序。
FSM
簡單講就是將行為分為一個一個的狀態(tài),狀態(tài)與狀態(tài)之間的過渡通過事件的觸發(fā)來形成。比如士兵的行為有“巡邏”,“追擊敵人”,“攻擊敵人”,“逃跑”等行為,響應(yīng)的事件就有“發(fā)現(xiàn)敵人”,“追到敵人”,“敵人逃跑”,“敵人死亡”,“自己血量不足”等。那么可以寫成這樣一個狀態(tài)機(jī):
1.士兵 “巡邏”,如果 “發(fā)現(xiàn)敵人”,那么,“追擊敵人”
2.士兵 “追擊敵人”, 如果 “追到敵人”, 那么,“攻擊敵人”
3.士兵 “追擊敵人”, 如果 “敵人死亡”, 那么,繼續(xù) “巡邏”
4.士兵 “攻擊敵人”, 如果 “敵人死亡”, 那么,繼續(xù) “巡邏”
5.士兵 “攻擊敵人”, 如果 “血量不足”, 那么,“逃跑”
其中,士兵就是這個FSM的執(zhí)行者,紅色的就是狀態(tài),藍(lán)色的就是事件,整個狀態(tài)機(jī)的行為可以總結(jié)為:當(dāng)前狀態(tài)=>是否滿足條件1,如果是,則跳轉(zhuǎn)到對應(yīng)狀態(tài),否則=>是否滿足條件2,如果是,則跳轉(zhuǎn)到對應(yīng)狀態(tài)。
由此可看出,狀態(tài)機(jī)是一種“事件觸發(fā)型”行為,就是只有事件的觸發(fā)才會發(fā)生引起狀態(tài)的變化。
HSM
簡單來說,就是FSM當(dāng)狀態(tài)太多的時候,不好維護(hù),于是將狀態(tài)分類,抽離出來,將同類型的狀態(tài)做為一個狀態(tài)機(jī),然后再做一個大的狀態(tài)機(jī),來維護(hù)這些子狀態(tài)機(jī)。
舉個決策小狗行為的例子:我們對小狗定義了有很多行為,比如跑,吃飯,睡覺,咆哮,撒嬌,搖尾巴等等,如果每個行為都是一個狀態(tài),用常規(guī)狀態(tài)機(jī)的話,我們就需要在這些狀態(tài)間定義跳轉(zhuǎn),比如在“跑”的狀態(tài)下,如果累了,那就跳轉(zhuǎn)到“睡覺”狀態(tài),再如,在“撒嬌”的狀態(tài)下,如果感到有威脅,那就跳轉(zhuǎn)到“咆哮”的狀態(tài)等等,我們會考量每一個狀態(tài)間的關(guān)系,定義所有的跳轉(zhuǎn)鏈接,建立這樣一個狀態(tài)機(jī)。如果用層次化的狀態(tài)機(jī)的話,我們就先會把這些行為“分類”,把幾個小狀態(tài)歸并到一個狀態(tài)里,然后再定義高層狀態(tài)和高層狀態(tài)中內(nèi)部小狀態(tài)的跳轉(zhuǎn)鏈接。
其實層次化狀態(tài)機(jī)從某種程度上,就是限制了狀態(tài)機(jī)的跳轉(zhuǎn),而且狀態(tài)內(nèi)的狀態(tài)是不需要關(guān)心外部狀態(tài)的跳轉(zhuǎn)的,這樣也做到了無關(guān)狀態(tài)間的隔離,比如對于小狗來說,我們可以把小狗的狀態(tài)先定義為疲勞,開心,憤怒,然后這些狀態(tài)里再定義小狀態(tài),比如在開心的狀態(tài)中,有撒橋,搖尾巴等小狀態(tài),這樣我們在外部只需要關(guān)心三個狀態(tài)的跳轉(zhuǎn)(疲勞,開心,憤怒),在每個狀態(tài)的內(nèi)部只需要關(guān)心自己的小狀態(tài)的跳轉(zhuǎn)就可以了。這樣就大大的降低了狀態(tài)機(jī)的復(fù)雜度,另外,如果覺得兩層的狀態(tài)機(jī)還是狀態(tài)太多的話,可以定義更多的狀態(tài)層次以降低跳轉(zhuǎn)鏈接數(shù)。
QP就是一個面向MCU,面向并發(fā)的層次式狀態(tài)機(jī)模型。有人稱量子平臺QP(Quantum Programming)叫作量子編程(Quantum Programming),也叫狀態(tài)機(jī)編程。
參考文獻(xiàn)
http://www.cnblogs.com/jeason1997/p/5140201.html
總結(jié)
以上是生活随笔為你收集整理的有限状态机FSM和层次状态机HSM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在Windows、Linux中获取主
- 下一篇: 【搬运】Wget 命令详解