欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

有限状态机的应用

程序员文章站 2024-03-19 18:56:58
...

状态机应用,一般是软件控制某个外设,该外设存在较多的状态或者某个业务功能有多个执行步骤,软件实现过程存在多个状态节点,一般来说叫有限状态机,简写为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)改为查表,执行当前状态对应的回调函数。

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

更多开发技巧,请关注微信公众号
有限状态机的应用

相关标签: 嵌入式