精选5_有限状态机.pptVIP

  • 6
  • 0
  • 约8.39千字
  • 约 38页
  • 2017-11-08 发布于湖北
  • 举报
5_有限状态机

* 通信软件设计 状态转换 状态转换是整个建模过程中最重要的一个部分,它用来定义有限状态机中的一个状态是如何切换到另一个状态的。例如,当用来控制城门的状态机处于Opened状态时,如果此时有Close事件产生,那么状态机的当前状态将切换到Closed状态,这样一个完整的过程在状态机模型中可以用closeDoor这样一个转换来进行描述。 * 通信软件设计 状态转换 要在FSME中添加这样一个转换,首先需要在界面左边的树形列表中选 States下的Opened项,然后按下键盘上的Insert键来添加一个新的转换,接着在右下角的Name文本框中输入转换的名字closeDoor,在Condition文本框中输入Close表明触发该转换的条件是事件Close的产生,在Target下拉框中选择Closed项表明该转换发生后状态机将被切换到Closed状态,最后再单击Apply按钮,一个新的状态转换关系就定义好了,如图5所示。用同样的办法可以添加状态机所需要的所有转换。 * 通信软件设计 事件建模 在FSME界面左边的树形列表中选 Events项,然后按下键盘上的Insert键来添加一个新的事件,接着在右下方的Name文本框中输入事件的名称,再单击Apply按钮,一个新的事件就创建好了。用同样的办法可以添加状态机所需要的所有事件 * 通信软件设计 自动生成状态机 使用FSME不仅能够进行可视化的状态机建模,更重要的是它还可以根据得到的模型自动生成用C++或者Python实现的状态机框架。首先在FSME界面左边的树形列表中选择Root项,然后在右下角的Name文本框中输入状态机的名字DoorFSM,再从Initial State下拉列表中选择状态Opened作为状态机的初始化状态。 * 通信软件设计 在将状态机模型保存为door.fsm文件之后,使用下面的命令可以生成包含有状态机定义的头文件: [xiaowp@linuxgam code]$ fsmc door.fsm -d -o DoorFSM. 进一步还可以生成包含有状态机实现的框架代码: [xiaowp@linuxgam code]$ fsmc door.fsm -d -impl DoorFSM.h -o DoorFSM.cpp    如果想对生成的状态机进行验证,只需要再手工编写一段用于测试的代码就可以了:  /*    * TestFSM.cpp    * 测试生成的状态机框架 */      #include “DoorFSM.h”       int main()    {  DoorFSM door;     door.A(DoorFSM::Close);    door.A(DoorFSM::Lock);   door.A(DoorFSM::Unlock);     door.A(DoorFSM::Open);   } * 通信软件设计 有限状态机是由事件来进行驱动的,在FSME生成的状态机框架代码中,方法A()可以被用来向状态机发送相应的事件,从而提供状态机正常运转所需要的动力。状态机负责在其内部维护一个事件队列,所有到达的事件都会先被放到事件队列中进行等候,从而能够保证它们将按照到达的先后顺序被依次处理。在处理每一个到达的事件时,状态机都会根据自己当前所处的状态,检查与该状态对应的转换条件是否已经被满足,如果满足的话则激活相应的状态转换过程。 使用下面的命令能够将生成的状态机框架和测试代码编译成一个可执行文件:   [xiaowp@Linuxgam code]$ g++ DoorFSM.cpp TestFSM.cpp -o fsm * 通信软件设计 小结 在面向对象的软件系统中,有些对象具有非常复杂的生命周期模型,使用有限状态机是描述这类对象最好的方法。 作为一种软件设计模式,有限状态机的概念虽然不算复杂,实现起来也并不困难,但它的问题是当状态机的模型复杂到一定的程度之后,会带来实现和维护上的困难。 Linux下的FSME是一个可视化的有限状态机建模工具,而且支持状态机框架代码的自动生成,借助它可以更加轻松地构建基于有限状态机的应用系统。 * 通信软件设计 实验要求 上机内容 完善doorFSM工程,要求: 1) 用户可循环输入事件,并输出事件发生后的城门状态。 2) 自定义跳出循环的条件。 编写一个成绩转换函数,要求: 1) 用户输入分数,程序自动转化成相应的等级。 2) 分数≥90,等级为优 90>分数≥80,等级为良 80>分数≥70,等级为中

文档评论(0)

1亿VIP精品文档

相关文档