搜索
bottom↓
楼主: Gorgon_Meducer

[FSM]状态机实践入门——程咬金只要三斧头厉害

  [复制链接]

出0入0汤圆

发表于 2011-6-4 16:06:24 | 显示全部楼层
记好!

出0入0汤圆

发表于 2011-6-4 17:02:04 | 显示全部楼层
学习啦。

出0入0汤圆

发表于 2011-6-4 17:41:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-20 14:48:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-20 17:34:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-22 18:42:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-22 23:24:55 | 显示全部楼层
回复【65楼】gshuang1
上学的时候一直以为是状态机一种很高级算法,后来无聊在网上浏览了下究竟是啥子东西,才发觉原来自己编出来的程序实质也是状态机的一种,从此不再觉得没什么稀奇了,只是这名字取得有点好。其实这所谓的“状态机”每个人都能自己摸索出来的,编个比较多任务的单片机程序,在不断的追求完美的过程中就会走“状态机”这种方式。楼主似乎比较喜欢把程序模块化,很重视基础性的东西,精益求精,不错。看得出楼主应该是个学校老师吧,呵呵
-----------------------------------------------------------------------
傻孩子真是老师吗?还以为是在校生呢。

出0入0汤圆

发表于 2011-7-23 01:55:14 | 显示全部楼层
MARK...回头细读

出0入0汤圆

发表于 2011-7-28 01:13:00 | 显示全部楼层
很好!!

出0入0汤圆

发表于 2011-7-28 08:04:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-28 09:28:24 | 显示全部楼层
做个记号

出0入0汤圆

发表于 2011-7-28 09:48:55 | 显示全部楼层
MARK。

出0入0汤圆

发表于 2011-7-28 10:00:40 | 显示全部楼层
程序匠人的书中讲到过状态机,还有使用了状态机的实例(摇摇棒)!

出0入0汤圆

发表于 2011-7-28 10:15:53 | 显示全部楼层
傻孩子好久没见了。

出0入0汤圆

发表于 2011-7-30 11:19:27 | 显示全部楼层
搞单片机开发以来,一直用傻孩子提到的第一种状态机思想,做一般的项目应用不成问题,后来在一个比较大的项目中用到了一种基于消息触发的状态机,状态转换是有消息触发的,而消息来自于一个循环队列(傻孩子的那种),这样,只要将不同状态下,不同消息对应的动作函数关联就可以了,状态机会自动根据消息去执行相应的动作函数。不知道傻孩子有没有搞过这样的状态机。

出0入0汤圆

发表于 2011-7-30 12:08:37 | 显示全部楼层
回复【221楼】ARM3721  
搞单片机开发以来,一直用傻孩子提到的第一种状态机思想,做一般的项目应用不成问题,后来在一个比较大的项目中用到了一种基于消息触发的状态机,状态转换是有消息触发的,而消息来自于一个循环队列(傻孩子的那种),这样,只要将不同状态下,不同消息对应的动作函数关联就可以了,状态机会自动根据消息去执行相应的动作函数。不知道傻孩子有没有搞过这样的状态机。
-----------------------------------------------------------------------

有没有图,展示一下,不是您说的不清楚,而是本人理解差!

出0入0汤圆

发表于 2011-7-30 16:50:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-30 17:29:49 | 显示全部楼层
回复有内容!

出0入296汤圆

 楼主| 发表于 2011-8-1 10:12:47 | 显示全部楼层
to 【221楼】 ARM3721
    2006年的时候写过一个你说得这种结构,并制作了一个“基于消息触发的合作式调度器”。
这个调度器就是后来我很多调度器的原型,但是基于消息处罚的合作式调度器对一般应用来说,
太过复杂,因此,我对其进行了简化。其实,与普通调度器来说,这种方式的差别在于任务的
函数圆形里面要增加一个消息的入口,而消息里面要增加一个函数指针来记录消息的接受方和
消息的发送方。这样的好处是,调度器可以直接根据消息来执行消息的接收函数,而接受函数
也可以选择:直接根据保存在消息内的发送方信息回复消息而实现快速响应,也可以通过普通
的消息队列来回复数据,实现多任务的轮转。
  不过这种方式的缺点是,需要大量的堆来传递消息,以及打包在消息中的数据。相对普通
系统来说“重量级”太大。同时,为了简化使用过程,通常也需要大量的宏来对繁琐的操作——
比如动态申请空间并保存要传递的数据到这一空间中(牵涉到数据的序列化问题)——进行简化。
  用起来还是很不错的,不过这类系统堆崩溃的后果是非常严重的,并且还非常难以调试。

出0入0汤圆

发表于 2011-8-4 19:48:20 | 显示全部楼层
不知道这是不是状态机?

