你的位置:首页 > 软件开发 > ASP.net > 状态机的两种写法

状态机的两种写法

发布时间:2015-10-24 03:00:12
1.概念  有限状态机FSM思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软件上称为FMM有限消息机)。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状态机具有有限个状态,所以可以在实际 ...

1.概念

  有限状态机FSM思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软件上称为FMM有限消息机)。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。

2.图解

  有限状态机的工作原理如图1所示,发生事件(event)后,根据当前状态(cur_state) ,决定执行的动作(action),并设置下一个状态号(nxt_state)。

状态机的两种写法

状态机的两种写法

  图2为一个状态机实例的状态转移图,它的含义是:

  • 在s0状态,如果发生e0事件,那么就执行a0动作,并保持状态不变;
  • 如果发生e1事件,那么就执行a1动作,并将状态转移到s1态;
  • 如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;
  • 在s1状态,如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;
  • 在s2状态,如果发生e0事件,那么就执行a0动作,并将状态转移到s0态。

  有限状态机不仅能够用状态转移图表示,还可以用二维的表格代表。一般将当前状态号写在横行上,将事件写在纵列上,如表1所示。其中“--”表示空(不执行动作,也不进行状态转移),“an/sn”表示执行动作an,同时将下一状态设置为sn。表1和图2表示的含义是完全相同的。

  观察表1可知,状态机可以用两种方法实现:竖着写(在状态中判断事件)和横着写(在事件中判断状态)。这两种实现在本质上是完全等效的,但在实际操作中,效果却截然不同。

3.代码实现

3.1 竖着写(在状态中判断事件)C代码片段:

状态机的两种写法状态机的两种写法
 1 cur_state = nxt_state;   2 switch(cur_state) //在当前状态中判断事件 3 {       4   case s0: //在s0状态   5     if(e0_event) //如果发生e0事件,那么就执行a0动作,并保持状态不变; 6     {   7       //执行a0动作;         8       //nxt_state = s0; //因为状态号是自身,所以可以删除此句,以提高运行速度。 9     } 10     else if(e1_event) //如果发生e1事件,那么就执行a1动作,并将状态转移到s1态;11     {  12       //执行a1动作;13       nxt_state = s1;14     }      15     else if(e2_event) //如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;16     { 17       //执行a2动作;18       nxt_state = s2;19     }20     else21     {22       break;  23     }  24   case s1: //在s1状态25     if(e2_event) //如果发生e2事件,那么就执行a2动作,并将状态转移到s2态; 26     {        27       //执行a2动作;28       nxt_state = s2;29     }      30     else31     {32       break;33     }34   case s2: //在s2状态35     if(e0_event) //如果发生e0事件,那么就执行a0动作,并将状态转移到s0态;36     {37       //执行a0动作;        38       nxt_state = s0;39     }40 }

原标题:状态机的两种写法

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录