状态机在单片机程序设计中的应用.docx

上传人:夺命阿水 文档编号:1305815 上传时间:2024-06-05 格式:DOCX 页数:45 大小:82.35KB
返回 下载 相关 举报
状态机在单片机程序设计中的应用.docx_第1页
第1页 / 共45页
状态机在单片机程序设计中的应用.docx_第2页
第2页 / 共45页
状态机在单片机程序设计中的应用.docx_第3页
第3页 / 共45页
状态机在单片机程序设计中的应用.docx_第4页
第4页 / 共45页
状态机在单片机程序设计中的应用.docx_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《状态机在单片机程序设计中的应用.docx》由会员分享,可在线阅读,更多相关《状态机在单片机程序设计中的应用.docx(45页珍藏版)》请在课桌文档上搜索。

1、状态机思路在单片机程序设计中的应用状态机的概念状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。比方说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。进一步看,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它

2、是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。当我们翻开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。程序其实就是状态机。也许你还不理解上面这句话。请想想看,计算机的大厦不就是建立在“0”和“1”两个根本状态的地基之上么?状态机的要素状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出

3、于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:现态:是指当前所处的状态。条件:又称为“事件当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。次态:条件满足后要迁往的新状态。次态是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。如果我们进一步归纳,把“现态”和“次态”统一起来,而把“动作”忽略(降格处理),那么只剩下两个最关键的要素,BP:状态、迁移条件。状态机的表示方法

4、有许多种,我们可以用文字、图形或表格的形式来表示一个状态机。纯粹用文字描述是很低效的,所以就不介绍了。接下来先介绍图形的方式。状态迁移图(STD)状态迁移图(STD),是一种描述系统的状态、以及相互转化关系的图形方式。状态迁移图的画法有许多种,不过一般都大同小异。我们结合一个例子来说明一下它的画法,如图1所示。图1状态迁移图状态框:用方框表示状态,包括所谓的“现态”和“次态条件及迁移箭头:用箭头表示状态迁移的方向,并在该箭头上标注触发条件。节点圆圈:当多个箭头指向一个状态时,可以用节点符号(小圆圈)连接汇总。动作框:用椭圆框表示。附加条件判断框:用六角菱形框表示。状态迁移图和我们常见的流程图相

5、比有着本质的区别,具体表达为:在流程图中,箭头代表了程序PC指针的跳转;而在状态迁移图中,箭头代表的是状态的改变。我们会发现,这种状态迁移图比普通程序流程图更简练、直观、易懂。这正是我们需要到达的目的。状态迁移表除了状态迁移图,我们还可以用表格的形式来表示状态之间的关系。这种表一般称为状态迁移表。表1就是前面介绍的那张状态迁移图的另一种描述形式。表1状态迁移表采用表格方式来描述状态机,优点是可容纳更多的文字信息。例如,我们不但可以在状态迁移表中描述状态的迁移关系,还可以把每个状态的特征描述也包含在内。如果表格内容较多,过于臃肿不利于阅读,我们也可以将状态迁移表进行拆分。经过拆分后的表格根据其具

6、体内容,表格名称也有所变化。比方,我们可以把状态特征和迁移关系分开列表。被单独拆分出来的描述状态特征的表格,也可以称为“状态真值表0这其中比拟常见的就是把每个状态的显示内容单独列表。这种描述每个状态显示内容的表称之为“显示真值表同样,我们把单独表述基于按键的状态迁移表称为“按键功能真值表”。另外,如果每一个状态包含的信息量过多,我们也可以把每个状态单独列表。由此可见,状态迁移表作为状态迁移图的有益补充,它的表现形式是灵活的。状态迁移表优点是信息涵盖面大,缺点是视觉上不够直观,因此它并不能取代状态迁移图。比拟理想的是将图形和表格结合应用。用图形展现宏观,用表格说明细节。二者互为参照,相得益彰。用