我把很多任务(暂且这么叫吧)分成函数写,比如,数码管显示,我想刷新50hz,我8个管我就写400hz的定时器,每次刷新一个位0键盘我20hz扫描吧,我定时器每触发20次我扫描一次键盘...

或者这叫做什么?

出0入0汤圆

发表于 2011-8-7 23:27:38 | 显示全部楼层
先马克保存

出0入0汤圆

发表于 2011-8-8 07:23:03 | 显示全部楼层
学习!

出0入0汤圆

发表于 2011-8-8 08:23:03 | 显示全部楼层
回复【15楼】Gorgon Meducer  傻孩子
不会被诸如
按键扫描程序和数码管扫描程序无法很好协调工作的问题困惑,
甚至在缺乏引导的情况下,养成非常不好的习惯,对由于这些习
惯本身容易导致的栈溢出问题,存储器使用不当(指针类问题),
产生恐惧心理。
-----------------------------------------------------------------------
感触良多,高手就是不一样,一语中的

出0入0汤圆

发表于 2011-8-8 09:10:38 | 显示全部楼层
感觉LZ是个伟大的思想者,佩服!

出0入296汤圆

 楼主| 发表于 2011-8-8 12:51:59 | 显示全部楼层
to 【226楼】 electron_love
    认真说来,这的确是一种状态机,用时间作为状态转换的触发条件。
不过从你的使用方式来看应该对状态机的概念还很模糊,应该说还不知道
怎样编写一个状态机。你应该尝试一下普通的switch case方式。

出100入0汤圆

发表于 2011-8-8 13:30:16 | 显示全部楼层
MARK 学习
楼主真是高手啊~知识扎实,很会写论文~~而且论坛上夜经常的发表好多好文章,举双手双脚支持啊!

出0入0汤圆

发表于 2011-8-13 10:24:45 | 显示全部楼层
傻孩子的思想太棒了,昨天才开始关注状态机的,以前要么直接移植一个操作系统写任务,要么就是简单的前后台,真是惭愧……以前也知道状态机,学数字电路时最先接触,后来知道程序里也能这么用,不过一直没上心。一直在思考怎样才能将裸机程序中的延时空跑去掉,不要做那么傻的事情,而又不必像操作系统那样,任务调度时一阵狂压栈,一搜也是这个论坛上看到,发现了状态机可以解决,经昨晚验证和思考,设计了一个两层状态环境:有一个主状态层,在main函数的大循环里,用于管理个状态任务;子状态层就是各任务中的函数里的小状态,因为有超时,用了一个定时中断来管理超时状态切换,在实验的时候又加了一个简单的调度器,防止活动的状态被挂起而不再执行。状态机+调度器,太完美了,顿觉相见恨晚,如有利器在手!今日兴冲冲一见傻孩子的帖子,竟然无比亢奋,傻孩子走在我前面太多了,要努力!哈哈,如果对比一下操作系统的任务切换和状态机的状态切换将会很有意思。傻孩子说的状态机才是嵌入式的或者是数字系统的万能语言,太对了。继续修炼~

出0入0汤圆

发表于 2011-8-13 10:41:27 | 显示全部楼层
学习,先MARK再看

出0入0汤圆

发表于 2011-8-17 16:38:00 | 显示全部楼层
照这么说一般人写的单片机程序都是状态机的,状态就是程序中的标志位(我一般会用标志位来标志一个时间什么的),我可以这么认为吗?
傻孩子将标志位集中管理,并上升到理论高度。
单片机一般程序是无限循环的吧,那最外层的状态应该是无限执行的吧!(保持为true)————我说的是一般状态。

出0入0汤圆

发表于 2011-8-17 16:43:55 | 显示全部楼层
顶啊

出0入0汤圆

发表于 2011-8-21 20:23:07 | 显示全部楼层
不顶不行啊,喜欢从哲学方面去思考这些问题,但是没有傻孩子聪明啊,得努力学啊

出0入0汤圆

发表于 2011-8-21 21:54:50 | 显示全部楼层
gaga,mark!!

出0入0汤圆

发表于 2011-8-25 14:06:49 | 显示全部楼层
受益匪浅

出0入296汤圆

 楼主| 发表于 2011-8-25 14:34:39 | 显示全部楼层
to 【236楼】 defineme
    这种说法本身很有雄辩地感觉。其实我之前给出过答案:同样的代码,看得人不同,就是不一样的理解。
解释来说就是,如果你心中没有状态机,状态机代码在你看来什么也不是。

出0入0汤圆

发表于 2011-8-30 09:15:59 | 显示全部楼层
来迟到了,还得顶个

出0入0汤圆

发表于 2011-8-30 10:10:22 | 显示全部楼层
这个得要学习呀

出0入0汤圆

