狀態機有4個要素:
舉例:
state1是現態,state2是次態,event是條件,action是動作。當產生event時,觸發action,action執行完畢後從state1遷移到state2,此時,state2為現態。
在這個例子中,action只是乙個瞬時執行的動作,它只在現態遷移到次態的過程中執行,當遷移完成後,action不再執行。
對以上狀態機模型進行改進:
state1是現態,state2是次態,event是條件,動作分為entry、do、exit三步,而且state1和state2都有動作entry、do、exit(注意:state1中的entry、do、exit和state2中的entry、do、exit不是同乙個東西,可以將state1理解為乙個結構體變數,而entry、do、exit是結構體的元素)。假設現在沒有觸發條件event,現態state1持續執行do動作(注意:持續執行的意思不止執行一次),直到觸發條件event產生,此時state1不再執行do動作,而是執行exit動作,執行完後執行state2中的entry動作,並將現態更新為state2,state2持續執行do動作。
改進後的狀態機模型有很多好處,舉個例子:如在state1這個狀態下對計數器count進行計數,使用改進後的狀態機模式可以這樣做:
(1)在state1的entry裡面對count進行初始化
(2)在state1的do裡面對count進行計數
(3)在state1的exit裡面對count進行復位
假設有狀態機流程圖如圖:
定義列舉型別state_t表示狀態機狀態:
typedef
enum
state_t;
定義action_map_t結構體型別,表示狀態機狀態屬性:
typedef
void
(*state_action)
(void
);
typedef
struct action_map
action_map_t;
建立「動作」表:
void
state1_entry
(void
)void
state1_do
(void
)void
state1_exit
(void
)void
state2_entry
(void
)void
state2_do
(void
)void
state2_exit
(void
)void
state3_entry
(void
)void
state3_do
(void
)void
state3_exit
(void
)void
state4_entry
(void
)void
state4_do
(void
)void
state4_exit
(void
)
action_map_t actionmap=
,,,,
};
定義列舉型別event_t表示事件:
typedef
enum
event_t;
注:定義event_map_end的目的是為了方便查表。
定義event_map_t結構體型別,表示事件表屬性:
typedef
struct event_map
event_map_t;
根據狀態機流程圖建立事件表:
event_map_t eventmap=
,,,,
,,};
定義狀態機結構體型別:
typedef
struct fsm
fsm_t;
定義狀態機註冊函式:
void
fsm_init
(fsm_t* pfsm,event_map_t* peventmap,action_map_t *pactionmap)
定義狀態機轉換函式:
void
fsm_state_transfer
(fsm_t* pfsm, event_t steventid)
}}
定義動作執行函式:
void
action_perfrom
(fsm_t* pfsm)
else
}
測試:
int
main
(void)if
(0==(i%31)
)if(0
==(i%74)
)if(0
==(i%13)
)if(0
==(i%19)
)}return0;
}
C語言實現有限狀態機
在實際工作中,經常遇到狀態機的應用,尤其在網路協議部分,最為經典的就是tcp協議的狀態機 實際上,很多網路協議都是有工作狀態的,不同階段所處不同的狀態,例如dhcp協議,路由協議,sip協議等等。這些協議在實現的時候多多少少會用到狀態機的原理,可能在實現上有較大的差別。我原來只是聽說過有這個原理,但...
基於C語言的狀態機實現技術
一 簡介 有限狀態機是一種用來進行物件行為建模的工具,其作用主要是描述物件在它的生命週期內所經歷的狀態序列,以及如何響應來自外界的各種事件。有限狀態機 finite state machine或者finite state automata 是軟體領域中一種重要的工具,很多東西的模型實際上就是有限狀態...
C語言 狀態機程式設計
狀態機原理 有限狀態機的工作原理如圖1所示,發生事件 event 後,根據當前狀態 cur state 決定執行的動作 action 並設定下乙個狀態號 nxt state fsm的實現方式 1 switch case或者if else 這無意是最直觀的方式,使用一堆條件判斷,會程式設計的人都可以做...