打印

状态机 我深深陷入 switch() { case X: .....} 不能自拔

[复制链接]
8217|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
happy_snail|  楼主 | 2012-12-6 13:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2012-12-6 14:42 | 只看该作者
只是不要嵌套太多就行了

使用特权

评论回复
板凳
yicaiwu| | 2012-12-6 16:40 | 只看该作者
我也一样

使用特权

评论回复
地板
chenbb8| | 2012-12-6 20:47 | 只看该作者
使用QP_NANO可以省去状态的分支判断
具体参考 嵌入式系统的微模块化程序设计
你也可以直接上www.state-machine.com下载最新的QP_NANO,参考里面的定时炸*的例子。
需要注意的是,例子中使用了QP_NANO的QF/QK模块提供的抢占式和非抢占式的调度器,如果有自己熟悉的调度器的话,
可以只用QEP中的QFsm来设计程序(我就只参考了QFsm),有人在CSDN上发表了QEP的注释,虽然我没看,但你可以参考下
http://blog.csdn.net/lyqdy1/article/details/7085959
新版的Practical UML Statecharts in C/C++中文版,听说最近也会出版
到时候学习了HSM的实现技术,代码紧凑性应该还会进一步提高(我感觉现在代码的体积有点大)。
值得注意的是,在51上使用的时候,需要考虑函数的可重入性

使用特权

评论回复
5
chenbb8| | 2012-12-6 21:21 | 只看该作者
多一点考虑异步操作,同步操作当然会导致状态嵌套的问题
使用调度器的话,大部分状态机可以作为一个任务运行,在特定的时间下执行就行了。函数之间使用FIFO、栈、信号量来传递消息。

使用特权

评论回复
6
songhere| | 2012-12-6 23:54 | 只看该作者
有状态机的流程图,在写程序。。。

使用特权

评论回复
7
Tinnal| | 2012-12-7 09:04 | 只看该作者
对代码进行重构,不要什么代码都写在switch里面,要把功能代码进行封装,这样,在switch只会存在少量的几个函数的高层调用。

也可以重根本上从新调证状态机的状态数,这样,就可以从根本上解决每一状态的复杂程序度。

使用特权

评论回复
8
cheungman| | 2012-12-7 12:01 | 只看该作者
大状态机+小状态机, 进程+线程

使用特权

评论回复
9
HWM| | 2012-12-7 12:22 | 只看该作者
to LZ:

首先,对于一个状态机,switch case 分支语句不会有嵌套,仅可能有多个case(相应的状态比较多的话)。若觉得固定语句结构不灵活,可采用状态转移表(需要一个相应的数据结构)处理方式。

使用特权

评论回复
10
happy_snail|  楼主 | 2012-12-7 13:20 | 只看该作者
HWM 发表于 2012-12-7 12:22
to LZ:

首先,对于一个状态机,switch case 分支语句不会有嵌套,仅可能有多个case(相应的状态比较多的 ...

能给点 资料 吗?我研究一下!这方面的书籍 或资料 不知道怎么找呀?

使用特权

评论回复
11
小嘿| | 2012-12-7 13:25 | 只看该作者
从逻辑上说,一个switch case 就可以描述整个系统的状态了,所以这是状态划分的问题

使用特权

评论回复
12
happy_snail|  楼主 | 2012-12-8 09:10 | 只看该作者
顶起来 大家多说说自己的 方法呀

使用特权

评论回复
13
yanyanyan168| | 2012-12-8 17:19 | 只看该作者
我也是啊,感觉好没有水平:L!

使用特权

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

本版积分规则

9

主题

80

帖子

1

粉丝