发表于 2011-8-30 18:44:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-31 22:28:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-15 16:02:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-15 16:53:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-15 17:06:19 | 显示全部楼层
这个我只能说相见恨晚啊~不过还是先MARK一下,再谢谢一下,再佩服很多下,不光是技术还有哲学方面的境界。

出0入0汤圆

发表于 2011-9-15 20:29:59 | 显示全部楼层
MARK一下。

出0入0汤圆

发表于 2011-9-15 22:03:38 | 显示全部楼层
其实我觉得楼主所说的第二种状态机虽然灵活,但是状态很多的话容易引起混乱,中间的几个帖子其实提到这个问题,所以应该思考加入同步信号!有经验的高人不妨多贡献一些

出0入0汤圆

发表于 2011-10-15 18:52:19 | 显示全部楼层
不知道MARK过没有。。

出0入0汤圆

发表于 2011-10-15 19:36:46 | 显示全部楼层
顶一下楼主!

出0入0汤圆

发表于 2011-10-15 22:12:00 | 显示全部楼层
记号一下,非常有用哈~~

出0入0汤圆

发表于 2011-10-15 22:48:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-16 00:37:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-16 00:41:13 | 显示全部楼层
好好学习。

出0入0汤圆

发表于 2011-10-16 10:19:03 | 显示全部楼层
牛x

出0入0汤圆

发表于 2011-10-16 10:44:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-16 11:08:36 | 显示全部楼层
果断mark

出0入296汤圆

 楼主| 发表于 2011-10-17 09:53:00 | 显示全部楼层
to 【250楼】 overmountain
    解决“状态混乱”的问题不是通过信号量,而是通过正确的程序设计流程和原则。
首先能想到的就是:对于较为复杂的状态系统,一定要首先绘制状态图,通过状态图
检查程序逻辑的可靠性,然后再直接将状态图翻译成对应的状态机代码。另外一种途
径用来避免较为复杂的状态系统就是,注意状态机的模块化封装问题——这可以说是
程序设计的老命题的,无非就是高内聚、低耦合,适当的扇入和扇出数量,这里我就
不赘述了。总之一个原则,本地化信息一定要本地化处理。尽可能避免状态机的状态
变量全局化,状态变量全局化似乎可以很容易的实现状态的汇报以及“随时随地的复
位”,但这是一个非常严重的破坏封装的行为,系统的不稳定性由此而来,具体危害
我就不多说了,你懂的。
  非常感谢你的建议。作为一种状态机编写方式,是否加入更多起他的要素,这实
际上就是丢给使用者根据需要去扩充的。

出0入0汤圆

发表于 2011-10-17 14:10:50 | 显示全部楼层
感觉跟ucos有点像,刚接触了点ucos

出0入0汤圆

发表于 2011-10-19 15:34:19 | 显示全部楼层
很崇拜你 呵呵

出0入0汤圆

发表于 2011-10-21 16:18:21 | 显示全部楼层
呵呵,尽管我还没有用状态机写过一个程序,但之前写过PLC的状态转移图,看过一个51的简单例子
能不能这样理解,状态机思想把事件分为状态,状态转移的条件(按键的按下,时间的流逝等),状态转移的方向三个要素,所不同的是,PLC的状态转移图可以直接提供傻瓜式的框架,只需要往里面填写这三个要素,而单片机则需要我们自己组织语言来达到同一目的?

出0入0汤圆

发表于 2011-10-31 15:10:32 | 显示全部楼层
标记下,以后慢慢看!

出0入296汤圆

 楼主| 发表于 2011-10-31 19:07:05 | 显示全部楼层
to 【263楼】 renwocai 任我菜
   没有错,你理解得比较准确。

出0入0汤圆

发表于 2011-10-31 22:22:56 | 显示全部楼层
记下明天看

出0入0汤圆

发表于 2011-11-6 13:22:42 | 显示全部楼层
状态机  学习中.....

出0入0汤圆

发表于 2011-11-8 00:33:57 | 显示全部楼层
MARK、、、

出0入0汤圆

发表于 2011-11-8 08:37:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-8 08:59:36 | 显示全部楼层
mark,一直在做状态机,都是根据自己的理解来设计,终于有文字表达了!!!

出0入0汤圆

发表于 2011-11-9 20:12:05 | 显示全部楼层
顶大孩子!

出0入0汤圆

发表于 2011-11-16 14:45:09 | 显示全部楼层
mark下 慢慢看!!!!

出0入0汤圆

发表于 2011-11-16 15:06:23 | 显示全部楼层
用过几天IAR的visual state 。感觉是很舒服!

出0入0汤圆

发表于 2011-11-19 01:04:26 | 显示全部楼层
mark下 慢慢看!!!!

出0入0汤圆

