有限状态机的应用

状态机应用,一般是软件控制某个外设,该外设存在较多的状态或者某个业务功能有多个执行步骤,软件实现过程存在多个状态节点,一般来说叫有限状态机,简写为FSM(Finite State Machine)。

处理这类问题,可以根据状态或者节点定义枚举值,命名务必可以表示其含义。软件主体采用switch-case结构或者查表法,当新的输入条件产生进入处理函数,先查当前状态,再结合逻辑进入新的状态。

例如与某个外设通信,有甲乙丙丁四个状态,其中正常情况下按甲-乙-丙这样的顺序执行,丙为正常结束,丁为异常结束。即使相同的输入,因为当前所处状态不同,导致下个状态也不同。

fsm=void fun(input)
{    
  switch(fsm)    
  {        
    case:            
    if(error)            
    {                
      fsm=}            
    else            
    {                
      fsm=//异常结束            
    } 
    break;
    
    case:            
    if(error)            
    { 
      fsm=//异常结束            
    }           
    else            
    {
      fsm=//正常结束           
    }       
    break;
    default:      
    break;   
  }
}

这种方式容易阅读理解,但是扩展性差,每次状态变更需要修改同一个函数容易冲突,而且导致函数功能庞大,状态比较多时可以使用查表法改进。建立状态与回调函数表,扩展时在表里新增状态栏。

typedef struct
{    
    状态;
    回调函数;
 }table;
 
table[3]={, callback1,, callback2,, callback3
}

则void fun(input)改为查表,执行当前状态对应的回调函数。

这只是简单的状态机处理流程,复杂情况下各状态还会互相切换;对应这种状态机逻辑处理,务必先整理流程图,理清状态切换关系,胸有成竹了再开始编码,否则后续查找问题会花费更多时间。关键位置添加注释,造福后来接盘者。

更多开发技巧,请关注微信公众号
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值