C語言實現狀態機

2021-10-05 15:42:09 字數 2924 閱讀 3629

狀態機有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 這無意是最直觀的方式,使用一堆條件判斷,會程式設計的人都可以做...