7、状态机思路实现一个时钟程序接下来,我将就状态机的应用,结合流程图、状态迁移图和状态迁移,举一个实际例子。下面这张图是一个时钟程序的状态迁移图,如图2所示。图2时钟程序状态迁移图把这张图稍做归纳,就可以得到它的另一种表现形式状态迁移表,如表2所示。表2时钟程序状态迁移表状态机应用的考前须知基于状态机的程序调度机制,其应用的难点并不在于对状态机概念的理解,而在于对系统工作状态的合理划分。初学者往往会把某个“程序动作”当作是一种“状态”来处理。我称之为“伪态”。那么如何区分“动作”和“状态,本匠人的心得是看二者的本质:“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是

8、相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。初学者的另一种比拟致命的错误,就是在状态划分时漏掉一些状态。我称之为“漏态”。“伪态”和“漏态”这两种错误的存在,将会导致程序结构的松散。因此要特别小心防止。更复杂的状态机前面介绍的是一种简单的状态结构。它只有一级,并且只有一维,如图3所示。图3线性状态机结构如果有必要,我们可以建立更复杂的状态机模型。1多级状态结构状态机可以是多级的。在分层的多级状态机系统里面,一个“父状态”下可以划分多个“子状态”,这些子状态共同拥有上级父状态的某些共性,同时又各自拥有自己的一些个性。在某些状态下,还可以进一步划分子状态。比方,我们可以把前面的时钟

9、例子修改如下:把所有和时钟功能有关的状态,合并成1个一级状态。在这个状态下,又可以划分出3个二级子状态,分别为显示时间、设置小时、设置分钟;同样,我们也可以把所有和闹钟功能有关的状态,合并成1个一级状态。在这个状态下,再划分出4个二级子状态,分别为显示闹钟、设置“时”、设置“分”、设置鸣叫时间。我们需要用另一个状态变量(存放器)来表示这些子状态。子状态下面当然还可以有更低一级的孙状态(子子孙孙无穷尽也),从而将整个状态体系变成了树状多级状态结构,如图4所示。2多维状态结构状态结构也可以是多维的。从不同的角度对系统进行状态的划分,这些状态的某些特性是交叉的。比方,在按照按键和显示划分状态的同时,

10、又按照系统的工作进程做出另一种状态划分。这两种状态划分同时存在,相互交叉,从而构成了二维的状态结构空间。举一个这方面的例子,如:空调遥控器,如图5所示。图5多维状态机结构同样,我们也可以构建三维、四维甚至更多维的状态结构。每一维的状态都需要用一个状态变量(存放器)来表示。无论多级状态结构和多维状态结构看上去多么迷人,匠人的忠告是:我们依然要尽可能地简化状态结构,能用单级、单维的结构,就不要给自己找事,去玩那噩梦般的复杂结构。简单的才是最有效的。结束语对状态机的理解需要一个由浅入深的过程。这个过程应该是与实践应用和具体案例思考相结合的。当一种良好的思路成为设计的习惯,它就能给设计者带来回报。愿这

11、篇手记里介绍的基于状态机的编程思路能给新手们带来一些启迪,帮助大家找到“程序设计的感觉。【转载1有限状态机的实现有限状态机(FiniteStateMachine或者FiniteStateAUtOmata)是软件领域中一种重要的工具,很多东西的模型实际上就是有限状态机。最近看了一些游戏编程Al的材料,感觉游戏中的AL第一要说的就是有限状态机来实现精灵的AI,然后才是A*寻路,其他学术界讨论比拟多的神经网络、模糊控制等问题还不是很热。FSM的实现方式:1)switch/case或者if/else这无意是最直观的方式,使用一堆条件判断,会编程的人都可以做到,对简单小巧的状态机来说最适宜,但是毫无疑问

12、,这样的方式比拟原始,对庞大的状态机难以维护。2)状态表维护一个二维状态表,横坐标表示当前状态,纵坐标表示输入,表中一个元素存储下一个状态和对应的操作。这一招易于维护,但是运行时间和存储空间的代价较大。3)使用StatePattern使用StatePattern使得代码的维护比switch/case方式稍好,性能上也不会有很多的影响,但是也不是100%完美。不过RobertC.Martin做了两个自动产生FSM代码的工具,forjava和forC+各一个,在:ObjeCtmentOrresourcesindex上有免费下载,这个工具的输入是纯文本的状态机描述,自动产生符合StatePatter

