欢迎来到亿配芯城! | 免费注册
你的位置:EEPROM带电可擦可编程IC存储器芯片大全-亿配芯城 > 芯片资讯 > 如何使用FSME来定制状态机
如何使用FSME来定制状态机
发布日期:2024-01-04 07:34     点击次数:159
定制状态机

目前得到的状态机已经能够响应来自外部的各种事件,并适当地调整自己当前所处的状态,也就是说已经实现了状态机引擎的功能,接下来要做的就是根据应用的具体需求来进行定制,为状态机加入与软件系统本身相关的那些处理逻辑。在FSME中,与具体应用相关的操作称为输出(Output),它们实际上就是一些需要用户给出具体实现的虚函数,自动生成的状态机引擎负责在进入或者退出某个状态时调用它们。

仍然以控制城门的那个状态机为例,假设我们希望在进入每个状态时都添加一部分处理逻辑。首在FSME界面左边的树形列表选择"Outputs"项,然后按下键盘上的Insert键来添加一个新的输出, EEPROM带电可擦可编程存储器芯片大全接着在右下方的"Name"文本框中输入相应的名称, ATMEGA系列ATMEL芯片COM再单击"Apply"按钮, 电子元器件PDF资料大全一个新的输出就创建好了, CMOS图像传感器集成电路芯片如图所示。用同样的办法可以添加状态机所需要的所有输出。

添加输出

图片

当所有的输出都定义好之后,芯片交易网IC交易网EEPROM带电可擦可编程存储器芯片大全接下来就可以为状态机中的每个状态绑定相应的输出。首先在FSME界面左侧的"States"项中选择相应的状态,然后从右下角的"Available"列表框中选择与该状态对应的输出,再单击"

图为状态设置输出

图片

由于对状态机模型进行了修改,我们需要再次生成状态机的框架代码,不过这次不需要加上-d参数:

[xiaowp@linuxgam code]$ fsmc door.fsm -o DoorFSM.h[xiaowp@linuxgam code]$ fsmc door.fsm -d -impl DoorFSM.h -o DoorFSM.cpp

我们在新的状态机模型中添加了enterOpend、enterClosed、enterLocked和enterUnlocked四个输出,因此生成的类DoorFSM中会包含如下几个纯虚函数:

virtual void enterOpened() = 0;virtual void enterLocked() = 0;virtual void enterUnlocked() = 0;virtual void enterClosed() = 0;

显然,此时生成的状态机框架不能够再被直接编译了,我们必须从类DoorFSM派生出一个子类,并提供对这几个纯虚函数的具体实现:

/* * DoorFSMLogic.h * 状态机控制逻辑的头文件 */#include "DoorFSM.h"class DoorFSMLogic : public DoorFSM{ protected:  virtual void enterOpened();  virtual void enterLocked();  virtual void enterUnlocked();  virtual void enterClosed();};

正如前面所提到过的,这几个函数实际上代表的正是应用系统的处理逻辑,作为例子我们只是简单地输出一些提示信息:

/* * DoorFSMLogic.cpp * 状态机控制逻辑的实现文件 */#include "DoorFSMLogic.h"#include void DoorFSMLogic::enterOpened(){    std::cout }void DoorFSMLogic::enterClosed(){    std::cout }void DoorFSMLogic::enterLocked(){    std::cout }void DoorFSMLogic::enterUnlocked(){    std::cout }

同样,为了对生成的状态机进行验证,我们还需要手工编写一段测试代码:

/* * TestFSM.cpp * 测试状态机逻辑 */#include "DoorFSMLogic.h"int main(){  DoorFSMLogic door;  door.A(DoorFSM::Close);  door.A(DoorFSM::Lock);  door.A(DoorFSM::Unlock);  door.A(DoorFSM::Open);}

使用下面的命令能够将生成的状态机框架和测试代码编译成一个可执行文件:

[xiaowp@linuxgam code]$ g++ DoorFSM.cpp DoorFSMLogic.cpp TestLogic.cpp -o logic

运行结果如下所示:

[xiaowp@linuxgam code]$ ./logicEnter Closed state.Enter Locked state.Enter Unlocked state.Enter Opened state.