参看:有限状态机的两种写法
参看:设计模式:一目了然的状态机图

假设状态机的状态转换由下表所示:

简单讲一下状态转换过程:当处于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开发 -- 状态机与状态切换逻辑相关推荐

  1. ModelCoder状态机中的State逻辑

    ModelCoder可以进行状态机的搭建以及仿真,其支持的状态机是通过在Mealy和Moore有限状态机的基础上进行扩展来实现的.本文主要讲解状态机中状态(State)的部分逻辑. 状态机中的状态(S ...

  2. 【低功耗蓝牙】② 蓝牙状态切换和事件处理

    摘要 本文章基于ESP32芯片MicroPython代码,主要介绍低功耗蓝牙的状态机和状态切换机制,以及蓝牙的事件处理,是同学们理解后面内容的基础. 蓝牙状态机 蓝牙链路层的状态机有五种状态,分别是就 ...

  3. 用状态机做人物(AI)的状态切换以及动画效果——人物动画以及切换

    github: https://github.com/lucaschen1993/PRG_DEMO 前言 在之前写状态机文章的时候介绍过,基于事件与委托实现的状态机.这篇文章将介绍状态机的使用,以及人 ...

  4. (五十三) Android O wifi 状态机消息处理及状态切换流程分析-以WifiController为例

    前言:最近写了几篇wifi状态机相关的博客,但是状态转换方面一直是囫囵吞枣,感觉代码对的上流程就开始梳理了,没有真正关注过状态切换和消息处理流程,现在梳理一下. 1. wifi 状态机消息处理及状态切 ...

  5. JSD-2204-(业务逻辑开发)-更新订单状态的功能-搜索功能-Quartz-Day12

    1.开发更新订单状态的功能 1.1订单的状态码 我们电商上面订单的状态修改是非常普通的业务 随着商品的购买流程,订单的状态有 状态: 0=未支付 1=已关闭(超时未支付) 2=已取消 3=已支付 4= ...

  6. 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第二篇:使用Animator控制跑酷角色的动画状态切换

    文章目录 一.前言 二.制作一段跳.二段跳动画 三.编辑动画控制器 四.运行效果 一.前言 嗨,大家好,我是新发,今天是大年初二,大家牛年快乐,牛气冲天. 我打算写一篇使用Unity制作像天天酷跑一样 ...

  7. FSM状态机之状态模式

     首先声明一点,这个模式是我目前见过最好用(本人观点),但是也是最难理解的一个(本人观点). 所以大家需要做好心理准备,如果,对这个模式没有特别强烈的需求,比如: 我有一个Button,我按次数点击它 ...

  8. 基于STM32开发板I²C总线通信协议浅析

    基于STM32开发板I²C总线通信协议浅析 一.前言 I²C(Inter-Integrated Circuit),中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,是由飞利浦公司在1980 ...

  9. 趣谈设计模式 | 状态模式(State):如何实现游戏中的状态切换?

    文章目录 案例:马里奥积分竞赛 有限状态机 分支逻辑法 查表法 状态模式 状态模式与策略模式 总结 完整代码与文档 案例:马里奥积分竞赛 喜欢马里奥的小伙伴们都应该知道,前不久马里奥为了庆祝35周年, ...

最新文章

  1. MYSQL数据库字母数字混合字段排序问题
  2. python写文件读文件-python(文件读写)
  3. C# ICSharpCode.SharpZipLib.Zip 的使用
  4. 单线程实现并发——协程,gevent模块
  5. Linux目录结构及作用
  6. 【性能测试】基本入门(包含mysql锁)
  7. 12306能删候补订单记录_2019最新火车候补购票十大问题
  8. java字符串直接比较_java中对于字符串的比较直接用“==”合适吗?
  9. GD32外部SPI Flash下载算法制作
  10. 此网站的安全证书有问题
  11. 带你入门Java网络爬虫
  12. ceres实现针孔相机bundle adjustment
  13. mathtype导致无法粘贴解决方法
  14. [git]上传代码到github
  15. 电源地线和大地的关系
  16. 智深与智清:一个馒头所诱发的华山论剑
  17. NETWORK笔记7:思科命令实验
  18. AudioUnit录制音频+耳返(四)
  19. 香港服务器与国内服务器的比较
  20. repo的入门和使用

热门文章

  1. 8.3 直接插入排序
  2. html中代码执行顺序
  3. HTML中Div、span、label标签的区别
  4. 如何实现在O(n)时间内排序,并且空间复杂度为O(1)
  5. DNN出错:The compiler failed with error code 1.
  6. 吴恩达 coursera AI 专项五第一课(下)总结+作业答案
  7. 吴恩达 coursera AI 第二课总结+作业答案
  8. Python学习笔记:常用内建模块7XML
  9. 数据分析:主成分分析(PCA)1
  10. Win7如何设置多个IP地址