有限状态机的应用
程序员文章站
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)改为查表,执行当前状态对应的回调函数。
这只是简单的状态机处理流程,复杂情况下各状态还会互相切换;对应这种状态机逻辑处理,务必先整理流程图,理清状态切换关系,胸有成竹了再开始编码,否则后续查找问题会花费更多时间。关键位置添加注释,造福后来接盘者。
更多开发技巧,请关注微信公众号