有限状态机的实现

2019-04-13 11:39发布

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、两种方法的比较
比较这两种实现方法,各具特 {MOD},根据实际情况来。比如说在硬件设计中,基于状态查找事件更好;在HDLC中,基于事件查找状态写出来的代码可读性更好