「编程之美」用C语言实现状态机(超实用)

编程技巧 徐 自远 557℃

「编程之美」用C语言实现状态机(超实用)

「编程之美」用C语言实现状态机(超实用)

电子芯吧客 2020-06-04 17:54:58
关于状态机,基础的知识点可以自行理解,讲解的很多,这里主要是想写一个有限状态机FSM通用的写法,目的在于更好理解,移植,节省代码阅读与调试时间,体现出编程之美。
传统的实现方案
  • if…else : 搞一大堆if else, 一个函数写很长很长……
  • swich…case : 也搞一大堆一个函数写很长很长……

先来看看最近做的一个项目,无线通信协议实现的状态机是什么样子的:

有三种类型的事件:上层下达的命令事件;下层到达的标志和数据传输事件;超时定时器超时事件。有10种状态,关联性很大,复杂了吧,这要是各种if/else的要写到什么时候呢。

偷偷放一张讨论的图,乱七八糟形容很恰当。

在事件中判断状态,在状态中判断事件,横竖两种写法的代码都比较冗长,看起来呢也不大好,一旦增减,就又要动脑子重新梳理一遍,很累的。

怎么去写呢?其状态机原理:在根据当前状态(cur_state) 下,发生事件(event)后,转移到下一个状态号(nxt_state),决定执行的动作(action)。盗用一个图吧

这里我们首先定义一个结构体如下:

我们假设有3种状态,这里可以随意增加,状态枚举如下:

我们假设有5个事件,也可以随意增加,事件ID枚举如下:

将其封装起来在StateMachine中:

具体流程:当前状态-有事件触发-跳到下个状态-具体表现,重构代码

状态机实现如下:

最后我模拟一些随机事件,我们只需要弄清楚事件ID,状态切换,具体表现就可以了,在代码中就是填写stateTran[] 这个表,一旦有增减事件,状态等等,也不需要再去使用switch/case,特费脑,其代码如下:

最后运行结果如下

总结:

状态机应用很广泛,也可以锻炼我们写代码的逻辑思维,看清问题的本质,写的代码才能赏心悦目,希望大家能够多多指点,找到编程的乐趣,欣赏到编程之美。https://mp.weixin.qq.com/s/bI8Cjof3eO0_vHbzTwQRHQ

更多干货内容只需要你关注电子芯吧客微信公众号

声明:本文系网络转载,版权归原作者所有。

https://m.toutiaocdn.com/i6834428977860313607/?app=news_article&timestamp=1591312477&use_new_style=1&req_id=202006050714370100260790160C365E18&group_id=6834428977860313607&tt_from=android_share&utm_medium=toutiao_android&utm_campaign=client_share

转载请注明:徐自远的乱七八糟小站 » 「编程之美」用C语言实现状态机(超实用)

喜欢 (1)

苏ICP备18041234号-1 bei_an 苏公网安备 32021402001397号