0
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心
发布
  • 发文章

  • 发资料

  • 发帖

  • 提问

  • 发视频

创作活动

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

如何构建基于状态机的软件系统

我快闭嘴 来源:CSDN技术社区 作者:secondlife_cool 2022-09-14 10:55 次阅读

有限自动机(Finite Automata Machine)是计算机科学的重要基石,它在软件开发领域内通常被称作有限状态机(Finite State Machine),是一种应用非常广泛的软件设计模式(Design Pattern)。本文介绍如何构建基于状态机的软件系统,以及如何利用Linux下的工具来自动生成实用的状态机框架。

一、什么是状态机

有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在面向对象的软件系统中,一个对象无论多么简单或者多么复杂,都必然会经历一个从开始创建到最终消亡的完整过程,这通常被称为对象的生命周期。一般说来,对象在其生命期内是不可能完全孤立的,它必须通过发送消息来影响其它对象,或者通过接受消息来改变自身。在大多数情况下,这些消息都只不过是些简单的、同步的方法调用而已。例如,在银行客户管理系统中,客户类(Customer)的实例在需要的时候,可能会调用帐户(Account)类中定义的getBalance()方法。在这种简单的情况下,类Customer并不需要一个有限状态机来描述自己的行为,主要原因在于它当前的行为并不依赖于过去的某个状态。

遗憾的是并不是所有情况都会如此简单,事实上许多实用的软件系统都必须维护一两个非常关键的对象,它们通常具有非常复杂的状态转换关系,而且需要对来自外部的各种异步事件进行响应。例如,在VoIP电话系统中,电话类(Telephone)的实例必须能够响应来自对方的随机呼叫,来自用户的按键事件,以及来自网络的信令等。在处理这些消息时,类Telephone所要采取的行为完全依赖于它当前所处的状态,因而此时使用状态机就将是一个不错的选择。

游戏引擎是有限状态机最为成功的应用领域之一,由于设计良好的状态机能够被用来取代部分的人工智能算法,因此游戏中的每个角色或者器件都有可能内嵌一个状态机。考虑RPG游戏中城门这样一个简单的对象,它具有打开(Opened)、关闭(Closed)、上锁(Locked)、解锁(Unlocked)四种状态,如图1所示。当玩家到达一个处于状态Locked的门时,如果此时他已经找到了用来开门的钥匙,那么他就可以利用它将门的当前状态转变为Unlocked,进一步还可以通过旋转门上的把手将其状态转变为Opened,从而成功地进入城内。

图1 控制城门的状态机

2f45ac74-336b-11ed-ba43-dac502259ad0.jpg

在描述有限状态机时,状态、事件、转换和动作是经常会碰到的几个基本概念。

  • 状态(State)指的是对象在其生命周期中的一种状况,处于某个特定状态中的对象必然会满足某些条件、执行某些动作或者是等待某些事件。
  • 事件(Event)指的是在时间和空间上占有一定位置,并且对状态机来讲是有意义的那些事情。事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。
  • 转换(Transition)指的是两个状态之间的一种关系,表明对象将在第一个状态中执行一定的动作,并将在某个事件发生- 同时某个特定条件满足时进入第二个状态。
  • 动作(Action)指的是状态机中可以执行的那些原子操作,所谓原子操作指的是它们在运行的过程中不能被其他消息所中断,必须一直执行下去。

二、手工编写状态机

与其他常用的设计模式有所不同,程序员想要在自己的软件系统中加入状态机时,必须再额外编写一部分用于逻辑控制的代码,如果系统足够复杂的话,这部分代码实现和维护起来还是相当困难的。在实现有限状态机时,使用switch语句是最简单也是最直接的一种方式,其基本思路是为状态机中的每一种状态都设置一个case分支,专门用于对该状态进行控制。下面的代码示范了如何运用switch语句,来实现图1中所示的状态机:

switch (state)  {

  // 处理状态Opened的分支
  case (Opened): {
    // 执行动作Open
    open();
    // 检查是否有CloseDoor事件
    if (closeDoor()) {
      // 当前状态转换为Closed
      changeState(Closed)
    }
    break;
  }

  // 处理状态Closed的分支
  case (Closed): {
    // 执行动作Close
    close();
    // 检查是否有OpenDoor事件
    if (openDoor()) {
      // 当前状态转换为Opened
      changeState(Opened);
    }
    // 检查是否有LockDoor事件
    if (lockDoor()) {
      // 当前状态转换为Locked
      changeState(Locked);
    }
    break;
  }

  // 处理状态Locked的分支
  case (Locked): {
    // 执行动作Lock
    lock();
    // 检查是否有UnlockDoor事件
    if (unlockDoor()) {
      // 当前状态转换为Unlocked
      changeState(Unlocked);
    }
    break;
  }

  // 处理状态Unlocked的分支
  case (Unlocked): {
    // 执行动作Unlock
    unlock();
    // 检查是否有LockDoor事件
    if (lockDoor()) {
      // 当前状态转换为Locked
      changeState(Locked)
    }
    // 检查是否有OpenDoor事件
    if (openDoor()) {
      // 当前状态转换为Opened
      changeSate(Opened);
    }
    break;
  }
}