13、n的代码,这样developer的工作只需要维护状态机的文本描述,每必要冒引入bug的风险去维护COdeO4)使用宏定义描述状态机一般来说,C+编程中应该防止使用#define,但是这主要是因为如果用宏来定义函数的话,很容易产生这样那样的问题,但是巧妙的使用,还是能够产生奇妙的效果。MFC就是使用宏定义来实现大的架构的。在实现FSM的时候,可以把一些繁琐无比的if/else还有花括号的组合放在宏中,这样,在代码中可以3)中状态机描述文本一样写,通过编译器的预编译处理产生1)一样的效果,我见过产生C代码的宏,如果要产生C+代码,己软MFC可以,那么理论上也是可行的。【评】:状态表的实现方法,C专

14、家编程第8章有具体说明,转载【6】传说中的分隔符【转载2】有限状态机的C实现2007-05-1115:12这儿以四位密码校验作为状态机的例子,连续输入2479就可以通过密码测试。一个非常简单的例子,在实际的状态机实例中,状态转移表要更彳复雄一些,不谩方式非常类期以。在状熊查前的地方可以做僵化,同畤封于输入量也可以做有效性侵化。具艘代码如下:viewplaincopytoclipboardprint?c.htypedefenumSTATEl=1,STATE2,STATE3,STATE4,STATE5,/passwordpass/.ADDhereSTATE;typedefenumINPUTl=,2

