状态机可常用于一些互斥功能中,总结一下要点
状态机有三个要素点;状态,事件,动作。可以根据此三要素定义结构体,
typedef union Status
{
u8 data[6]; //联合体便于一次清零操作
struct
{
u8 NowSta; //当前处于何种状态之下
u8 Event; //什么样的事件触发
void *pFun; //触发事件发生后执行什么动作
};
}ST;
状态机就是在当前状态下,判断事件是否发生,不发生则维持当前状态,发生则执行对应的动作,然后将状态转换,这样所执行的动作有且只有一次,不会反复。一般的函数大致是这样的
switch(ST.NowSta)
{
case 1:
{
if(Event) //事件发生了
{
pFun; //执行对应的动作
}
}break;
case 2:
{
同1;
}break;
default:
{
ST.NowSta = 1; //给一个默认的状态,防止状态机跳出界外
}
}