使用switch语句实现的有限状态机的确能够很好地工作,但代码的可读性并不十分理想,主要原因是在实现状态之间的转换时,检查转换条件和进行状态转换都是混杂在当前状态中来完成的。例如,当城门处于Opened状态时,需要在相应的case中调用closeDoor()函数来检查是否有必要进行状态转换,如果是的话则还需要调用changeState()函数将当前状态切换到Closed。显然,如果在每种状态下都需要分别检查多个不同的转换条件,并且需要根据检查结果让状态机切换到不同的状态,那么这样的代码将是枯燥而难懂的。从代码重构的角度来讲,此时更好的做法是引入checkStateChange()和performStateChange()两个函数,专门用来对转换条件进行检查,以及激活转换时所需要执行的各种动作。这样一来,程序结构将变得更加清晰:

switch (state)  {

  // 处理状态Opened的分支
  case (Opened): {
    // 执行动作Open
    open();
    // 检查是否有激发状态转换的事件产生
    if (checkStateChange()) {
      // 对状态机的状态进行转换
      performStateChange();
    }
    break;
  }

  // 处理状态Closed的分支
  case (Closed): {
    // 执行动作Close
    close();
    // 检查是否有激发状态转换的事件产生
    if (checkStateChange()) {
      // 对状态机的状态进行转换
      performStateChange();
    }
    break;
  }

  // 处理状态Locked的分支
  case (Locked): {
    // 执行动作Lock
    lock();
    // 检查是否有激发状态转换的事件产生
    if (checkStateChange()) {
      // 对状态机的状态进行转换
      performStateChange();
    }
    break;
  }

  // 处理状态Unlocked的分支
  case (Unlocked): {
    // 执行动作Lock
    unlock();
    // 检查是否有激发状态转换的事件产生
    if (checkStateChange()) {
      // 对状态机的状态进行转换
      performStateChange();
    }
    break;
  }
}

但checkStateChange()和performStateChange()这两个函数本身依然会在面对很复杂的状态机时,内部逻辑变得异常臃肿,甚至可能是难以实现。

在很长一段时期内,使用switch语句一直是实现有限状态机的唯一方法,甚至像编译器这样复杂的软件系统,大部分也都直接采用这种实现方式。但之后随着状态机应用的逐渐深入,构造出来的状态机越来越复杂,这种方法也开始面临各种严峻的考验,其中最令人头痛的是如果状态机中的状态非常多,或者状态之间的转换关系异常复杂,那么简单地使用switch语句构造出来的状态机将是不可维护的。

三、自动生成状态机

为实用的软件系统编写状态机并不是一件十分轻松的事情,特别是当状态机本身比较复杂的时候尤其如此,许多有过类似经历的程序员往往将其形容为"毫无创意"的过程,因为他们需要将大量的时间与精力倾注在如何管理好状态机中的各种状态上,而不是程序本身的运行逻辑。作为一种通用的软件设计模式,各种软件系统的状态机之间肯定会或多或少地存在着一些共性,因此人们开始尝试开发一些工具来自动生成有限状态机的框架代码,而在Linux下就有一个挺不错的选择──FSME(Finite State Machine Editor)。

图2 可视化的FSME

2f6555b0-336b-11ed-ba43-dac502259ad0.jpg

FSME是一个基于Qt的有限状态机工具,它能够让用户通过图形化的方式来对程序中所需要的状态机进行建模,并且还能够自动生成用C++或者Python实现的状态机框架代码。下面就以图1中城门的状态机为例,来介绍如何利用FSME来自动生成程序中所需要的状态机代码。

3.1状态机建模

首先运行fsme命令来启动状态机编辑器,然后单击工具栏上的"New"按钮来创建一个新的状态机。FSME中用于构建状态机的基本元素一共有五种:事件(Event)、输入(Input)、输出(Output)、状态(State)和转换(Transition),在界面左边的树形列表中可以找到其中的四种。

  • 状态建模

在FSME界面左边的树形列表中选择"States"项,然后按下键盘上的Insert键来插入一个新的状态,接着在右下方的"Name"文本框中输入状态的名称,再在右上方的绘图区域单击该状态所要放置的位置,一个新的状态就创建好了。用同样的办法可以添加状态机所需要的所有状态,如图3所示。

图3 状态建模

2f763d6c-336b-11ed-ba43-dac502259ad0.jpg

  • 事件建模

在FSME界面左边的树形列表中选择"Events"项,然后按下键盘上的Insert键来添加一个新的事件,接着在右下方的"Name"文本框中输入事件的名称,再单击"Apply"按钮,一个新的事件就创建好了。用同样的办法可以添加状态机所需要的所有事件,如图4所示。

2f8604ea-336b-11ed-ba43-dac502259ad0.jpg

  • 转换建模

状态转换是整个建模过程中最重要的一个部分,它用来定义有限状态机中的一个状态是如何切换到另一个状态的。例如,当用来控制城门的状态机处于Opened状态时,如果此时有Close事件产生,那么状态机的当前状态将切换到Closed状态,这样一个完整的过程在状态机模型中可以用closeDoor这样一个转换来进行描述。

要在FSME中添加这样一个转换,首先需要在界面左边的树形列表中选择"States"下的"Opened"项,然后按下键盘上的Insert键来添加一个新的转换,接着在右下角的"Name"文本框中输入转换的名字"closeDoor",在"Condition"文本框中输入"Close"表明触发该转换的条件是事件Close的产生,在"Target"下拉框中选择"Closed"项表明该转换发生后状态机将被切换到Closed状态,最后再单击"Apply"按钮,一个新的状态转换关系就定义好了,如图5所示。用同样的办法可以添加状态机所需要的所有转换。

