发新帖我要提问
123
返回列表
打印

谁能给我们讲解下状态机的应用阿~

[复制链接]
楼主: Swd21ic
手机看帖
扫描二维码
随时随地手机跟帖
41
hanker510| | 2008-1-9 15:42 | 只看该作者 回帖奖励 |倒序浏览

请教 x_s_f老师 :

   手头有一个项目全部按状态机作的,典型的switch 结构。 当任务模块多了即好多个并列switch结构, 他们之间的组合不知道应该怎样去分析清楚,也许正是您说的 序列图吧 能介绍详细点吗? 或者说怎样去找这些资料? 谢谢

使用特权

评论回复
42
zuiai| | 2008-1-9 21:44 | 只看该作者

在看状态机

最近要用有限状态机的思想编一个小的控制系统的程序,借鉴~~

使用特权

评论回复
43
x_s_f| | 2008-1-9 22:04 | 只看该作者

状态机的分层, 并发和交互

状态机很复杂怎么办, 最有效的办法是把状态机按照分层和并发的方法来分解.
分层的意思是指: 状态机有些状态里包含有若干个小状态机, 但如果离开这个状态的话,这个状态里面所包含的状态机全部会变为无效, 这种状态叫做复合状态, 这样就可以把很复杂的状态机需求分解为如顶层状态机, 第二层, 第三层, ...这是一种非常行之有效的方法, 在化解复杂性的同时体现了状态机的生命周期, 但如果要重用就不是其所长了.

并发的意思是指:在执行一个动作或过程的同时还要能够照常响应其他事件, 或者同一个事件会引起不同状态机不同的动作, 比如在空闲的时候可能有若干个并行的状态机在运行, 但可能只有一个(主)状态机是真正在响应空闲时的事件的, 其他状态机可能只是在空转, 但如果(主)状态机如果接受某个事件而变迁到另一个状态, 可能会激活空闲时空转的那些并行状态机运行, 也切换到另一个状态, 这样相互合作从而完成一系列有效预定的任务. 并发不但能增强实时性, 降低复杂性, 而且能够达到状态机重用的目的, 如果你有若干复合状态都会执行同样的动作,不妨把他作为一个并发的模块来处理, 当然不可滥用, 因为并发的引入同样会引入状态机之间的同步等问题,可能使在某种情况下会带入不可预测的结果.

状态机之间的交互最常见和有效的就是信号和事件(消息), 信号一般会在发出后立即执行响应这个信号的状态机, 而事件发出后可能并不会马上执行, 可能进入事件队列然后执行其他任务等待下一个事件分发时时才真正执行, 当然这个根据具体实现会有所差别罗. 

关于这些知识大家可以看visual state的user manual, 上面还是说得很清楚的
对MDD(模型驱动开发)有兴趣的可参考UML和rhapsody.


使用特权

评论回复
44
x_s_f| | 2008-1-9 22:49 | 只看该作者

其实

某些时候有状态还不如无状态, 因为状态的引入同时带来了复杂和不安全性, 怎么说呢?
比如拿TCP和UDP协议来说
TCP是一个典型的状态机, 如果攻击者利用TCP连接时的状态机的空隙伪造合适的数据包就很有可能骗过防火墙, 从而建立有效连接, 这样便可非发截取数据.
而UDP是一个简单的报文, 发完了就没了,也不需要记住, 被伪造的机会就小多了, 写代码也不需要考虑那么多,当然了, 这只是一个简单的例子, 可能有些不合适, 大家也不要抓着字面不放 有更好的例子就分享出来.

一般来说状态机设计完成后要进行全面的测试, 主要是进行路径覆盖和穷尽测试等, 因为较为复杂状态机里面很可能存在一些死循环或想冲突的地方, 如在一个状态时可能会因为同样的事件或条件而变迁到两个不同的状态, 这肯定是不允许的. 现在一般使用自动化测试, 虽然还是会耗费相当时间, 但总比手工去编写测试用例要方便快捷多了, 大家也可多看下状态机测试方面的资料

使用特权

评论回复
45
bjluhaijun| | 2008-1-12 11:42 | 只看该作者

状态图的实现有三种方式

状态图的实现有三种方式:
1、switch
2、查表
3、函数指针

如果编译器支持函数指针,最好用指针。有些编编译器的函数指针,编译完代码会较长。如果不支持,只能用SWITCH.
    switch做层次式状态机会麻烦一些。
    在状态机中,事件队列还是比较重要的。

void Fsm_dispatch(Fsm *me) 
{
    State  s = me->State__;
    (*s)(me);             
    if (me->Sig_ == (Signal)0) {
       
        me->Sig_ = (Signal)EXIT_SIG;
        (*s)(me);               //源状态执行退出动作 */

        me->Sig_ = (Signal)ENTRY_SIG;
        (*me->State__)(me);     //目标状态执行进入动作 */
    }
}

使用特权

评论回复
46
cyber211| | 2008-1-17 17:24 | 只看该作者

ENABLE。indicate

在很多协议资料中关于状态机的描述 有ENABLE。indicate,什么意思??data。request,等等

使用特权

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

本版积分规则