?? readme.txt
字號:
有限狀態機(FSM)的簡單設計報告劉可嘉<donaldliew@gmail.com>Nov 24, 20051. 接口定義系統提供6個函數接口fsm_load,fsm_doevent, fsm_free, fsm_create, fsm_setstate和fsm_add。============================================================struct FSM *fsm_load(const unsigned char *filename, const struct func_table *funcv, int funcc);從指定的配置文件及字符串/函數指針對照表建立相應FSM對象。出錯時返回NULLfilename -- 配置文件名funcv -- 函數表數組funcc -- 函數表項數struct FSM -- 狀態機對象類型,具體實現用戶不可見struct func_table -- 字符串/函數指針對照表,定義如下struct func_table{ const unsigned char symbol[MAX_SYMBOL_LEN]; callback_ptr func;};其中callback_ptr是一個typedef,即回調函數指針類型:typedef void (*callback_ptr)(const unsigned char *resource);示例代碼:void play(const unsigned char *res){ //...}void hangup(const unsigned char *res){ //...}struct func_table table[]={ {"PLAY", play}, {"HANGUP", hangup}};void sys_init(){ struct FSM *fsm=fsm_load("fsm/ar.fsm", table, 2); // ...}============================================================int fsm_doevent(struct FSM *fsm, const unsigned char *event);產生事件event,系統自動完成回調函數的執行和狀態的遷移,成功返回0,出錯返回非零。fsm -- FSM對象指針event -- 事件描述字符串示例代碼:if(fsm_doevent(fsm, "1#") != 0){ printf("出錯啦~\n");}============================================================void fsm_free(struct FSM *fsm);釋放FSM對象所占用的資源。示例代碼:fsm_free(fsm);fsm=NULL; // 防止"野指針"============================================================struct FSM *fsm_create(const struct func_table *funcv, int funcv);創建空的FSM對象。說明:此函數僅供功能擴展之用。============================================================intfsm_add(const char *state, const char *event, const char *next, const char *func, const char *resource);手工添加一條狀態遷移規則。說明:此函數僅供功能擴展之用。============================================================voidfsm_setstate(struct FSM *fsm, const unsigned char *state);強制跳轉到指定狀態,不執行任何回調函數。============================================================2. 配置文件格式配置文件為一文本文件,不妨規定擴展名.fsm,以示區別文件格式規定如下:以'#'開頭的行為注釋行,加載時將被直接忽略空行(或只含空白字符--空格或'\t'字符--的行)將被直接忽略非注釋行各欄之間用任意多個空白字符隔開各欄不得超過MAX_SYMBOL_LEN個字符,不得包含空白字符無關緊要的欄可以寫作none,但不可以為空不區分大小寫第一個非注釋行格式為InitState StateName定義了初始狀態的名字以后每個非注釋行的格式均為State Event Next Func Resource分別定義一條狀態遷移規則3. 內部實現為提高效率,狀態遷移規則和函數對照表采用hash表存放,具體細節見程序注釋。4. 文件列表fsm.h 函數/數據結構聲明fsm.c 函數實現hash.h & hash.c 一個簡單的hash表實現sample.c 示例代碼sample.fsm 示例配置文件readme.txt 本文件Makefile 就是Makefile。。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -