还剩3页未读,继续阅读
文本内容:
程序设计之有限状态机程序设计之有限状态机状态机?以前听说过,忘了是老师说的,还是老大说得了当时的认识也就是字面的意思,无非是和状态以及状态转换有关系也许在写过或者读过的一些代码中有遇到过有限状态机的程序,但是当时是一定没有想到这就是状态机吧最近在学习一些东西的时候竟然多次遇到,觉得还是有必要写点关于程序设计中有限状态机的东西,这里是一篇对状态机从定义到实现都有很好解释的文章,摘录部分如下***************************************************************************************依据状态之间是否有包含关系,分以下两种1常规状态机状态机中的所有状态是不相交的、互斥的2层次状态机状态机中的状态之间要么是互斥的,要么是真包含的,可以用树性结构来描述这些状态集,包含其它状态的状态称为枝节点,不包含其它状态的状态称为叶节点,为方便单树描述,总是设计一个状态包含所有的状态节点,称为根节点状态机的状态只能停留在叶节点,而不能停留在枝节点,每个枝节点需要指定一个子节点为它的默认子节点,以便状态机进入枝节点的时候能够停留到叶节点一般都用switch/case if/else方式实现在少量状态3个及其以下的时候,不需要引入专门的状态机模块常规状态机模块实现涉及到的结构由上而下为顶层结构是状态机当前状态id,缺省操作,状态表,状态表状态数组状态结构状态id,状态名,进入操作,退出操作,缺省操作,状态事件表数组状态事件结构操作,事件,下一状态的id***************************************************************************************从代码易读及美观角度来说,建议用switch/case来实现从经验来看,在一些稍大的程序设计中一般都会有状态机的实现,特别是在分层实现,协议栈实现,编解码方面下面通过一个简单的例子来看下这个例子是zigbee精简协议栈实现中的【这里只讲APS层的有限状态机,这是开放源代码的,对于该协议总体上是分层来实现的,每一次层都有状态机来进行实际的数据业务处理】1定义各状态typedef enum_APS_STATE_ENUM APS STATE IDLE,APS_STATE_COMMAN D_START,APS_STATE_G ENERIC_TX_WAIT,ARS_STATE_NWK_PASSTHRU_WAIT APSZSTATEINDIRECT GETDST,APS STATEINDIRECT TX,#ifdefLRWPAN_COORDINATOR APS_STATEJNJECTJN DIRECT,#endifA PS_STAT E_AC K_S EN D_STA RT,APS_STATEJNDIRECT_TX_WAIT,APSSTATEINJECT LOOPBACK,APS STATEINDIRECTLOOPBACK}APS_STATE_ENUM;2设计有限状态机函数void apsFSMvoidapsFSM_sta rt:〃状态机入口switch apsState〃全局变量,指示当前状态case APS.STATEJDLE:if aps_pib.flags.bits.ackSendPending apsState=APS_STATE_ACK_SEND_START;〃状态转换goto apsFSM_start;break;case APS_STATE_ACK_SEN D_START:if phyTxLockedObreak;//send anACK//lock theTX bufferphyGrabTxLock;//we arenow readyapsFormatAck;phy_pib.currentTxFlen=0;//set framelength tozero,build fromscratchapsTxDataTRUE;//data sent,release theRX buffer,will letRX FSMresumeaps_pib.flags.bits.ackSendPending=0;apsState=APS_STATE_G ENERIC_TX_WAIT;break;case APS_STATE_GEN ERIC_TX_WAIT:if!apsTXIdlebreak;//TX isfinished,copy statusa_aps_service.status二apsTxFSM_status;//release theTX bufferlock beforeexiting.phyReleaseTxLock;apsState=APS_STATEJDLE;if aps.pib.flags.bits.indirectPending//have usedthis stateto wait for finishingsending an//ACK backtothe sourceof anindirect transmitNow//finish resolvingthe indirectgoto apsFSM_start;break;case APS_STATE_NWK_PASSTH RU_WAIT://for split-phase passthrusifnwkBusyObreak;a_aps_service.status=a_nwk_service.status;apsState=APS_STATEJDLE;break;case APS_STATEJNJECT_LOOPBACK://waitforRX tobecome idleifapsRxState!=APS_RXSTATEJDLEbreak;//inject packetinto RXFSMapsInjectPacketFALSE;aps_pib.flags.bits.IsUsrBufferFree=1;apsState=APS_STATEJDLE;gotoapsFSM_start;default:break;3大致结构状态机入口,状态转换,状态机退出从这个函数实现,我们可以简单了解有限状态机的实现过程当程序的实现有多个状态的时候,也就是要根据不同的状态做不同的事情的时候,可以考虑把某个操作过程拆分为几个步骤【很多时候这是必须的】,对应状态机操作的几个不同状态多数情况下,这些状态是多个操作可以共用的一般的状态机函数都会提供一个状态退出操作,每个状态操作可以根据条件来判断是要退出,还是要转换进行下一个状态的状态机是程序设计时的一种思想,尤如设计模式,只有在恰当的时候用来才回体现出其价值本文出自bluefish博客,请务必保留此出处。
个人认证
优秀文档
获得点赞 0