- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
状态机的两种写法
有限状态机FSM思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软件上称为FMM--有限消息机)。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。
有限状态机的工作原理如图1所示,发生事件(event)后,根据当前状态(cur_state),决定执行的动作
(action),并设置下一个状态号(nxt_state)。
| | 执行动作action
发生事件event |cur_state|
| | 设置下一状态号nxt_state
当前状态
图1有限状态机工作原理
e0/a0
-----
| |
------------------
e0/a0| | S0 |-----
| - |e1/a1
| |e2/a2 V
| S2 |----------| S1 |
e2/a2
图2一个有限状态机实例
当前状态 s0 s1 s2 |事件
a0/s0 -- a0/s0 |e0
a1/s1 -- -- |e1
a2/s2 a2/s2 -- |e2
表1图2状态机实例的二维表格表示(动作/下一状态)图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可知,状态机可以用两种方法实现:竖着写(在状态中判断事件)和横着写(在事件中判断状态)。这两种实现在本质上是完全等效的,但在实际操作中,效果却截然不同。
==================================
竖着写(在状态中判断事件)C代码片段
==================================
cur_state=nxt_state;
switch(cur_state){ //在当前状态中判断事件cases0: //在s0状态
if(e0_event){ //如果发生e0事件,那么就执行a0动作,并保持状态不变;
执行a0动作;
//nxt_state=s0; //因为状态号是自身,所以可以删除此句
,以提高运行速度。
}
elseif(e1_event){ //如果发生e1事件,那么就执行a1动作,并将状态转移到s1态;
执行a1动作;nxt_state=s1;
}
elseif(e2_event){ //如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;
执行a2动作;nxt_state=s2;
}
break;
cases1: //在s1状态
if(e2_event){ //如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;
执行a2动作;nxt_state=s2;
}
break;
cases2: //在s2状态
if(e0_event){ //如果发生e0事件,那么就执行a0动作,并将状态转移到s0态;
执行a0动作;nxt_state=s0;
}
}
==================================
横着写(在事件中判断状态)C代码片段
==================================
//e0事件发生时,执行的函数
voide0_event_function(int*nxt_state)
{
intcur_state;
cur_state=*nxt_state;switch(cur_state){
cases0: //观察表1,在e0事件发生时,s1处为空
cases2:
执行a0动作;
*nxt_state=
您可能关注的文档
- 紫苏叶的功效与作用.docx
- 子女不可溺爱也不可不爱.docx
- 子衿教学设计 .docx
- 子宫肌瘤手术方式及进展.docx
- 淄博市建设工程投标申请表.docx
- 资源配备计划方案模板.docx
- 资源教室教学活动记录.docx
- 资深编辑教你如何写出走心的文案.docx
- 资料幼儿园大班区域活动观察记录表.docx
- 资料核查记录.docx
- 文案sharpdesk v安装指南09installation guide.pdf
- 制仪表安装西.pdf
- 介绍lecture 2ielts task1pie chart 2讲座饼图.pdf
- 磁力阅读分级读物字数访问raz lpmagnetism clr.pdf
- 物理学名词中英文对照章波动光学.pdf
- t07b the art of attribution identifying and pursuing your cyber adversaries finalanf归因艺术识别你网络对手.pdf
- 段落12009真题完形填空.pdf
- 页右桥式输送机组件综合.pdf
- 课件品牌masport图库.pdf
- 项目中增入库操作核心部分.pdf
文档评论(0)