发表于 2011-11-21 00:46:32 | 显示全部楼层
状态机^^ 老早以前就有听起过, 学51时自已用过这种方法也不知道! 那时同事(我的老师呢)就教我用asm 来写一个swatch,
後来在数字设计的课堂中老师就说起这个名字, 那时并不是教软件. 而是在上fpga 练习... 其实那时我就觉得编程是可以用上这种方式的,
在那之前我并不了解状态机是个什麽东西. 但一直以来我就没用过这种方式来做项目, 而我开始使用这种方式是在我转职後接的第一个项目.
那时工作量太大, 公司也要我一个人完成! 而当时就看到ouravr 里的一篇文章
应该是 HotPower 高人写的 一个零消耗按键的状态机... 好像差不多这个意思.
那时真的有电到的感觉!那时就用上了!
如果一个状态机制是不难理解的(其实一个状态机制里也可以包括很多层的就像时.分.秒.一样,还有就是在不同层里做的触发式),
但如果有很多个状态机制, 还有状态嵌套?还有中断中的状态机制就更加烦了...
写出来了简单的好理解, 好维护, 复杂的就好花一段时间...每个机制里都可能会有关系的.
而效率真不错的, 但是!其中最烦人的就是优化问题... (状态数量, 消耗, 还要根据实际情况作调整, 有时还要作假状态)
我不知道要找那些书可以该我学习到而且用在mcu上, 傻孩子出状态机的书我一定会买的^^期待你这书快点出来.
你之前的书也有买, 我是觉得书中的思考方式跟我的差不多, 只不过...

出0入0汤圆

发表于 2011-11-21 08:33:39 | 显示全部楼层
记下三个板斧

出0入0汤圆

发表于 2011-11-21 08:39:33 | 显示全部楼层
太好了

出0入0汤圆

发表于 2011-11-21 18:16:19 | 显示全部楼层
MARK了

出0入0汤圆

发表于 2011-11-21 18:24:29 | 显示全部楼层
学习了,记一个

出0入0汤圆

发表于 2011-11-22 20:42:47 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2011-11-30 21:46:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-2 18:50:35 | 显示全部楼层
学习了,mark

出0入0汤圆

发表于 2011-12-2 20:30:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-3 15:38:05 | 显示全部楼层
MARK了 慢慢理解

出0入0汤圆

发表于 2011-12-3 19:25:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-3 20:01:35 | 显示全部楼层
这世界很小,今天用不上不代表明天也不用,支持顶下。

出0入0汤圆

发表于 2011-12-4 12:58:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-4 17:43:15 | 显示全部楼层
Mark!

出0入0汤圆

发表于 2011-12-4 18:25:35 | 显示全部楼层
mark..

出0入0汤圆

发表于 2011-12-9 10:15:48 | 显示全部楼层
大家应该有意无意都在用状态啊

出0入0汤圆

发表于 2011-12-9 10:49:11 | 显示全部楼层
ding

出0入0汤圆

发表于 2011-12-18 23:37:57 | 显示全部楼层
回复【263楼】renwocai 任我菜
呵呵,尽管我还没有用状态机写过一个程序,但之前写过plc的状态转移图,看过一个51的简单例子
能不能这样理解,状态机思想把事件分为状态,状态转移的条件(按键的按下,时间的流逝等),状态转移的方向三个要素,所不同的是,plc的状态转移图可以直接提供傻瓜式的框架,只需要往里面填写这三个要素,而单片机则需要我们自己组织语言来达到同一目的?
-----------------------------------------------------------------------

抽象以后是一样的数学模型,学plc的人状态机是编程的入门功夫

出0入0汤圆

发表于 2011-12-19 16:23:14 | 显示全部楼层
mark 状态机

出0入0汤圆

发表于 2012-1-2 16:43:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-2 18:13:32 | 显示全部楼层
马克一下

出0入0汤圆

发表于 2012-1-2 18:35:37 | 显示全部楼层
我也先收藏起来

出0入0汤圆

发表于 2012-1-2 22:00:27 | 显示全部楼层
ww

出0入0汤圆

发表于 2012-1-2 23:28:36 | 显示全部楼层
都来M了,我也来

出0入0汤圆

发表于 2012-1-2 23:58:25 | 显示全部楼层
回复【楼主位】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

Mark

出0入0汤圆

发表于 2012-1-3 00:10:18 | 显示全部楼层
好东西。还在探索ING....

出0入0汤圆

发表于 2012-1-3 10:15:40 | 显示全部楼层
3 axe

出0入0汤圆

发表于 2012-1-3 10:18:16 | 显示全部楼层
水有点深了,慢慢了解

出0入0汤圆

发表于 2012-1-3 11:49:34 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-1-3 12:07:03 | 显示全部楼层
回复【楼主位】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

这个一定要mark

出0入0汤圆

发表于 2012-1-3 12:35:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-3 16:19:53 | 显示全部楼层
mark,做键盘程序时用到过....

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-17 06:35

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

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