簡介資料:
有限狀態機(fsm)是表示有限個狀態及在這些狀態之間的轉移和動作等行為的數學模型,通常fsm包含幾個要素:狀態的管理、狀態的監控、狀態的觸發、狀態觸發後引發的動作。
1、數學語言描述如下:乙個有限狀態機m是乙個五元組,m=(k,e,t,s,z)。其中(1)k是乙個有窮集,其中的每個元素稱為狀態(2)e是乙個有窮字母表,它的每個元素稱為乙個輸入字元(3)t是轉換函式,是k×e->k上的對映(4)s是k中的元素,是唯一的乙個初態(5) z是k的乙個子集,是乙個終態集,或者叫結束集。
2、軟體設計領域中通用狀態機的輸入不是字符集,而是被稱作事件的結構(可以是結構體,也可以是類物件),並且特定的狀態下,針對發生的事件,不僅發生狀態改變,而且產生動作。借鑑編譯原理中狀態機的初始狀態和終態,通用狀態機的數學語言描述如下:乙個通用有限狀態機m是乙個七元組,m=。其中(1)k是乙個有窮集,其中的每個元素稱為狀態(2)e是乙個有窮集,它的每個元素稱為乙個事件(3)t是轉換函式,是k×e->k上的對映(4)m是乙個有窮集,它的每個元素稱為動作(5)f是動作對映函式,是k×e->m上的對映(6)s是k中的元素,是唯一的乙個初態(7) z是k的乙個子集,是乙個終態集,或者叫結束集。
curevent = getevent();
curstate = getcurstate();
switch(curstate)//什麼狀態
break;
}...
}
基於表結構的狀態機設計方法:建立相應的狀態表和動作查詢表,根據狀態表、事件、動作表定位相應的動作處理函式,執行完成後再進行狀態的切換。
通過設計乙個通用的基於表結構的狀態機模組,針對不同的狀態圖,我們只需要根據狀態圖得到其狀態表結構,然後通過fsm_regist註冊,就可以方便的使用了狀態機的功能了。這種機制便於我們新增新的狀態流程,並且可以很好的進行分層狀態機的設計。
/*狀態表註冊*/
void fsm_regist(fsm_t* pfsm,state_table_s* pstatetable)
/*狀態遷移*/
void fsm_movestate(fsm_t* pfsm,int state)
/*事件處理*/
void fsm_eventhandle(fsm_t* pfsm,int event)
event_table_t;
typedef struct
st_table_t;
typedef struct
fsm_stack_t;
typedef struct
fsm_regist_t;
typedef struct
fsm_t;
void fsm_pop(fsm_t *fsm);
void fsm_push(fsm_t *fsm);
void fsm_init(fsm_t *fsm);
void fsm_begin(fsm_t *fsm, int fsm_id);
int fsm_delete(fsm_t *fsm, int fsm_id);
void fsm_move_st(fsm_t *fsm, int state);
void fsm_event_handle(fsm_t *fsm, int event);
int fsm_regist(fsm_t *fsm, st_table_t *st_table, int fsm_id, int talbe_size);
#endif
完整**參考:
未完待續~~~
微控制器按鍵檢測,狀態機編寫
include include define key1 rb5 define key state 0 0 define key state 1 1 define key state 2 2 int key number 0 unsigned char read key void else key s...
狀態機思路在微控制器的程式實現
狀態機的概念 狀態機是軟體程式設計中的乙個重要概念。比這個概念更重要的是對它的靈活應用。在乙個思路清晰而且高效的程式中,必然有狀態機的身影浮現。比如說乙個按鍵命令解析程式,就可以被看做狀態機 本來在a狀態下,觸發乙個按鍵後切換到了b狀態 再觸發另乙個鍵後切換到c狀態,或者返回到a狀態。這就是最簡單的...
狀態機 狀態機0
近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...