15、,INPUT2=,4,INPUT3=,7,INPUT4=,9,INPUT;typedefstruct(STATEcur_state;INPUTinput;STATEnext_state;)STATE_TRANS;c.htypedefenumSTATEl=1,STATE2,STATE3,STATE4,STATE5,/passwordpass/.ADDhereSTATE;typedefenumINPUTl=,2,INPUT2=,4,INPUT3=,7,INPUT4=,9,INPUT;typedefstruct(STATEcur_state;INPUTinput;STATEnext_state;ST

16、ATE_TRANS;#includeinclude,c.hnSTATE_TRANSstate_trans_arry=STATEl,INPUT1,STATE2,STATE2,INPUT2,STATE3,STATE3,INPUT3,STATE4,STATE4,INPUT4,STATE5,);#defineSTATE_TRANS_CNT(sizeof(state_trans_arry)/sizeof(state_trans_arry0)intmain()inti;charch;STATEstate_machine=STATEl;while(ch!=,e,)(ch=getchar();if(ch=,0

17、)&(ch=,9,)fordigitpasswordinputonly(for(i=0;iSTATE_TRANS_CNT;i+)(if(ch=state_trans_arryi.input)&(state_machinestate_trans_arryi.cur_state)(state_machine=state_trans_arryi.next_state;continue;elseif(i=(STATE_TRANS_CNT-l)notransfermatch,resetstate(state_machine=STATEl;)if(state_machine=STATE5)printf(n

18、Passwordcorrect,statetransfermachinepass!n);returnO;c.c#includeinclude”c.h”STATE_TRANSstate_trans_arry=(STATE1,INPUTl,STATE2,STATE2,INPUT2,STATE3,STATE3,INPUT3,STATE4,STATE4,INPUT4,STATE5,);STATE_TRANS_CNTdefine(sizeof(state_trans_arry)/sizeof(state_trans_arry0)intmain()inti;charch;STATEstate_machin

19、e=STATEl;while(ch!=,e,)ch=getchar();if(ch=0,)&(ch=,9,)fordigitpasswordinputonlyfor(i=0;iSTATE_TRANS_CNT;i+)(if(ch=state_trans_arryi.input)&(state_machine=state_trans_arryi.cur-state)(state_machine=state_trans_arryi.next_state;continue;)elseif(i=(STATE_TRANS_CNT-l)notransfermatch,resetstate(state_mac

20、hine=STATE);)if(state_machine=STATE5)printf(nPasswordcorrect,statetransfermachinepass!n);)return0;)【评】:在VC6下运行该程序并没有到达目的,即连续输入字符2479也没有任何输出信息,个人根据转载第一遍文章的FSM的实现的第一种方法,见【原创之源程序】传说中的分隔符【转载3】有限状态机自动机状态图一一一个图的数据结构!!.while+switch;2.状态机:就是指定系统的所有可能的状态及状态间跳转的条件,然后设一个初始状态输入给这台机器,机器就会自动运转,或最后处于终止状态,或在某一个状态不断

21、循环。游戏中状态切换是很频繁的。可能以前要切换状态就是ifelse,或者设标志,但这些都不太结构化,如果把它严格的设为一种标准的状态机,会清楚的多。比方控制一扇门的运动,初始时门是关的,当有力作用在门上时,门开始慢慢翻开,力的作用完后,门渐渐停止不动,当有反向的力时,门又渐渐关上,知道回到初始关的状态。这个你会怎么来编程实现呢。似乎很麻烦,确实,没有状态机的思想时会很烦,设很多标志,一堆if条件。用状态机的话,不只是代码更清晰,关键是更符合逻辑和自然规律,不同状态不同处理,满足条件那么跳转到相关状态。伪码如下:enumCLOSED,/关上状态CLOSING,/正在关状态OPENED,/翻开状态

22、OPENING,/正在开的状态doorState=CLOSED;/初始为关Update()switch(doorState)caseCLOSED:if(有人推门)doorState=OPENING;/跳转到正在开状态break;caseOPENING:door.Rotation+=DeltaAngle;/门的旋转量递增if(门的速度为零)/力的作用已去doorState=OPENED;/E先转到开状态break;caseOPENED:if(有人关门)doorState=CLOSING;break;caseCLOSING:door.Rotation-=DeltaAngle;/门的旋转量递减if(

23、门的旋转角度减为零)doorState=CLOSED;门已关上break;/而绘制代码几乎不用怎么变,门就是会严格按照状态机的指示去运动,该停就会停Render()(RotateView(door.Rotation);DrawDoor(door.Position);)enum(CLOSED,/关上状态CLOSING,/正在关状态OPENED,/翻开状态OPENING,/正在开的状态JdoorState=CLOSED;/初始为关Update()switch(doorState)caseCLOSED:if(有人推门)doorState=OPENING;/跳转到正在开状态break;caseOPEN

24、ING:door.Rotation+=DeltaAngle;/门的旋转量递增if(门的速度为零)/力的作用已去doorState=OPENED;/跳转到开状态break;caseOPENED:if(有人关门)doorState=CLOSING;break;caseCLOSING:door.Rotation-=DeltaAngle;/门的旋转量递减if(门的旋转角度减为零)doorState=CLOSED;/门已关上break;)/而绘制代码几乎不用怎么变,门就是会严格按照状态机的指示去运动,该停就会停Render()RotateView(door.Rotation);DrawDoor(door

25、.Position);)这是一个简单但很典型的例子,状态机的应用太多了。就说一个根本游戏的运转:(用到了一个状态然后还有子状态)UpdateGameOBEGIN;switch(gameState)case等待选择菜单:它有三个子状态。if(选择菜单项=开始)(游戏初始;gameState=开始游戏)if(选择菜单项=选项)gameState=设置if(选择菜单项=退出)gameState二退出case开始:游戏运行;if(用户按退出键)gameState=等待选择菜单;其他的状态跳转处理;case退出:释放资源;退出;case设置:分别处理不同的选项,跳转不同的子状态;case./其他状态的处

26、理END;UpdateGameOBEGIN;switch(gameState)case等待选择菜单:它有三个子状态。if(选择菜单项=开始)(游戏初始;gameState=开始游戏)if(选择菜单项=选项)gameState=设置if(选择菜单项=退出)gameState二退出case开始:游戏运行;if(用户按退出键)gameState=等待选择菜单;其他的状态跳转处理;case退出:释放资源;退出;case设置:分别处理不同的选项,跳转不同的子状态;case./其他状态的处理END;某一个状态可以包含更多的子状态,这样最好是同一层次的状态设为一个枚举,并分到另一个SWitCh处理如enum

27、STATESstate1,state2,state3);state2又包含假设干状态那么再定义enumSUBSTATE2substate21,substate22,substate23,;想很多根本的渲染效果,如淡入淡出,闪烁等等,用状态的思想会事半功倍,思路也更清晰。其实像OPengLDirect3D这样的渲染引擎本身就是状态机,当你设置渲染的状态,这台机器就保持这个状态进行渲染工作,如保持光照位置,保持片元颜色,直到你再次改变它的状态。状态机的应用实在太广,相关理论也很多,最近上课学的随机过程里也讲到一些,数字电路里的时序逻辑器件也是用状态机来描述。这些不必多说了。总之,用状态机的角度去看

28、待问题,往往能把比拟复杂的系统分解为能单独处理的众多子状态,处理也会得心应手。希望大家多用它,很好的东西。二、推荐这个:程序员杂志2004.8月刊_State模式和COmPoSite模式实现的状态机引擎个人感觉状态机的几个不同实现阶段:1、switch/case最原始的实现方式,是很多的C程序员习惯采用的方式。2、查找表状态、事件、动作,稍微做了一点改良。有点类似MFC的雏形。3、在以上根底上做的一些改良或者变体。比方用一个栈结构,激活的状态位于栈顶,自动的映射事件和动作的对应,再或者通过一些巧妙的宏等手段进行包装。但是线性结构在实际中使用比拟受限、过于技巧性的宏比拟难于理解4、面向对象的设计

29、下、灵活运用模式。如上面给出的链接。重用性和灵活性方面都有不错的表现。沿袭类似的设计思路、根据实际开发内容进行改造后利用。【评】:伪代码局部,可以帮助很好的理解【转载1】文章中表达的FSM的实现方法1;查找表状态、事件、动作,稍微做了一点改良。有点类似MFC的雏形类似于【转载1】文章中表达的FSM的实现方法2(状态表)传说中的分隔符转载4fsmimplementedinCcode(FSM状态机用C实现)用C语言实现一个状态机,很简单,和大家分享这是我做毕业设计时,用nRF24L01组建了一个简单的网络,做的一个小的状态机,网络中三个节点,开始拓扑为网状,后来为星型。#include#inclu

30、de#include/Finitestatemachinedeclaration/statedeclarationdefineIDLE0/idlestateinrxmode#defineM_BROADCAST1/broadcaststateintxmode,broadcasttobeamasterpoint#defineM_WAIT_BROADCAST_ACK2/waitforbroadcastackstateinrxmode,waitforthepointackinaspecifictimewindow#defineM_WAIT_COMMAND3/waitforcommandstate,wa

31、itforPCcommandviaUART#defineM_BROADCAST_CANCEL4/broadcastcancelstate,broadcasttocancelmasterpoint#defineS_BROADCAST_ACK5/slavemode,sendbackselfphysicaladdressdefineS_WAIT_COMMAND6/slavemode,waitforcommandfromthemasterpoint/statetransitiontrig/usedinmastermodeintisReqBeMaster=O;/IsPCrequestthepointto

32、bemaster?intisTimeout=O;/Istimeout?intisReqCancelMaster=O;/Isrequesttocancelmaster?/usedinslavemodeintIsRxBroadcast=O;/Isthereapointbroadcasttobemaster?intisRxBroadcastCancel=O;/Isreceivebroadcastcancelmaster?typedefstructfsmtag(intstate;/stateinttimeouttime;/timeouttimeinmillisecondsfsm;/functionpr

33、ototypeintmain()fsmf;f.state=IDLE;Etimeouttime=0;while(l)(switch(f.state)(caseIDLE:puts(IDLEnWaitforisReqBeMaster(1/0)isRxBroadcast(1/0):,);scanf(%d%dH,&isReqBeMaster,&isRxBroadcast);if(isReqBeMaster)(f.state=M_BROADCAST;break;)elseif(isRxBroadcast)(f.state=S_BROADCAST_ACK;break;elsebreak;caseM_BROA

34、DCAST:puts(M-BROADCASTnBroadcasting.n);f.state二M_WAIT_BROADCAST_ACK;caseM_WAIT_BROADCAST_ACK:puts(nM_WAIT_BROADCAST_ACKnWaitingforisTimeout(l/0):n);scanf(%d,&isTimeout);if(isTimeout)(f.state=M_WAIT_COMMAND;break;)elsebreak;caseM_WAIT_COMMAND:puts(HM_WAIT_COMMANDnWaitingforisReqCancelMaster(1/0):);sc

35、anf(%d,(feisReqCancelMaster);if(isReqCancelMaster)f.state=IDLE;break;)elsebreak;/SlavemoderoutinecaseS_BROADCAST_ACK:puts(nS_BROADCAST_ACKnAcking.nH);f.state=S_WAIT_COMMAND;break;caseS_WAIT_COMMAND:puts(nS_WAIT_COMMANDnWaitingforisRxBroadcastCancel(l0):);scanf(%d,&isRxBroadcastCancel);if(isRxBroadca

36、stCancel)(f.state=IDLE;break;)elsebreak;default:puts(,default);printf(,%dn,rand();f.state=IDLE;returnO;)#include#include#include/Finitestatemachinedeclaration/statedeclarationdefineIDLE0/idlestateinrxmode# defineM_BROADCAST1/broadcaststateintxmode,broadcasttobeamasterpointdefineM_WAIT_BROADCAST_ACK2

37、/waitforbroadcastackstateinrxmode,waitforthepointackinaspecifictimewindow# defineM_WAIT_COMMAND3/waitforcommandstate,waitforPCcommandviaUARTdefineM_BROADCAST_CANCEL4/broadcastcancelstate,broadcasttocancelmasterpoint# defineS_BROADCAST_ACK5/slavemode,sendbackselfphysicaladdress# defineS_WAIT_COMMAND6

38、/slavemode,waitforcommandfromthemasterpoint/usedinmastermodeintisReqBeMaster=O;/IsPCrequestthepointtobemaster?intisTimeout=O;/Istimeout?intisReqCancelMaster=O;/Isrequesttocancelmaster?/usedinslavemodeintisRxBroadcast=O;/Isthereapointbroadcasttobemaster?intisRxBroadcastCancel=O;/Isreceivebroadcastcan

39、celmaster?typedefstructfsmtag(intstate;/stateinttimeouttime;/timeouttimeinmillisecondsfsm;/functionprototypeintmain()(fsmf;f.state=IDLE;Etimeouttime=O;while(l)(switch(f.state)caseIDLE:puts(IDLEnWaitforisReqBeMaster(lO)isRxBroadcast(l/0):H);scanf(,%d%d,&isReqBeMaster,执行动作action发生事件eventcur_state|II设置

40、下一状态号nxt_state当前状态图1有限状态机工作原理eaeaIISO|-I-elalIIe2a2VIS2-ISlIe2a2图2一个有限状态机实例当前状态ssis2I事件as-asIeOal/sl-一Iela2s2a2s2-Ie2表1图2状态机实例的二维表格表示(动作/下一状态)图2为一个状态机实例的状态转移图,它的含义是:在SO状态,如果发生eO事件,那么就执行a动作,并保持状态不变;如果发生el事件,那么就执行al动作,并将状态转移到Sl态;如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;在Sl状态,如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;在s2状态,如果发生eO事件,那么就执行a动作,并将状态转移到SO态;有限状态机不仅能够用状态转移图表示,还可以用二维的表格代表。一般将当前状态号写在横行上,将事件写在纵列上,如表1所示。其中“-”表示空(不执行动作,也不进行状态转移),ansn表示执行动作an,同时将下一状态设置为sn。表1和图2表示的含义是完全相同的。观察表1可知,状态机可以用两种方法实现:竖

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号