1、结缘状态机:
其实最早接触状态机还是在学习《模电》的时候,在硬件设计中,状态机是一个很常见的逻辑,今天在看HDLC协议时,发现也可以通过状态机来实现。
2、状态机的描述
状态 S0, S1, S2 事件
action0/S0 -- action0/S0 E0
action1/S1 -- -- E1
action2/S2 action2/S2 -- E2
在S0状态:
如果发生E0事件,那么就执行action0动作,并保持状态不变;
如果发生E1事件,那么就执行action1动作,并将状态转移到S1态;
如果发生E2事件,那么就执行action2动作,并将状态转移到S2态;
在S1状态:
如果发生E0事件,啥也不做;
如果发生E1事件,啥也不做;
如果发生E2事件,那么就执行action2动作,并将状态转移到S2态;
在S2状态:
如果发生E0事件,那么就执行action0动作,并将状态转移到S0态;;
如果发生E1事件,啥也不做;
如果发生E2事件,啥也不做。
3、状态机的两种实现方法:
(1)、基于事件查找状态;
(2)、基于状态查找事件
4、两种实现方法的伪码描述:
a、基于状态查找事件:
switch(nextstat)
{
case S0: // 按照上面的表翻译即可
if(E0)
{
action0;
nextstat = S0;
}
else if(E1)
{
action1;
nextstat = S1;
}
else if(E2)
{
action2;
nextstat = S2;
}
else
{
err;
}
break;
case STAT1: // 类同
break;
case STAT2: // 类同
break;
default:
nextstat = S0;
break;
}
b、基于事件查找状态:
void E0_FUNC( INT32* nextstat )
{
INT32 stat = 0;
stat = *nextstat;
switch( stat )
{
case S0:
case S2: // 执行状态转移和相应的action
{
action0;
*nextstat = S0;
}
break;
case S1: // 啥也不做
break;
default:
break;
}
}
void E1_FUNC( INT32* nextstat );
void E2_FUNC( INT32* nextstat );
5、两种方法的比较
比较这两种实现方法,各具特色,根据实际情况来。比如说在硬件设计中,基于状态查找事件更好;在HDLC中,基于事件查找状态写出来的代码可读性更好