图5 转换建模

2f968d38-336b-11ed-ba43-dac502259ad0.jpg

3.2 生成状态机框架

使用FSME不仅能够进行可视化的状态机建模,更重要的是它还可以根据得到的模型自动生成用C++或者Python实现的状态机框架。首先在FSME界面左边的树形列表中选择"Root"项,然后在右下角的"Name"文本框中输入状态机的名字"DoorFSM",再从"Initial State"下拉列表中选择状态"Opened"作为状态机的初始化状态,如图6所示。

图6 设置初始属性

2fa07442-336b-11ed-ba43-dac502259ad0.jpg

在将状态机模型保存为door.fsm文件之后,使用下面的命令可以生成包含有状态机定义的头文件:

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

进一步还可以生成包含有状态机实现的框架代码:

[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

由于之前在用fsmc命令生成状态机代码时使用了-d选项,生成的状态机框架中会包含一定的调试信息,包括状态机中每次状态转换时的激活事件、转换前的状态、所经历的转换、转换后的状态等,如下所示:

[xiaowp@linuxgam code]$ ./fsm
DoorFSM'Close'
DoorFSM'Opened'
DoorFSM'closeDoor'
DoorFSM:new state:'Closed'
DoorFSM'Lock'
DoorFSM'Closed'
DoorFSM'lockDoor'
DoorFSM:new state:'Locked'
DoorFSM'Unlock'
DoorFSM'Locked'
DoorFSM'unlockDoor'
DoorFSM:new state:'Unlocked'
DoorFSM'Open'
DoorFSM'Unlocked'
DoorFSM'openDoor'
DoorFSM:new state:'Opened'

3.3 定制状态机

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

仍然以控制城门的那个状态机为例,假设我们希望在进入每个状态时都添加一部分处理逻辑。首在FSME界面左边的树形列表选择"Outputs"项,然后按下键盘上的Insert键来添加一个新的输出,接着在右下方的"Name"文本框中输入相应的名称,再单击"Apply"按钮,一个新的输出就创建好了,如图7所示。用同样的办法可以添加状态机所需要的所有输出。

图7 添加输出

2fc0de9e-336b-11ed-ba43-dac502259ad0.jpg

当所有的输出都定义好之后,接下来就可以为状态机中的每个状态绑定相应的输出。首先在FSME界面左侧的"States"项中选择相应的状态,然后从右下角的"Available"列表框中选择与该状态对应的输出,再单击"<"按钮将其添加到"In"列表中,如图8所示。用同样的办法可以为状态机中的所有状态设置相应的输出,同一个状态可以对应有多个输出,其中In列表中的输出会在进入该状态时被调用,而Out列表中的输出则会在退出该状态时被调用,输出调用的顺序是与其在In或者Out列表中的顺序相一致的。

图8 为状态设置输出

2fdbb1c4-336b-11ed-ba43-dac502259ad0.jpg

由于对状态机模型进行了修改,我们需要再次生成状态机的框架代码,不过这次不需要加上-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 << "Enter Opened state." << std::endl;
}

void DoorFSMLogic::enterClosed()
{
    std::cout << "Enter Closed state." << std::endl;
}

void DoorFSMLogic::enterLocked()
{
    std::cout << "Enter Locked state." << std::endl;
}

void DoorFSMLogic::enterUnlocked()
{
    std::cout << "Enter Unlocked state." << std::endl;
}

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

