STM32开发 -- 状态机与状态切换逻辑
参看:有限状态机的两种写法
参看:设计模式:一目了然的状态机图
假设状态机的状态转换由下表所示:
简单讲一下状态转换过程:当处于State0时发生event0 则执行action0并将状态变成state1,当state1状态下发生event2则执行action6并将状态变成state2。以此类推。
下面描述下实现上述状态机的两种不同的写法:
1)竖着写:在状态中判断事件,并执行相应的操作,完成相应的状态转换。
2)横着写:在事件中根据当前的状态,执行相应的操作,完成相应的状态转换。
两种写法的实现C代码:
//竖着写
switch(cur_state)
{case State0:if(event1){action0;cur_state = State1;}else if(event2){action4;cur_state = State1;}else if(event3){action5;cur_state = State2;}break;case State1:if(event1){action1;cur_state = State2;}else if(event3){action6;cur_state = State0;}break;case State2:if(event1){action3;cur_state = State0;}break;default:break;
}
//横着写
void event0func(void)
{switch(cur_state){case State0:action0;cur_state = State1;break;case State1:action1;cur_state = State2;break;case State2:action1;cur_state = State0;break;default:break;}
}void event1func(void)
{switch(cur_state){case State0:action4;cur_state = State1;break;default:break;}
}void event2func(void)
{switch(cur_state){case State0:action5;cur_state = State2;break;case State1:action6;cur_state = State0;break;default:break;}
}
上述两种写法实现的功能完全相同,对比两种写法:
1)写法1(竖着写)使用了if -else if语句隐含了优先级,破坏可事件间的原有关系(各个时间应该同优先级)
2)写法1(竖着写)在结构上是顺序查询方式(查询事件),浪费大量的时间,而且时间不可估算。
写法2(横着写)因为在某个时间点上状态是唯一确定的,在时间处理函数中通过switch语句可直接定位到相同状态,执行时间也可以估算。
3)写法2(横着写)比较直观,程序执行效率较高。
总体来说:写法2要优于写法1。
未完待续~~
STM32开发 -- 状态机与状态切换逻辑相关推荐
- ModelCoder状态机中的State逻辑
ModelCoder可以进行状态机的搭建以及仿真,其支持的状态机是通过在Mealy和Moore有限状态机的基础上进行扩展来实现的.本文主要讲解状态机中状态(State)的部分逻辑. 状态机中的状态(S ...
- 【低功耗蓝牙】② 蓝牙状态切换和事件处理
摘要 本文章基于ESP32芯片MicroPython代码,主要介绍低功耗蓝牙的状态机和状态切换机制,以及蓝牙的事件处理,是同学们理解后面内容的基础. 蓝牙状态机 蓝牙链路层的状态机有五种状态,分别是就 ...
- 用状态机做人物(AI)的状态切换以及动画效果——人物动画以及切换
github: https://github.com/lucaschen1993/PRG_DEMO 前言 在之前写状态机文章的时候介绍过,基于事件与委托实现的状态机.这篇文章将介绍状态机的使用,以及人 ...
- (五十三) Android O wifi 状态机消息处理及状态切换流程分析-以WifiController为例
前言:最近写了几篇wifi状态机相关的博客,但是状态转换方面一直是囫囵吞枣,感觉代码对的上流程就开始梳理了,没有真正关注过状态切换和消息处理流程,现在梳理一下. 1. wifi 状态机消息处理及状态切 ...
- JSD-2204-(业务逻辑开发)-更新订单状态的功能-搜索功能-Quartz-Day12
1.开发更新订单状态的功能 1.1订单的状态码 我们电商上面订单的状态修改是非常普通的业务 随着商品的购买流程,订单的状态有 状态: 0=未支付 1=已关闭(超时未支付) 2=已取消 3=已支付 4= ...
- 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第二篇:使用Animator控制跑酷角色的动画状态切换
文章目录 一.前言 二.制作一段跳.二段跳动画 三.编辑动画控制器 四.运行效果 一.前言 嗨,大家好,我是新发,今天是大年初二,大家牛年快乐,牛气冲天. 我打算写一篇使用Unity制作像天天酷跑一样 ...
- FSM状态机之状态模式
首先声明一点,这个模式是我目前见过最好用(本人观点),但是也是最难理解的一个(本人观点). 所以大家需要做好心理准备,如果,对这个模式没有特别强烈的需求,比如: 我有一个Button,我按次数点击它 ...
- 基于STM32开发板I²C总线通信协议浅析
基于STM32开发板I²C总线通信协议浅析 一.前言 I²C(Inter-Integrated Circuit),中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,是由飞利浦公司在1980 ...
- 趣谈设计模式 | 状态模式(State):如何实现游戏中的状态切换?
文章目录 案例:马里奥积分竞赛 有限状态机 分支逻辑法 查表法 状态模式 状态模式与策略模式 总结 完整代码与文档 案例:马里奥积分竞赛 喜欢马里奥的小伙伴们都应该知道,前不久马里奥为了庆祝35周年, ...
最新文章
- MYSQL数据库字母数字混合字段排序问题
- python写文件读文件-python(文件读写)
- C# ICSharpCode.SharpZipLib.Zip 的使用
- 单线程实现并发——协程,gevent模块
- Linux目录结构及作用
- 【性能测试】基本入门(包含mysql锁)
- 12306能删候补订单记录_2019最新火车候补购票十大问题
- java字符串直接比较_java中对于字符串的比较直接用“==”合适吗?
- GD32外部SPI Flash下载算法制作
- 此网站的安全证书有问题
- 带你入门Java网络爬虫
- ceres实现针孔相机bundle adjustment
- mathtype导致无法粘贴解决方法
- [git]上传代码到github
- 电源地线和大地的关系
- 智深与智清:一个馒头所诱发的华山论剑
- NETWORK笔记7:思科命令实验
- AudioUnit录制音频+耳返(四)
- 香港服务器与国内服务器的比较
- repo的入门和使用