之前写过一篇状态机的实用文章,很多朋友说有几个地方有点难度不易理解,今天给大家换种简单写法,使用函数指针的方法实现状态机。
状态机简介
有限状态机FSM是有限个状态及在这些状态之间的转移和动作等行为的数学模型,是一种逻辑单元内部的高效编程方法,可以根据不同状态或者消息类型进行相应的处理逻辑,使得程序逻辑清晰易懂。
函数指针实现FSM
使用函数指针实现FSM可以分为3个步骤
建立相应的状态表和动作查询表
根据状态表、事件、动作表定位相应的动作处理函数
执行完成后再进行状态的切换
代码实现步骤
定义状态数据的枚举类型
typedefenum{ state_1=1, state_2, state_3, state_4 }State;
定义事件的枚举类型
typedefenum{ event_1=1, event_2, event_3, event_4, event_5 }EventID;
定义状态表的数据类型
typedefstruct { intevent;//事件 intCurState;//当前状态 void(*eventActFun)();//函数指针 intNextState;//下一个状态 }StateTable;
定义处理函数及建立状态表
voidf121() { printf("thisisf121 "); } voidf221() { printf("thisisf221 "); } voidf321() { printf("thisisf321 "); } voidf122() { printf("thisisf122 "); } StateTablefTable[]= { //{到来的事件,当前的状态,将要要执行的函数,下一个状态} {event_1,state_1,f121,event_2}, {event_2,state_2,f221,event_3}, {event_3,state_3,f321,event_4}, {event_4,state_4,f122,event_1}, //addyourcodehere };
状态机类型,及状态机接口函数
/*状态机类型*/ typedefstruct{ intcurState;//当前状态 StateTable*stateTable;//状态表 intsize;//表的项数 }fsmType; /*状态机注册,给它一个状态表*/ voidfsmRegist(fsmType*pFsm,StateTable*pTable) { pFsm->stateTable=pTable; } /*状态迁移*/ voidfsmStateTransfer(fsmType*pFsm,intstate) { pFsm->curState=state; } /*事件处理*/ voidfsmEventHandle(fsmType*pFsm,intevent) { StateTable*pActTable=pFsm->stateTable; void(*eventActFun)()=NULL;//函数指针初始化为空 intNextState; intCurState=pFsm->curState; intmaxNum=pFsm->size; intflag=0;//标识是否满足条件 /*获取当前动作函数*/ for(inti=0;i
附代码
代码直接复制过去就行啦,本想打包的,太麻烦了。
测试程序
//编译器:http://www.dooccn.com/cpp/ //来源:技术让梦想更伟大 //作者:李肖遥 #include
编译结果
总结
使用函数指针实现的FSM的过程还是比较费时费力的,但是这一切相对一大堆的if/else、switch/case来说都是值得的,当你的程序规模变得越来越大的时候,基于这种表结构的状态机,维护程序起来会清晰很多。
原文标题:【编程之美】函数指针方法实现简单状态机(附代码)
文章出处:【微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。
责任编辑:haq
-
编程
+关注
关注
88文章
3623浏览量
93797 -
函数
+关注
关注
3文章
4333浏览量
62721 -
指针
+关注
关注
1文章
480浏览量
70580
原文标题:【编程之美】函数指针方法实现简单状态机(附代码)
文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论