打印

麻烦大虾过来开讲:状态机&事件

[复制链接]
1783|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
efen|  楼主 | 2014-5-4 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教关于状态机的概念,论坛上说状态机是基于事件触发的机制,事件发生、动作执行、状态迁移。
但是在写程序的时候怎么感觉事件的发生是在某状态下动作执行后产生的呢,比如说我要调用ModemSnd函数,在At_Idle状态下可能会根据改发送的指令产生SndNoRev和SndRev,那基于事件触发的机制如何理解?如图,还是本身状态图的划分就错误?


相关帖子

沙发
airwill| | 2014-5-4 19:21 | 只看该作者
状态机。
系统设定一个状态字以标记状态。
事件处理程序根据当前状态字(可以用 switch语句)做出对应的处理(包括切换状态)就可以了。

使用特权

评论回复
板凳
efen|  楼主 | 2014-5-4 19:58 | 只看该作者
airwill 发表于 2014-5-4 19:21
状态机。
系统设定一个状态字以标记状态。
事件处理程序根据当前状态字(可以用 switch语句)做出对应的处 ...

版本,我现在要涉及多层状态机的嵌套,switch case不好扩展维护,网上有种状态表实现,不过不得其精粹..

使用特权

评论回复
地板
lhchen922| | 2014-5-4 20:05 | 只看该作者
HSM

使用特权

评论回复
5
ayb_ice| | 2014-5-5 08:45 | 只看该作者
状态改变需要条件触发而已

条件可以是多种多样的

使用特权

评论回复
6
efen|  楼主 | 2014-5-5 08:56 | 只看该作者
ayb_ice 发表于 2014-5-5 08:45
状态改变需要条件触发而已

条件可以是多种多样的

那请问事件与条件应该怎么划分啊?

使用特权

评论回复
7
yewuyi| | 2014-5-5 08:59 | 只看该作者
对于写MCU代码来说,状态机是一种基于状态而控制代码流向的代码结构描述,这和事件触发没有必然关系。

不管是基于事件触发,还是基于时间触发,或者是事件和时间协作触发,甚至是流水帐代码,都可以使用状态机。

使用特权

评论回复
8
efen|  楼主 | 2014-5-5 09:20 | 只看该作者
本帖最后由 efen 于 2014-5-5 09:22 编辑
yewuyi 发表于 2014-5-5 08:59
对于写MCU代码来说,状态机是一种基于状态而控制代码流向的代码结构描述,这和事件触发没有必然关系。

不 ...

版主,我现在平台就是基于时间触发的,还有个疑问,就是如在一个函数连续调用子状态机的时候有什么高效处理避免再进入已执行的子状态机呢?而且有的子状态机还带参数返回。
如果在init再创建一个状态机会不会太臃肿了
init(void)
{
  modem_SendCmd(AA);
  modem_SendCmd(BB);
  if(modem_SendCmd(cc)) return 0;
  modem_SendCmd(DD);
}

使用特权

评论回复
9
ayb_ice| | 2014-5-5 09:31 | 只看该作者
efen 发表于 2014-5-5 08:56
那请问事件与条件应该怎么划分啊?

状态之间如何转换实际就是功能实现的算法具体化,这需要分析应用需求,

使用特权

评论回复
10
yewuyi| | 2014-5-5 10:37 | 只看该作者
efen 发表于 2014-5-5 09:20
版主,我现在平台就是基于时间触发的,还有个疑问,就是如在一个函数连续调用子状态机的时候有什么高效处 ...

在状态机中,从一个状态到另一个状态的变换是确定的过程,正确的状态机代码,不应该出现你所描述的现象。

同时,在状态机中,不存在所谓的函数调用状态机这种说法或者是方法,函数是状态机实现的载体,是从属于状态机的具体实施代码,某一个状态实施函数的返回值可作为转向其它状态的条件等。

使用特权

评论回复
11
yewuyi| | 2014-5-5 11:00 | 只看该作者
很多东西不是三句两句能说完的,需要你自己翻阅大量的书籍学习

使用特权

评论回复
12
efen|  楼主 | 2014-5-5 11:12 | 只看该作者
yewuyi 发表于 2014-5-5 10:37
在状态机中,从一个状态到另一个状态的变换是确定的过程,正确的状态机代码,不应该出现你所描述的现象。 ...

版主,以层次状态机来说的话 上一级状态机某状态的载体不就是下一级的状态机吗,跟我描述的现象有什么区别?

使用特权

评论回复
13
efen|  楼主 | 2014-5-5 11:13 | 只看该作者
版主有什么好资料推荐啊:lol

使用特权

评论回复
14
msblast| | 2014-5-5 11:59 | 只看该作者
1、lz想复杂了,状态图都画出来了,代码实现应该是容易的一环了。
2、有了互联网,很多资料都很容易找到。

用状态机原理进行软件设计.pdf

254.52 KB

用状态机原理进行软件设计SampleCode.rar

117.31 KB

使用特权

评论回复
15
menfiss| | 2014-5-5 16:58 | 只看该作者
efen 发表于 2014-5-4 19:58
版本,我现在要涉及多层状态机的嵌套,switch case不好扩展维护,网上有种状态表实现,不过不得其精粹.. ...

所有的状态表都要转化为语句,才能运行。
不过状态表对理解比较方便。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:得之坦然,失之淡然,争其必然,顺其自然。

51

主题

616

帖子

1

粉丝