pang123hui 发表于 2012-11-11 17:25:56

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

大家好!我开始用状态机也有一段时间了,最近一直在思考搞一个状态机的模板出来,以前用基本都是随性,没有形成一个模板

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

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

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

我之前都是这样写的switch( status_A )
{
        bool is_handle = true;
       
        case A_1:
                switch( status_B )
                {
                        case B_1:
                                break;
                        case B_2:
                                break;
                        case B_3:
                                fun1();
                                break;
                        default:
                                break;
                }
                break;
        case A_2:
                switch( status_B )
                {
                        case B_1:
                                break;
                        case B_2:
                                break;
                        case B_3:
                                fun1();
                                break;
                        default:
                                break;
                }
                break;
        default:
                break;
}现在考虑父类和子类的观点,这样写switch( status_A )
{
        bool is_handle = true;
       
        case A_1:
                switch( status_B )
                {
                        case B_1:
                                break;
                        case B_2:
                                break;
                        case B_3:
                                is_handle = false;
                                break;
                        default:
                                break;
                }
                break;
        case A_2:
                switch( status_B )
                {
                        case B_1:
                                break;
                        case B_2:
                                break;
                        case B_3:
                                is_handle = false;
                                break;
                        default:
                                break;
                }
                break;
        default:
                break;
}

if( is_handle == false )
{
        fun1();
}
还有对于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

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

pang123hui 发表于 2012-11-11 20:05:18

自己顶顶!!!

Gorgon_Meducer 发表于 2012-11-11 21:22:54

本帖最后由 Gorgon_Meducer 于 2012-11-11 21:35 编辑

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

pang123hui 发表于 2012-11-11 21:56:09

Gorgon_Meducer 发表于 2012-11-11 21:22 static/image/common/back.gif
从你的描述来看,你给的代码例子其实是有本质区别的,前者是单一线程,状态机是调用关系。后者是两线程,使 ...

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

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

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

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

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

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

谢谢指点!

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


Gorgon_Meducer 发表于 2012-11-11 22:16:46

pang123hui 发表于 2012-11-11 21:56 static/image/common/back.gif
确实,我不该在格式上纠结,以后做的应用多了,自然也就懂了。

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

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

pang123hui 发表于 2012-11-11 22:23:04

Gorgon_Meducer 发表于 2012-11-11 22:16 static/image/common/back.gif
我之前一直是上海Atmel的,3月份离职的。

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

Gorgon_Meducer 发表于 2012-11-11 22:25:20

pang123hui 发表于 2012-11-11 22:23 static/image/common/back.gif
您不姓段吧?本来我这个项目是和上海Atmel段工联系的,貌似他也是大概那时候离职的,现在是换成吴XX了{:s ...

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

pang123hui 发表于 2012-11-11 22:29:00

Gorgon_Meducer 发表于 2012-11-11 22:25 static/image/common/back.gif
不知你说的是谁。外气里面通常用英文名字来隐藏真名。鄙姓王

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

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

Gorgon_Meducer 发表于 2012-11-11 22:37:48

pang123hui 发表于 2012-11-11 22:29 static/image/common/back.gif
呵呵,我想也是,应该只是个巧合,我是做汽车电子的,我接触的也是你们Atmel汽车防盗那一块的人。

小弟 ...

不客气,我是合肥人。

pang123hui 发表于 2012-11-11 22:45:48

Gorgon_Meducer 发表于 2012-11-11 22:37 static/image/common/back.gif
不客气,我是合肥人。

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

cyrobot 发表于 2012-11-12 15:46:28

楼主不需要做重复工作,已经有国外的嵌入式领域专家完成了相关工作。只是目前资料都是外文。推荐链接
http://www.state-machine.com/
量子框架指的就是它

pang123hui 发表于 2012-11-12 18:58:19

cyrobot 发表于 2012-11-12 15:46 static/image/common/back.gif
楼主不需要做重复工作,已经有国外的嵌入式领域专家完成了相关工作。只是目前资料都是外文。推荐链接
http: ...

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

orzorzorzorz 发表于 2012-11-13 08:48:12

直接用qp啊,www.state-machine.com

Gorgon_Meducer 发表于 2012-11-13 10:13:49

cyrobot 发表于 2012-11-12 15:46 static/image/common/back.gif
楼主不需要做重复工作,已经有国外的嵌入式领域专家完成了相关工作。只是目前资料都是外文。推荐链接
http: ...

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

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

cyrobot 发表于 2012-11-15 11:19:25

Gorgon_Meducer 发表于 2012-11-13 10:13 static/image/common/back.gif
状态机是一种开放的技术,无所谓的重新发明轮子。否则嵌入式操作系统大家只用一个就好了。
能掌握的资源 ...

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

Gorgon_Meducer 发表于 2012-11-15 11:39:06

cyrobot 发表于 2012-11-15 11:19 static/image/common/back.gif
王工能回复我的帖子,感到十分荣幸。其实推荐qp,也无意接触到的,用过几个例子,发现确实很容易上手。其 ...

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

d__xin 发表于 2012-11-15 14:01:31

刚从站上下的第二版电子书,先尝个鲜
页: [1]
查看完整版本: 求指点状态机,有具体疑问,谢谢