全球快资讯丨用C语言实现状态机(实用篇)

时间:2023-04-04 12:15:42 来源: 面包芯语
关于状态机,基础的知识点可以自行理解。本文主要讲解的是一个有限状态机FSM通用的写法,目的在于更好理解,移植,节省代码阅读与调试时间,体现出编程之美。
传统的实现方案:

swich...case : 也搞一大堆一个函数写很长很长......

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

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


(资料图)

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

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

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

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

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

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

将其封装起来在StateMachine中:

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

状态机实现如下:

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

最后运行结果如下:

总结:

来源:技术让梦想更伟大

标签:

精彩推送

短讯!法尔胜3月28日盘中涨幅达5%

以下是法尔胜在北京时间3月28日14:09分盘口异动快照:3月28日,法尔胜盘中涨幅达5%,截至14点09分,报5...

来源:2023.03.28

水文监测显示“中华水塔”水源涵养能力在增强|世界实时

在第三十六届“中国水周”之际,记者走访青海省水文水资源测报中心了解到,作为“中华水塔”,青海省多...

来源:2023.03.28

最新资讯:浙商证券:给予博腾股份买入评级

浙商证券股份有限公司孙建近期对博腾股份进行研究并发布了研究报告《2022年报点评报告:能力建设加速,...

来源:2023.03.28

全球今头条!“暖城之邀”鄂尔多斯市走进浙江大学引才宣介会暨2023届毕业生专场招聘会举行

“暖城之邀”鄂尔多斯市走进浙江大学引才宣介会暨2023届毕业生专场招聘会举行

来源:2023.03.28

土耳其港口石油出口遇阻周一油价大涨

在伊拉克被迫停止半自治的库尔德斯坦地区的部分原油出口后,油价周一大涨,美、布两油日内均涨超4%,而...

来源:2023.03.28

华南前汛期开启首周暴雨强对流双面夹击,缘何今年汛期又提前?-环球热讯

继去年华南前汛期较常年提前到来后,今年华南前汛期再次提前。监测显示,截至3月26日,广东已经有48个国...

来源:2023.03.28

宝塔实业(000595):3月27日北向资金增持12.88万股 天天短讯

3月27日北向资金增持12 88万股宝塔实业。近5个交易日中,获北向资金减持的有2天,累计净减持2 92万股...

来源:2023.03.28

当前快报:在银行存款为什么会送礼品?工作人员不小心说漏了嘴,恍然大悟!

由于现在生活条件的不断改善,很多朋友们都有了一定的存款,这个时候为了确保存款的安全,一些人就会将...

来源:2023.03.28

【聚焦铜川】24小时自助服务,王益区优化20%商环境简审批环节-天天观速讯

近年来,王益区深入贯彻落实国家和省市全面深化“放管服”改革和优化营商环境各项决策部署,始终坚持把...

来源:2023.03.27

新闻快讯

X 关闭

X 关闭

新闻快讯