有限状态机的实现

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中,基于事件查找状态写出来的代码可读性更好

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值