状态机
一 传统的switch..case:
是状态嵌套事件还是事件嵌套状态,这是一个问题;按照发生概率的大小倒序安排case值顺序;GUN扩展支撑case x..y的写法(即范围在【x,y】之间);
二 指针函数法:
typedef enum{ ev_0, ev_1.....ev_max}ev_type_e;
typedef enum{ state_0, state_1.....state_max}state_e;
typedef state_e (*pFun_state)(ev_type_e_t ev)//内部继续对ev进行switch ..case.
pFun_stae state_tbl[]={state0_fun,state1_fun,state0_fun,};//指针函数表格或者
三 表格法:横轴状态(正整数),纵轴事件,内容为func_state_event()函数,每增一个状态,就需要增加一列【即增加NULL状态函数,还要避免二维数组越界时函数跑飞】。
事件:typedef struct{ev_type_e ev_type; int value }event_e即识别事件,也区分事件内容(譬如按键内容);状态函数的形参是void *类型,从而能接收event_e类型。
os下的并发:为保证状态改变的唯一,结合GNU扩展的内建函数解决原子化操作。