/*
 * 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]$ ./logic
Enter Closed state.
Enter Locked state.
Enter Unlocked state.
Enter Opened state.

本文涉及代码下载http://www.uml.org.cn/umlcode/code.zip

四、小结

在面向对象的软件系统中,有些对象具有非常复杂的生命周期模型,使用有限状态机是描述这类对象最好的方法。作为一种软件设计模式,有限状态机的概念虽然不算复杂,实现起来也并不困难,但它的问题是当状态机的模型复杂到一定的程度之后,会带来实现和维护上的困难。Linux下的FSME是一个可视化的有限状态机建模工具,而且支持状态机框架代码的自动生成,借助它可以更加轻松地构建基于有限状态机的应用系统。

参考资料

  • 从Wiki百科全书 http://en.wikipedia.org/wiki/Finite_state_automaton开始,你可以了解到许多同状态机相关的计算理论知识。

  • 状态机是UML的一个重要组成部分,Robert C. Martin在他的文章UML Tutorial: Finite State Machines中,介绍了如何使用UML语言来对状态机进行建模,你可以通过网址 http://www.objectmentor.com/resources/articles/umlfsm.pdf可以找到这一文档。

  • FSME是Linux下一个基于Qt的状态机建模工具,它能够自动生成状态机框架代码,并且同时支持C++和Python语言,通过网站 http://fsme.sourceforge.net/你可以了解到有关FSME的更多信息,并能够下载最新版本的FSME。

  • Qfsm也是一个运行在Linux下的状态机建模工具,它不仅提供了可视化的状态机编辑器,而且还能够对生成的状态机进行实时模拟,通过网站 http://qfsm.sourceforge.net/可以了解到Qfsm的更多信息。


				
						审核编辑:汤梓红

  • Linux
    +关注

    关注

    83

    文章

    9007

    浏览量

    204241
  • 状态机
    +关注

    关注

    2

    文章

    237

    浏览量

    26636
  • 软件系统
    +关注

    关注

    0

    文章

    31

    浏览量

    9317
收藏 人收藏

    评论

    相关推荐

    状态机编程

    ,有限状态机(FSM)是实时系统设计中的一种数学模型,是一种重要的、易于建立的、应用比较广泛的、以描述控制特性为主的建模方法,它可以应用于从系统分析到设计(包括硬件、软件)的所有阶段。很多实时系统,特别是
    发表于 07-10 18:00

    raw os 之状态机编程

    状态机编程的历史很可能久于传统的操作系统, 传统的一个大while 循环模式普遍用到了状态机模式编程, 状态机一般是基于fsm 的有限状态机,或者更先进点的是hsm 分层的状态机。具体的fsm 以及
    发表于 02-27 14:35

    状态机是什么意思

    刚开始学fpga,读资料,有些名词不太理解,比如状态机,我只知道fpga就是由查找表和触发器构成的,状态机这个概念是怎么提出来的,干什么使得,求大神讲解,什么情况下用到
    发表于 04-25 18:35

    状态机

    控制状态机控制状态机的初始化和状态转换的最佳方法是使用枚丽型输入控件。一般使用自定义类型的枚丽变量。使用子定义类型的枚丽变量可以是控件和实例乊间存在关联,使得添加或删除状态时所有的枚丽型输入控件副本自动更新。
    发表于 02-13 12:39

    FPGA状态机

    FPGA状态机的文书资料
    发表于 09-14 19:01

    队列状态机

    应用LabView做的连接mdb数据库,应用队列状态机
    发表于 02-05 22:58

    Labview状态机

    本帖最后由 afnuaa 于 2017-5-24 11:22 编辑 状态机是一种普遍而有效的架构,我们可以利用状态机设计模式来实现状态图或流程图的算法。State Machines
    发表于 05-23 17:11

    状态机如何暂停

    程序一运行 就开始自动运行程序 状态机各种各种状态开始执行 我这里是布尔变量 每一秒点亮一个布尔按钮。我现在想在界面增加一个暂停按钮 当点暂停时候 此时暂停按钮文字成为继续 如果 状态机执行第二步
    发表于 04-09 09:23

    事件状态机

    事件状态机
    发表于 11-07 16:24

    基于状态机的嵌入式系统开发

    给大家分享下,基于状态机的嵌入式系统开发,慢慢看吧
    发表于 12-22 19:44

    labVIEW状态机在实战中的应用(基础)

    状态机的使用在实战项目中是经常使用到的,可能每个公司所用的LabVIEW测试框架不同,但是状态机的使用一定不可避免,所以要理解一个LabVIEW测试框架。就必须看懂并学会使用状态机。每一本书都会
    发表于 12-25 16:53

    状态机是什么?什么是消息触发类型的状态机

    状态机可归纳为哪几个要素?状态机可分为哪几种?什么是消息触发类型的状态机
    发表于 04-19 06:02

    怎么运用状态机提高嵌入式软件效率?

    如何建立有限状态机的模型?如何利用状态机进行软件设计?如何使用状态机的效能分析?
    发表于 04-28 06:21

    什么是状态机状态机是如何编程的?

    什么是状态机状态机是如何编程的?
    发表于 10-20 07:43

    什么是有限状态机

    在嵌入式,机器人领域,由于多的复杂逻辑状态,我们编写程序的时候不得不考虑很多种情况,容易造成功能间的冲突。有限状态机(finite-state machine),简称状态机,是一种表示有限个状态以及状态间转移等行为的数学模型。状态机简单来说
    发表于 12-20 06:51

    什么是状态机状态机的三种实现方法

    文章目录1、什么是状态机?2、状态机编程的优点(1)提高CPU使用效率(2) 逻辑完备性(3)程序结构清晰3、状态机的三种实现方法switch—case 法表格驱动法函数指针法小节摘要:不知道大家
    发表于 12-22 06:51

    什么是状态机

    一. 什么是状态机我们以生活中的小区的停车系统为例:停车杆一般没车的是不动的(初态),有车来的时候需要抬杆(状态1),车通过需要放杆(状态2),如果在放杆的过程中突然有车,又需要抬杆(状态3
    发表于 01-06 08:01

    MCU裸机编程状态机的定义与注意事项是什么

    状态机软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有
    发表于 02-14 06:02

    状态机的相关资料下载

    share,作者:亚索老哥)),原来状态机还可以这么简单地玩~~亚索老哥提出的状态机六步法(1)、定义状态接口(2)、定义系统当前状态指针(3)、定义具体状态,根据状态迁移图来实现具体功能和状态切换(4)、定义主程序上下文操作接口(6)、主程序通
    发表于 02-15 06:01

    状态机实例(VHDL源代码)

    状态机实例(VHDL源代码):
    发表于 05-27 10:27 54次下载
    <b>状态机</b>实例(VHDL源代码)

    如何写好状态机

    如何写好状态机:状态机是逻辑设计的重要内容,状态机的设计水平直接反应工程师的逻辑功底,所以许多公司的硬件和逻辑工程师面试中,状态机设计几乎是必选题目。本章在引入
    发表于 06-14 19:24 96次下载

    基于有限状态机的工控系统软件设计

    通过分析工控系统的特性,提出采用状态机的思想进行工控软件设计。详细论述了高速状态机的错步问题以及控制层中状态机状态划分问题。结合具体的应用实例,给出了基于状
    发表于 08-10 14:26 30次下载

    状态机代码生成工具

    状态机代码生成工具状态机代码生成工具状态机代码生成工具状态机代码生成工具
    发表于 11-19 15:12 8次下载

    状态机原理及用法

    状态机原理及用法状态机原理及用法状态机原理及用法
    发表于 03-15 15:25 54次下载

    CAN控制器状态机的分析与实现

    CAN 状态机包含:总线脱离、总线启动、总线空闲、模式选择、发送模式、接收模式、错误模式、间歇模式、超载模式及挂起模式等状态。 CAN 状态机状态编码采用一种类似 One-Hot 的编码方式。其
    发表于 03-22 16:03 11次下载

    嵌入式软件状态机的抽象与实现

    文中提出了 在嵌入式软件中把状态机作为一个独立模块从控制模块中抽象出来的思想 , 描述了 抽象出来的状态机模块 。 并介绍了 如何将这种状态机抽象模块应用到实际项目中 。
    发表于 03-22 15:47 1次下载

    有限状态机在嵌入式系统中的实现及应用

    如何使嵌入式软件代码更加可靠 增强程序的可维护性 一直以来都是嵌入式程序员追 求的目标。论述了有限状态机的原理和其实现方法;采用状态机方法编写了一个按键扫描程序介绍了状态机编程在嵌入式系统中的实际应用和优点。
    发表于 03-22 15:40 1次下载

    有限状态机的建模与优化设计

    本文提出一种优秀 、高效的 Verilog HDL 描述方式来进行有限状态机设计 介绍了 有限状态机的建模原则 并通过一个可综合的实例 验证了 该方法设计的有限状态机在面积和功耗上的优势。
    发表于 03-22 15:19 1次下载

    VHDL有限状态机设计-ST

    EDA的有限状态机,广义而言是指只要涉及触发器的电路,无论电路大小都可以归结为状态机。有限状态机设计在学习EDA时是很重要的一章。
    发表于 06-08 16:46 3次下载

    有限状态机在数控系统软件中的应用研究

    有限状态机在数控系统软件中的应用研究,感兴趣的小伙伴们可以看看。
    发表于 07-26 10:43 20次下载

    有限状态机在嵌入式软件中的应用

    有限状态机在嵌入式软件中的应用,感兴趣的小伙伴们可以看看。
    发表于 07-26 10:43 26次下载

    状态机VHDL程序

    状态机VHDL程序,感兴趣的小伙伴们可以瞧一瞧。
    发表于 11-11 15:51 4次下载

    基于有限状态机的自动门控系统软件设计_田龙

    基于有限状态机的自动门控系统软件设计_田龙
    发表于 03-04 18:04 1次下载

    如何使用FPGA实现序列检测有限状态机

    有限状态机是绝大部分控制电路的核心结构, 是表示有限个状态以及在这些状态之间转移和动作等行为的数学模型。有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。一般来说, 除了输入部分和
    发表于 11-04 17:17 12次下载
    如何使用FPGA实现序列检测有限<b>状态机</b>

    使用独立于内核的外设构建硬件状态机

    状态机是逻辑单元、存储器单元和反馈的组合。状态机的输入与状态机的当前状态组合在一起,确定下一个状态。当出现状态时钟时,下一个状态成为当前状态状态机的输出由当前状态决定。
    发表于 03-30 15:58 7次下载
    使用独立于内核的外设<b>构建</b>硬件<b>状态机</b>

    使用Synplify设计安全的VHDL状态机

    Synplify的优势之一是有限状态机编译器。 这是一个强大的功能,不仅具有自动检测状态机中的状态的能力源代码,并使用顺序编码,灰色编码或一键编码实现它们。但也要进行可达性分析,以确定所有可能的状态达到并优化掉所有无法达到的状态和转换逻辑。因此,产生状态机的高度优化的最终实现
    发表于 04-07 09:20 10次下载
    使用Synplify设计安全的VHDL<b>状态机</b>

    基于Moore型状态机的交通灯控制系统

    基于Moore型状态机的交通灯控制系统
    发表于 06-17 09:14 20次下载

    基于状态机的汽车电动滑移门系统

    基于状态机的汽车电动滑移门系统
    发表于 07-02 15:23 6次下载

    利用状态机实现对tlc5620dac控制.

    利用状态机实现对tlc5620dac控制.(西工大现代电源技术答案)-利用状态机实现对tlc5620dac控制.适合感兴趣的学习者学习.
    发表于 09-16 12:21 11次下载
    利用<b>状态机</b>实现对tlc5620dac控制.

    [单片笔记]使用状态机扫描矩阵键盘

    目录1 前言2 状态机2.1 什么是状态机2.2 状态机的概念2.3 使用状态机写键盘的思路3 代码实例3.1 使用软件3.2 protues电路图3.2 状态机部分程序3.3 Keil工程文件和
    发表于 11-29 13:21 4次下载
    [单片<b>机</b>笔记]使用<b>状态机</b>扫描矩阵键盘

    MCU裸机编程的状态机框架--第一部分

    最高效的一种形式。可能很多人认为裸机中状态机比较low,怎么也要搞一个RTOS,更甚着要跑Linux才觉得高大上。其实,这都是误区,适合自己的才是最好的,做产品也一样,满足需求很重要。1 状态机的概念状态机软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应
    发表于 12-09 13:21 17次下载
    MCU裸机编程的<b>状态机</b>框架--第一部分

    状态模式(状态机)

    share,作者:亚索老哥)),原来状态机还可以这么简单地玩~~亚索老哥提出的状态机六步法(1)、定义状态接口(2)、定义系统当前状态指针(3)、定义具体状态,根据状态迁移图来实现具体功能和状态切换(4)、定义主程序上下文操作接口(6)、主程序通
    发表于 12-16 16:53 3次下载
    <b>状态</b>模式(<b>状态机</b>)

    LABVIEW的状态机实现资料合集

    LABVIEW的状态机实现资料合集
    发表于 01-04 11:18 32次下载

    C语言状态机编程思想

    关注、星标公众号,直达精彩内容文章来源:头条-嵌入式在左C语言在右链接:https://www.toutiao.com/i6843028812112855564/有限状态机概念有限状态机...
    发表于 01-13 13:32 12次下载
    C语言<b>状态机</b>编程思想

    51中断系统与vhdl状态机

    51中断系统与vhdl状态机51中断系统与vhdl状态机51单片中断系统1.为什么要引入中断?51中断系统与vhdl状态机51单片中断系统1.为什么要引入中断?中断是为使单片机具有对外部或内部
    发表于 01-14 14:58 2次下载
    51中断<b>系统</b>与vhdl<b>状态机</b>

    如何以面向对象的思想设计有限状态机

    有限状态机又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型,用英文缩写也被简...
    发表于 02-07 11:23 2次下载
    如何以面向对象的思想设计有限<b>状态机</b>

    单片状态机浅谈

    说到单片编程,不得不说到状态机状态机做为软件编程的主要架构已经在各种语言中应用,当然包括C语言,在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。灵活的应用状态机不仅是程序更高效,而且
    发表于 02-10 10:44 7次下载
    单片<b>机</b>之<b>状态机</b>浅谈

    labview状态机分享

    labview状态机
    发表于 10-31 15:50 5次下载

    按键状态机代码

    自己写的按键状态机,需要的时候根据情况修改一下
    发表于 03-27 10:42 1次下载

    状态机思路在单片程序设计中的应用

    状态机思路在单片程序设计中的应用 状态机的概念状态机软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,
    发表于 02-09 11:25 9871次阅读
    <b>状态机</b>思路在单片<b>机</b>程序设计中的应用

    状态机举例

    状态机举例 你可以指定状态寄存器和状态机状态。以下是一个有四种状态的普通状态机。 // These are the symbolic names for states// 定义状态的符号名称parameter  [1
    发表于 03-28 15:18 783次阅读

    状态机“毛刺”的产生及消除方法

      随着EDA技术的高速发展, 以大规模和超大规模器件FPGA/CPLD为载体、以VHDL(硬件描述语言)为工具的电子系统设计越来越广泛。有限状态机(简称状态机)作为数字系统控制单元的重
    发表于 09-07 18:07 1848次阅读
    <b>状态机</b>“毛刺”的产生及消除方法

    状态机在嵌入式系统中的应用

    为了便于研究和描述状态机在嵌入式前后台软件系统中的应用,本文将以移动2G光纤直放站近端的监控软件案例来阐述和说明。
    发表于 05-23 10:48 1864次阅读
    <b>状态机</b>在嵌入式<b>系统</b>中的应用

    防盗报警单元工作原理及其状态机的设计

    本文首先介绍防盗报警单元(以下简称ATA)的工作原理及其状态机的设计,然后介绍了声光警示、安全锁车的机制及其软件实现。
    发表于 10-24 16:33 1380次阅读
    防盗报警单元工作原理及其<b>状态机</b>的设计

    FPGA工程师:如何在FPGA中实现状态机

    安全高效的状态机设计对于任何使用FPGA的工程师而言都是一项重要技能。选择Moore状态机、Mealy状态机还是混合取决于整个系统的需求。无论选择哪种类型的状态机,充分掌握实现方案所需的工具和技巧,将确保您实现最佳解决方案。本文主要介绍如何在FPGA中实现状态机
    发表于 03-29 15:02 1.2w次阅读
    FPGA工程师:如何在FPGA中实现<b>状态机</b>?

    使用ModelSim自动生成状态机FSM的状态转换图

    HDL代码设计中重要的内容之一就是设计程序的状态机FSM,状态转换控制着整个程序的流程,为了理解程序,我们经常需要把状态机状态转换图画出来,这样看起来很直观,但是,有没有办法自动生成状态转换图呢?
    发表于 02-10 15:39 1.3w次阅读
    使用ModelSim自动生成<b>状态机</b>FSM的<b>状态</b>转换图

    利用状态机状态机实现层次结构化设计

    练习九.利用状态机的嵌套实现层次结构化设计目的:1.运用主状态机与子状态机产生层次化的逻辑设计;
    发表于 02-11 05:52 2813次阅读
    利用<b>状态机</b>的<b>状态机</b>实现层次结构化设计

    初学者对有限状态机(FSM)的设计的认识

    有限状态机(FSM)是一种常见的电路,由时序电路和组合电路组成。设计有限状态机的第一步是确定采用Moore状态机还是采用Mealy状态机
    发表于 02-11 13:51 3580次阅读
    初学者对有限<b>状态机</b>(FSM)的设计的认识

    状态机原理进行软件设计

    第1章 引言 20 多年以前,David Harel 创造了状态机理论来描述复杂的交互系统。随后,状态机理论赢得了广泛的接受,并且被引入到许多软件系统中,最突出的是被引入到UML 中作为其一个
    发表于 12-02 15:03 266次阅读

    利用74LS161实现复杂状态机

    本文主要介绍了是如何利用74LS161实现复杂状态机的。时序逻辑电路的数学模型是有限状态机。有限状态机它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。本文主要讨论使用MSI同步计数器74LS161进行复杂状态机的设
    发表于 01-18 09:00 7272次阅读
    利用74LS161实现复杂<b>状态机</b>

    如何对状态机的程序进行灵活修改

    状态机最主要的特点就是灵活性,这个优势在程序后期的维护上更会显示出来,本集中工程师将展现出状态机是如何轻松对程序进行灵活修改,从而满足日益复杂的开发要求。
    的头像 发表于 06-14 03:19 2736次阅读
    如何对<b>状态机</b>的程序进行灵活修改

    简述使用QII状态机向导如何创建一个状态机

    如何使用QII状态机向导创建一个状态机
    的头像 发表于 06-20 00:11 3558次阅读
    简述使用QII<b>状态机</b>向导如何创建一个<b>状态机</b>

    状态机和组合逻辑的冒险竞争浅析

    有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机。Moore型状态机输出仅仅与现态有关和Mealy型
    发表于 06-25 08:42 3138次阅读

    状态机概述 如何理解状态机

    本篇文章包括状态机的基本概述以及通过简单的实例理解状态机
    的头像 发表于 01-02 18:03 8773次阅读
    <b>状态机</b>概述  如何理解<b>状态机</b>

    正点原子开拓者FPGA视频:状态机

    状态机状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作,完成特定操作的控制中心。状态机分为摩尔(Moore)型状态机和米莉(Mealy)型状态机
    的头像 发表于 09-19 07:00 1893次阅读
    正点原子开拓者FPGA视频:<b>状态机</b>

    FPGA之状态机的功能简述与学习建议

    状态机状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作,完成特定操作的控制中心。状态机分为摩尔(Moore)型状态机和米莉(Mealy)型状态机
    的头像 发表于 10-09 07:07 2703次阅读

    基于FPGA实现状态机的设计

    状态机有三种描述方式:一段式状态机、两段式状态机、三段式状态机。下面就用一个小例子来看看三种方式是如何实现的。
    的头像 发表于 08-29 06:09 2103次阅读
    基于FPGA实现<b>状态机</b>的设计

    数字设计FPGA应用:时钟同步状态机设计方法构建序列发生器

    状态机状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作,完成特定操作的控制中心。状态机分为摩尔(Moore)型状态机和米莉(Mealy)型状态机
    的头像 发表于 12-04 07:04 2479次阅读
    数字设计FPGA应用:时钟同步<b>状态机</b>设计方法<b>构建</b>序列发生器

    数字设计FPGA应用:时钟同步状态机的设计

    状态机状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。
    的头像 发表于 12-04 07:03 2519次阅读
    数字设计FPGA应用:时钟同步<b>状态机</b>的设计

    FPGA之状态机练习:设计思路(5)

    状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。
    的头像 发表于 10-09 07:04 1631次阅读

    FPGA之状态机练习:设计思路(4)

    状态机状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作,完成特定操作的控制中心。状态机分为摩尔(Moore)型状态机和米莉(Mealy)型状态机
    的头像 发表于 05-28 07:03 2263次阅读

    字符状态机系统架构与模块功能介绍

    状态机状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。
    的头像 发表于 11-22 07:06 1736次阅读

    状态机如何简化PLC程序的编写

    在PLC程序的编写过程中,可以使用状态机的控制思路,将一些复杂的控制过程使用状态机的方法处理。这里简单给大家介绍一下什么是状态机?如下图所示,为一个状态机状态图。
    的头像 发表于 09-10 14:44 2157次阅读
    <b>状态机</b>如何简化PLC程序的编写

    什么是状态机 状态机的描述三种方法

    状态机 1、状态机是许多数字系统的核心部件,是一类重要的时序逻辑电路。通常包括三个部分:一是下一个状态的逻辑电路,二是存储状态机当前状态的时序逻辑电路,三是输出组合逻辑电路。 2、根据状态机的输出
    的头像 发表于 11-16 17:39 1.7w次阅读

    使用函数指针的方法实现状态机

    之前写过一篇状态机的实用文章,很多朋友说有几个地方有点难度不易理解,今天给大家换种简单写法,使用函数指针的方法实现状态机状态机简介 有限状态机FSM是有限个状态及在这些状态之间的转移和动作等行为
    的头像 发表于 10-19 09:36 1787次阅读
    使用函数指针的方法实现<b>状态机</b>

    浅谈状态机的要素、分类

    说到单片编程,不得不说到状态机状态机做为软件编程的主要架构已经在各种语言中应用,当然包括C语言,在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。灵活的应用状态机不仅是程序更高效,而且
    的头像 发表于 10-20 17:27 3137次阅读

    状态机到底是什么

    状态机在实际工作开发中应用非常广泛,在刚进入公司的时候,根据公司产品做流程图的时候,发现自己经常会漏了这样或那样的状态,导致整体流程会有问题,后来知道了状态机这样的东西,发现用这幅图就可以很清晰的表达整个状态的流转。
    发表于 10-25 11:31 2435次阅读
    <b>状态机</b>到底是什么

    FPGA:状态机简述

    是FPGA设计中一种非常重要、非常根基的设计思想,堪称FPGA的灵魂,贯穿FPGA设计的始终。 02. 状态机简介 什么是状态机状态机通过不同的状态迁移来完成特定的逻辑操作(时序操作)状态机是许多数字系统的核心部件, 是一类重要的时序逻辑电路。通常包括三个部分: 下一个
    的头像 发表于 11-05 17:58 5313次阅读
    FPGA:<b>状态机</b>简述

    简单的状态机入门知识详解

    今天的文章只是带大家入门和了解一下状态机,等你真正在工作当中有遇到这个状态机作为开发需要的话,你再去深入研究。
    的头像 发表于 12-24 18:06 796次阅读

    Verilog设计过程中状态机的设计方法

    “本文主要分享了在Verilog设计过程中状态机的一些设计方法。 关于状态机 状态机本质是对具有逻辑顺序或时序顺序事件的一种描述方法,也就是说具有逻辑顺序和时序规律的事情都适用状态机描述。状态机
    的头像 发表于 06-25 11:04 1839次阅读

    什么是状态机状态机5要素

    等。 本文来说一下状态机编程。 什么是状态机状态机(state machine)有5个要素: 状态(state) 迁移(transition) 事件(event) 动作(action) 条件(guard) 状态:一个系统在某一时刻所存在的稳定的工作情况,系统
    的头像 发表于 07-27 11:23 1.5w次阅读
    什么是<b>状态机</b>?<b>状态机</b>5要素

    基于事件驱动的有限状态机介绍

      一、介绍 EFSM(event finite state machine,事件驱动型有限状态机),是一个基于事件驱动的有限状态机,主要应用于嵌入式设备的软件系统中。 EFSM的设计原则是:简单
    的头像 发表于 11-16 15:29 1616次阅读

    介绍一种高效率的c语言状态机

    状态机对于有一定编程经验的程序员一定会用到,因为对于我们的各种各样的模块他们都会有各种状态,其他模块都会根据这些状态和数据进行处理;同时在网络编程方面也会根据网络状态和消息类型进行相应处理等等方面状态机的使用是非常广泛的,我们通常称这种状态机为有限状态机—FSM
    的头像 发表于 08-12 09:07 1586次阅读
    介绍一种高效率的c语言<b>状态机</b>

    STM32按键消抖——入门状态机思维

    本篇介绍了嵌入式软件开发中常用的状态机编程实现,并通过按键消抖实例,以常用的switch-case形式,实现了对应的状态机编程代码实现,并通过测试,串口打印对应状态,分析状态机状态跳转过程。
    的头像 发表于 09-02 21:54 2961次阅读
    STM32按键消抖——入门<b>状态机</b>思维

    STM32按键状态机2——状态简化与增加长按功能

    本篇继续介绍状态机的使用,在上篇的基础上,通过简化按键去抖逻辑,并增加按键长按功能,进一步介绍状态图的修改与状态机代码的实现,并通过实际测试,演示状态机的运行效果。
    的头像 发表于 09-03 21:26 2337次阅读
    STM32按键<b>状态机</b>2——<b>状态</b>简化与增加长按功能

    嵌入式软件开发中常用的状态机编程实现

    在嵌入式软件开发中,状态机编程是一个十分重要的编程思想,它也是嵌入式开发中一个常用的编程框架。掌握了状态机编程思想,可以更加逻辑清晰的实现复杂的业务逻辑功能。
    发表于 09-06 10:25 886次阅读

    嵌入式中状态机的设置

    状态机在嵌入式软件中随处可见,可能你会说状态机有什么难的,不就是 switch 吗?
    的头像 发表于 11-02 09:04 401次阅读

    嵌入式状态机的几种大牛才懂的操作

    状态机在嵌入式软件中随处可见,可能你会说状态机有什么难的,不就是 switch 吗? switch仅仅是最基础的一个点,关于状态机的更多操作,或许你都没有见过,下面分享几种实现方法。
    发表于 11-17 10:41 530次阅读
    嵌入式<b>状态机</b>的几种大牛才懂的操作

    如何合理高效地使用状态机呢?

    今天还是更新状态机状态机基本是整个HDL中的核心,合理、高效地使用状态机,是数字电路中的重要技能。
    的头像 发表于 02-12 10:21 150次阅读

    嵌入式软件架构设计之状态机

    状态机是有限状态自动机(FSM)的简称,是现实事物运行规则抽象而成的一个 **数学模型** 。
    的头像 发表于 02-15 15:49 296次阅读
    嵌入式<b>软件</b>架构设计之<b>状态机</b>

    下载硬声App