程序设计之有限状态机_第1页
程序设计之有限状态机_第2页
程序设计之有限状态机_第3页
程序设计之有限状态机_第4页
程序设计之有限状态机_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计之有限状态机程序设计之有限状态机状态机?以前听说过,忘了是老师说的,还是老大说得了。当时的认识也就是字面的意思,无非是和状态以及状态转换有关系。也许在写过或者读过的一些代码中有遇到过有限状态机的程序,但是当时是一定没有想到这就是状态机吧。最近在学习一些东西的时候竟然多次遇到,觉得还是有必要写点关于程序设计中有限状态机的东西。,这里是一篇对状态机从定义到实现都有很好解释的文章,摘录部分如下:***************************************************************************************依据状态之间是否有包含关系,分以下两种(1)常规状态机。状态机中的所有状态是不相交的、互斥的。(2)层次状态机。状态机中的状态之间要么是互斥的,要么是真包含的,可以用树性结构来描述这些状态集,包含其它状态的状态称为枝节点,不包含其它状态的状态称为叶节点,为方便单树描述,总是设计一个状态包含所有的状态节点,称为根节点。状态机的状态只能停留在叶节点,而不能停留在枝节点,每个枝节点需要指定一个子节点为它的默认子节点,以便状态机进入枝节点的时候能够停留到叶节点。一般都用switch/caseif/else方式实现。在少量状态(3个及其以下)的时候,不需要引入专门的状态机模块。常规状态机模块实现涉及到的结构由上而下为:顶层结构是状态机:当前状态id,缺省操作,状态表,状态表:状态数组状态结构:状态id,状态名,进入操作,退出操作,缺省操作,状态事件表(数组)状态事件结构:操作,事件,下一状态的id***************************************************************************************从代码易读及美观角度来说,建议用switch/case来实现。从经验来看,在一些稍大的程序设计中一般都会有状态机的实现,特别是在分层实现,协议栈实现,编解码方面。下面通过一个简单的例子来看下。这个例子是zigbee精简协议栈实现中的【这里只讲APS层的有限状态机,这是开放源代码的,对于该协议总体上是分层来实现的,每一次层都有状态机来进行实际的数据业务处理】。(1)定义各状态typedefenum_APS_STATE_ENUM{APS_STATE_IDLE,APS_STATE_COMMAND_START,APS_STATE_GENERIC_TX_WAIT,APS_STATE_NWK_PASSTHRU_WAIT,APS_STATE_INDIRECT_GETDST,APS_STATE_INDIRECT_TX,#ifdefLRWPAN_COORDINATORAPS_STATE_INJECT_INDIRECT,#endifAPS_STATE_ACK_SEND_START,APS_STATE_INDIRECT_TX_WAIT,APS_STATE_INJECT_LOOPBACK,APS_STATE_INDIRECT_LOOPBACK}APS_STATE_ENUM;(2)设计有限状态机函数voidapsFSM(void){apsFSM_start://状态机入口switch(apsState)//全局变量,指示当前状态{caseAPS_STATE_IDLE:if(aps_pib.flags.bits.ackSendPending){apsState=APS_STATE_ACK_SEND_START;//状态转换gotoapsFSM_start;}break;caseAPS_STATE_ACK_SEND_START:if(phyTxLocked()){break;}//sendanACK//locktheTXbufferphyGrabTxLock();//wearenowreadyapsFormatAck();phy_pib.currentTxFlen=0;

//setframelengthtozero,buildfromscratchapsTxData(TRUE);//datasent,releasetheRXbuffer,willletRXFSMresumeaps_pib.flags.bits.ackSendPending=0;apsState=APS_STATE_GENERIC_TX_WAIT;break;caseAPS_STATE_GENERIC_TX_WAIT:if(!apsTXIdle()){break;}//TXisfinished,copystatusa_aps_service.status=apsTxFSM_status;//releasetheTXbufferlockbeforeexiting.phyReleaseTxLock();apsState=APS_STATE_IDLE;if(aps_pib.flags.bits.indirectPending){//haveusedthisstatetowaitforfinishingsendingan//ACKbacktothesourceofanindirecttransmit.Now//finishresolvingtheindirectgotoapsFSM_start;}break;caseAPS_STATE_NWK_PASSTHRU_WAIT://forsplit-phasepassthrusif(nwkBusy()){break;}a_aps_service.status=a_nwk_service.status;apsState=APS_STATE_IDLE;break;caseAPS_STATE_INJECT_LOOPBACK://waitforRXtobecomeidleif(apsRxState!=APS_RXSTATE_IDLE){break;}//injectpacketintoRXFSMapsInjectPacket(FALSE);aps_pib.flags.bits.IsUsrBufferFree=1;apsState=APS_STATE_IDLE;gotoapsFSM_start;default:break;}}(3)大致结构:状态机入口,状态转换,状态机退出从这个函数实现,我们可以简单了解有限状态机的实现过程。当程序的实现有多个状态的时候,也就是要根据不同的状态做不同的事情的时候,可以考虑把某个操作过程拆分为几个步骤【很多时候这是必须的】,对应状态机操作的几个不同状态。多数情况下,这些

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论