前言

  就单片机而言,程序可以分为两类:带操作系统的程序和前后台程序;前后台程序从架构上又分为顺序机和状态机。

  广义地说, 任何一个程序都是一个状态机, 因为它总是要记住一些状态, 然后根据输入进行输出。 狭义上说,状态机不是指随随便便的一个程序, 而是指某一类程序, 也就是状态机编程程序。

FSM

  简单讲就是将行为分为一个一个的状态,状态与状态之间的过渡通过事件的触发来形成。比如士兵的行为有“巡逻”,“追击敌人”,“攻击敌人”,“逃跑”等行为,响应的事件就有“发现敌人”,“追到敌人”,“敌人逃跑”,“敌人死亡”,“自己血量不足”等。那么可以写成这样一个状态机:

  1.士兵 “巡逻”,如果 “发现敌人”,那么,“追击敌人”

  2.士兵 “追击敌人”, 如果 “追到敌人”, 那么,“攻击敌人”

  3.士兵 “追击敌人”, 如果 “敌人死亡”, 那么,继续 “巡逻”

  4.士兵 “攻击敌人”, 如果 “敌人死亡”, 那么,继续 “巡逻”

  5.士兵 “攻击敌人”, 如果 “血量不足”, 那么,“逃跑”

  其中,士兵就是这个FSM的执行者,红色的就是状态,蓝色的就是事件,整个状态机的行为可以总结为:当前状态=>是否满足条件1,如果是,则跳转到对应状态,否则=>是否满足条件2,如果是,则跳转到对应状态。

  由此可看出,状态机是一种“事件触发型”行为,就是只有事件的触发才会发生引起状态的变化。

HSM

  简单来说,就是FSM当状态太多的时候,不好维护,于是将状态分类,抽离出来,将同类型的状态做为一个状态机,然后再做一个大的状态机,来维护这些子状态机。

  举个决策小狗行为的例子:我们对小狗定义了有很多行为,比如跑,吃饭,睡觉,咆哮,撒娇,摇尾巴等等,如果每个行为都是一个状态,用常规状态机的话,我们就需要在这些状态间定义跳转,比如在“跑”的状态下,如果累了,那就跳转到“睡觉”状态,再如,在“撒娇”的状态下,如果感到有威胁,那就跳转到“咆哮”的状态等等,我们会考量每一个状态间的关系,定义所有的跳转链接,建立这样一个状态机。如果用层次化的状态机的话,我们就先会把这些行为“分类”,把几个小状态归并到一个状态里,然后再定义高层状态和高层状态中内部小状态的跳转链接。

  其实层次化状态机从某种程度上,就是限制了状态机的跳转,而且状态内的状态是不需要关心外部状态的跳转的,这样也做到了无关状态间的隔离,比如对于小狗来说,我们可以把小狗的状态先定义为疲劳,开心,愤怒,然后这些状态里再定义小状态,比如在开心的状态中,有撒桥,摇尾巴等小状态,这样我们在外部只需要关心三个状态的跳转(疲劳,开心,愤怒),在每个状态的内部只需要关心自己的小状态的跳转就可以了。这样就大大的降低了状态机的复杂度,另外,如果觉得两层的状态机还是状态太多的话,可以定义更多的状态层次以降低跳转链接数。

  QP就是一个面向MCU,面向并发的层次式状态机模型。有人称量子平台QP(Quantum Programming)叫作量子编程(Quantum Programming),也叫状态机编程。

 参考文献

http://www.cnblogs.com/jeason1997/p/5140201.html

最新文章

  1. 罗永浩Vs王自如:浮躁的世界该如何降温?!
  2. 【C语言】C语言简介
  3. MOOCULUS微积分-2: 数列与级数学习笔记 2. Series
  4. Tomcat之web项目部署
  5. HTML5的自定义属性data-* 的用法解析
  6. 10、C#基础整理(集合)
  7. HTML表单样式
  8. [rxjs] Throttled Buffering in RxJS (debounce)
  9. C#使用jmail组件发送邮件
  10. docker四种网络模式
  11. xCode6制作动态及静态Framework(转)
  12. 2.4. 属性(Core Data 应用程序实践指南)
  13. rc.local(ubuntu18.04)
  14. vue使用矢量图
  15. 个人技术博客——linux服务器配置以及flask框架
  16. 高精度(x ,/, +, -, %)良心模板
  17. js精确计算(js浮点数精度问题)
  18. 超全面的JavaWeb笔记day11<JSP&Session&Cookie&HttpSession>
  19. 神奇的随机数rand()
  20. RHCSA-EXAM 模拟题目

热门文章

  1. windows7蓝屏0x000000c4
  2. Cython保护Python代码
  3. python-selenium自动化测试(火狐、谷歌、360浏览器启动)
  4. 阿里云亮相2019联通合作伙伴大会,边缘计算等3款云产品助力5G时代产业数字化转型
  5. linux centos 一键安装环境
  6. @bzoj - 4524@ [Cqoi2016]伪光滑数
  7. 模板—tarjan求割点
  8. art-template web模板引擎引入JS函数
  9. 在ORACLE存储过程中创建临时表
  10. oracle SELECT子句中避免使用 ‘ * ‘