搜索
bottom↓
回复: 16

求指点状态机,有具体疑问,谢谢

[复制链接]

出0入0汤圆

发表于 2012-11-11 17:25:56 | 显示全部楼层 |阅读模式
大家好!我开始用状态机也有一段时间了,最近一直在思考搞一个状态机的模板出来,以前用基本都是随性,没有形成一个模板

但有些问题,需要大家指点一下。

1. 我现在都是用的是有限状态机FSM,但是在状态迁移比较复杂时,有不少的代码冗余,而且层次感有些乱,过一段时间,自己都有点晕

    然后我在网上发现了HSM,也就说层次状态机,就有了类似于子类和父类的感觉,子类把一些共同的东西直接不处理交由父类处理,但没有找到具体的代码例子,谁可以给一个,
    我先按自己的理解举一个例子吧
    状态A_1,  A_2,  B_1  , B_2,   B_3   A嵌套着B,且无论A是什么状态,B_3的执行代码是一样的
   


我之前都是这样写的
  1. switch( status_A )
  2. {
  3.         bool is_handle = true;
  4.        
  5.         case A_1:
  6.                 switch( status_B )
  7.                 {
  8.                         case B_1:
  9.                                 break;
  10.                         case B_2:
  11.                                 break;
  12.                         case B_3:
  13.                                 fun1();
  14.                                 break;
  15.                         default:
  16.                                 break;
  17.                 }
  18.                 break;
  19.         case A_2:
  20.                 switch( status_B )
  21.                 {
  22.                         case B_1:
  23.                                 break;
  24.                         case B_2:
  25.                                 break;
  26.                         case B_3:
  27.                                 fun1();
  28.                                 break;
  29.                         default:
  30.                                 break;
  31.                 }
  32.                 break;
  33.         default:
  34.                 break;
  35. }
复制代码
现在考虑父类和子类的观点,这样写
  1. switch( status_A )
  2. {
  3.         bool is_handle = true;
  4.        
  5.         case A_1:
  6.                 switch( status_B )
  7.                 {
  8.                         case B_1:
  9.                                 break;
  10.                         case B_2:
  11.                                 break;
  12.                         case B_3:
  13.                                 is_handle = false;
  14.                                 break;
  15.                         default:
  16.                                 break;
  17.                 }
  18.                 break;
  19.         case A_2:
  20.                 switch( status_B )
  21.                 {
  22.                         case B_1:
  23.                                 break;
  24.                         case B_2:
  25.                                 break;
  26.                         case B_3:
  27.                                 is_handle = false;
  28.                                 break;
  29.                         default:
  30.                                 break;
  31.                 }
  32.                 break;
  33.         default:
  34.                 break;
  35. }

  36. if( is_handle == false )
  37. {
  38.         fun1();
  39. }
复制代码
还有对于HSM,想体现出来的类的继承和多态的观念,大家怎么看??

2 . 状态机的entry/do/exit,用一个比较好的模板去实现,我以前是参考这个帖子的:http://www.amobbs.com/forum.php?mod=viewthread&tid=4520667&highlight=%E7%8A%B6%E6%80%81%E6%9C%BA

请大家畅所欲言,状态机啊

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2012-11-11 20:05:18 | 显示全部楼层
自己顶顶!!!

出0入296汤圆

发表于 2012-11-11 21:22:54 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2012-11-11 21:35 编辑

从你的描述来看,你给的代码例子其实是有本质区别的,前者是单一线程,状态机是调用关系。后者是两线程,使用的是线程间事件通信。
至于你说的层次状态机,感觉应该要通过函数指针的技术才好实现。
最后我想说下:
状态机最关键的是思想而不是形式,所谓进入,退出状态,以及模板都只是一种形式,追求形势而忽略思想是本末倒置的。为什么这么对你说呢。因为你说你的状态机越写越复杂。这其实是你思想的问题,而不是状态机。你说的这个现象其实和之前人们把所由代码斗写在一个.c文件,或者都写在超级循环里面的疑惑是一样的。解决方法还是要从根本的模块化思想上来找。
给你几个经验结论
1、一个状态及模块通常不会超过8个状态。如果超过了,说明状态机可以再细分
2、使用逻辑简单入口出口单一的的状态机模块取代复杂模块。这和计算机语言的结构化代码开发要求是一致的。不要因为状态机原理上都是goto,就忽略了结构化开发准则。
3、停止在各式上浪费时间。做的应用多了,你就自然有答案了。
4、最后一条我觉的是最重要的,但估计说了也就像往空气中释放某种气体一样:先画图,再翻译成状态机;修改代码的时候,先改图再翻译成状态机;调试代码的时候,先分析状态图,再检查代码翻译是否有误。

出0入0汤圆

 楼主| 发表于 2012-11-11 21:56:09 | 显示全部楼层
Gorgon_Meducer 发表于 2012-11-11 21:22
从你的描述来看,你给的代码例子其实是有本质区别的,前者是单一线程,状态机是调用关系。后者是两线程,使 ...

确实,我不该在格式上纠结,以后做的应用多了,自然也就懂了。

这几天揪着层次状态机不放,也是因为我最近在进行的一个项目,就是类似汽车PEPS的Start一键式启动按键的一个状态机,我发现无论处于什么状态,如果当前按键是长按的按,执行代码是一样的,我在开始思考是否可以把其整合一下

于是就开始思考加在网上找答案了,然后才发现了HSM层次状态机的概念,即先交由子类处理,对于各个状态共同的东西,子类不处理,交由父类处理,当然父类可以再整合出相同的东西,继续交由父类的父类处理。

这个肯定是要用函数指针实现的,只是我不想把一个完整的状态拆成几个函数,于是就成了我上面那种代码结构了。

好了,不想格式了,接着写代码了。。。

呵呵,说来惭愧,写程序之前几乎是不画图的,也就是最近才装了visio,但还是先写了程序,然后画图,但有一种感觉就是画图之后,思路就清晰了不少,然后再改程序,画图的习惯还是要慢慢养成啊。

谢谢指点!

傻孩子是成都Atmel的?不知是哪个部门的,我和上海Atmel那边有些接触,某个正在进行的项目就是用的Atmel的方案。


出0入296汤圆

发表于 2012-11-11 22:16:46 | 显示全部楼层
pang123hui 发表于 2012-11-11 21:56
确实,我不该在格式上纠结,以后做的应用多了,自然也就懂了。

这几天揪着层次状态机不放,也是因为我最 ...

我之前一直是上海Atmel的,3月份离职的。

出0入0汤圆

 楼主| 发表于 2012-11-11 22:23:04 | 显示全部楼层
Gorgon_Meducer 发表于 2012-11-11 22:16
我之前一直是上海Atmel的,3月份离职的。

您不姓段吧?本来我这个项目是和上海Atmel段工联系的,貌似他也是大概那时候离职的,现在是换成吴XX了

出0入296汤圆

发表于 2012-11-11 22:25:20 | 显示全部楼层
pang123hui 发表于 2012-11-11 22:23
您不姓段吧?本来我这个项目是和上海Atmel段工联系的,貌似他也是大概那时候离职的,现在是换成吴XX了{:s ...

不知你说的是谁。外气里面通常用英文名字来隐藏真名。鄙姓王

出0入0汤圆

 楼主| 发表于 2012-11-11 22:29:00 | 显示全部楼层
Gorgon_Meducer 发表于 2012-11-11 22:25
不知你说的是谁。外气里面通常用英文名字来隐藏真名。鄙姓王

呵呵,我想也是,应该只是个巧合,我是做汽车电子的,我接触的也是你们Atmel汽车防盗那一块的人。

小弟不才,今年刚毕业,以后估计还有不少问题向您请教了。

出0入296汤圆

发表于 2012-11-11 22:37:48 | 显示全部楼层
pang123hui 发表于 2012-11-11 22:29
呵呵,我想也是,应该只是个巧合,我是做汽车电子的,我接触的也是你们Atmel汽车防盗那一块的人。

小弟 ...

不客气,我是合肥人。

出0入0汤圆

 楼主| 发表于 2012-11-11 22:45:48 | 显示全部楼层
Gorgon_Meducer 发表于 2012-11-11 22:37
不客气,我是合肥人。

哈哈,我是芜湖的,咱们也算老乡了。

出0入0汤圆

发表于 2012-11-12 15:46:28 | 显示全部楼层
楼主不需要做重复工作,已经有国外的嵌入式领域专家完成了相关工作。只是目前资料都是外文。推荐链接
http://www.state-machine.com/
量子框架指的就是它

出0入0汤圆

 楼主| 发表于 2012-11-12 18:58:19 | 显示全部楼层
cyrobot 发表于 2012-11-12 15:46
楼主不需要做重复工作,已经有国外的嵌入式领域专家完成了相关工作。只是目前资料都是外文。推荐链接
http: ...

量子框架,这个词汇,我还真没怎么注意过,受教了

出0入0汤圆

发表于 2012-11-13 08:48:12 | 显示全部楼层
直接用qp啊,www.state-machine.com

出0入296汤圆

发表于 2012-11-13 10:13:49 | 显示全部楼层
cyrobot 发表于 2012-11-12 15:46
楼主不需要做重复工作,已经有国外的嵌入式领域专家完成了相关工作。只是目前资料都是外文。推荐链接
http: ...

状态机是一种开放的技术,无所谓的重新发明轮子。否则嵌入式操作系统大家只用一个就好了。
能掌握的资源才是资源,成熟的理论早就有,不是谁的发明,但却有不同应用条件下的实现。
再我手边的应用中,我需要一个自己能收放自如,裁减适度的状态机实现,这不会影响你们
去使用别人的成熟产品。你的好意我明白,可以节省我的研发时间,其实,这些东西对我来说
属于趁手的兵器,非要去换成别人的"普刀"实在还是勉强。

不过我建议你不防让更多人知道国外的这个系统,也算让更多人不会重新发明轮子。

出0入0汤圆

发表于 2012-11-15 11:19:25 | 显示全部楼层
Gorgon_Meducer 发表于 2012-11-13 10:13
状态机是一种开放的技术,无所谓的重新发明轮子。否则嵌入式操作系统大家只用一个就好了。
能掌握的资源 ...

王工能回复我的帖子,感到十分荣幸。其实推荐qp,也无意接触到的,用过几个例子,发现确实很容易上手。其中层次状态机HSM的支持真的让人受用不尽,而配套的图书Practical UML Statecharts in C/C++, Second Edition: Event-Driven Programming for Embedded Systems也给我好好的上了一课,对状态机的设计以及几个常用的设计模式有了新的认识。因此,也希望这个量子框架让更多人熟知和受益。
只是现在我也不过是量子框架的初学者,还没有足够的应用经验,不敢多卖弄,现阶段只能推荐。

出0入296汤圆

发表于 2012-11-15 11:39:06 | 显示全部楼层
cyrobot 发表于 2012-11-15 11:19
王工能回复我的帖子,感到十分荣幸。其实推荐qp,也无意接触到的,用过几个例子,发现确实很容易上手。其 ...

这本书的中文版马上就要出版了,到时候可以再一起向大家推荐下!

出0入169汤圆

发表于 2012-11-15 14:01:31 | 显示全部楼层
刚从站上下的第二版电子书,先尝个鲜

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 00:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表