状态机系列学习笔记01

简介: 状态机系列学习笔记01有限状态机(FSM)概念定义总的来说,有限状态机系统,是指在不同阶段会呈现出不同的运行状态的系统,这些状态是有限的、不重叠的。这样的系统在某一时刻一定会处于其所有状态中的一个状态,此时它接受一部分允许的输入,产生一部分可能的响应,并且迁移到一部分可能的状态。

状态机系列学习笔记01

有限状态机(FSM)概念

定义

总的来说,有限状态机系统,是指在不同阶段会呈现出不同的运行状态的系统,这些状态是有限的、不重叠的。这样的系统在某一时刻一定会处于其所有状态中的一个状态,此时它接受一部分允许的输入,产生一部分可能的响应,并且迁移到一部分可能的状态。

要素

状态(State)

状态,就是一个系统在其生命周期中某一时刻的运行情况,此时,系统会执行一些动作,或者等待一些外部输入。

条件(Guard)

状态机对外部消息进行响应的时候,除了需要判断当前的状态,还要判断跟这个状态相关的一些条件是否成立。这种判断称为Guard(”条件“)。Guard通过允许或禁止某些操作来影响状态机的行为。

事件(Event)

Event(”事件“),就是在一定的时间和空间上发生的对系统有意义的事情。

动作(Action)

当一个Event被状态机系统分发的时候,状态机用Action(”动作“)来进行响应,比如修改一下变量的值、进行输入输出、产生另外一个Event或者迁移到另外一个状态等等。

迁移(Transition)

从一个状态切换到另一个状态被称为Transition(”迁移“)。引起状态迁移的事件被称为triggering event(”触发事件“),或者被简称为trigger(”触发“)。

FSM设计方法

C Parser(注释分析程序)

假如需要设计一个统计.C文件中注释字符的个数的程序,这个程序需要分析出一个.C文件中C风格的注释字符(/.../)的个数。”/.../“之外的字符统一认为是code(不考虑”//“作为注释的情况)。

分析如下:
(1) 首先,我们可以假设一段输入字符,比如:
a = b * c / d;/* calc expression is b*c/d. **/
(2) 因为Event比较清晰,可以先确定下来:
CHAR,表示字符。即除了斜杠和星号之外的所有字符。
SLASH,表示斜杠。
STAR,表示星号。
(3) 确定Initial Transition:
确定初始状态为code态。(或者增加一个idle态,根据第一字符再判断。不过这个例子中不需要,因为不用计算code的个数。)
(4) 确定所有的state和transition。
在code态,如果输入是CHAR或者STAR,仍然处于code状态。当输入SLASH以后,则认为这个SLASH有可能是注释的开始,进入新的状态叫slash。
在slash状态,检查后面的输入是否是STAR,如果是STAR,说明这个是注释的开始部分,转入comment状态,如果是CHAR或者SLASH,则认为前面输入的SLASH和当前输入的字符仍然是code,返回code态。
同样,comment态的思路跟code态类似。star态的思路跟slash态类似。

FSM实现

nestted switch statement(嵌套switch)

Cparser1.h

enum Signal {                 /* enumeration for CParser signals */
    CHAR_SIG, STAR_SIG, SLASH_SIG
};
enum State {                  /* enumeration for CParser states */
    CODE, SLASH, COMMENT, STAR
};

struct CParser1 {
    enum State state__;            /* the scalar state-variable */
    long commentCtr__;             /* comment character counter */
    /* ... */                      /* other CParser1 attributes */
};

#define CParser1Tran(me_, target_)    ((me_)->state__ = target_)

Cparser1.c

void CParser1Dispatch(CParser1 *me, unsigned const sig) {
    switch (me->state__) {
    case CODE:
        switch (sig) {
        case SLASH_SIG:
            CParser1Tran(me, SLASH);        /* transition to "slash" */
            break;
        }
        break;
    case SLASH:
        switch (sig) {
        case STAR_SIG:
            me->commentCtr__ += 2;          /* SLASH-STAR count as comment */
            CParser1Tran(me, COMMENT);      /* transition to "comment" */
            break;
        case CHAR_SIG:
            CParser1Tran(me, CODE);         /* go back to "code" */
            break;
        }
        break;
    case COMMENT:
        switch (sig) {
        case STAR_SIG:
            CParser1Tran(me, STAR);         /* transition to "star" */
            break;
        case CHAR_SIG:
        case SLASH_SIG:
            ++me->commentCtr__;             /* count the comment char */
            break;
        }
        break;
    case STAR:
        switch (sig) {
        case STAR_SIG:
            ++me->commentCtr__;             /* count STAR as coment */
            break;
        case SLASH_SIG:
            me->commentCtr__ += 2;          /* count STAR-SLASH as comment */
            CParser1Tran(me, CODE);         /* transition to "code" */
            break;
        case CHAR_SIG:
            me->commentCtr__ += 2;          /* count STAR-? as comment */
            CParser1Tran(me, COMMENT);      /* go back to "comment" */
            break;
        }
        break;
    }
}
相关文章
|
uml
状态机
首先需要考虑涉及到哪些状态节点和哪些事件,如何方便状态节点的获取、状态节点如何串联起来呢?串联的方式下,如何拿到下一个状态节点?如果基于角色,如何实现? 我们知道工作流可以实现基于角色进行流程的流转,但是此时我们涉及到事件和状态,会出现多个分支,如果使用工作流实现,流程处理上,比如activiti上,可能比较复杂,因此考虑比较轻量级的状态机来实现的话,相对来说要方便一些。
901 0
状态机
|
5月前
|
C++
4 状态机
4 状态机
28 0
|
4月前
|
人工智能 安全 图形学
有限状态机的概念
有限状态机的概念
|
10月前
|
算法 Linux Android开发
c++状态机的使用
c++状态机的使用
|
算法 网络协议 Java
状态机是干什么的?底层原理是什么?
状态机是干什么的?底层原理是什么?
458 0
|
存储 算法 异构计算
状态机的概念与设计
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
231 0
状态机的概念与设计
|
传感器 算法 安全
状态机设计举例
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
131 0
状态机设计举例
|
JavaScript 前端开发 API
Zag-基于状态机的组件库
本文适合对状态机感兴趣的小伙伴阅读
Zag-基于状态机的组件库
|
设计模式 缓存
U3D客户端框架之商业项目中的 FSM 有限状态机 实现代码
FSM有限状态机在游戏中的作用主要是做场景的流程管理,进入场景状态后 加载资源初始化,更新状态时执行更新逻辑,离开场景状态时销毁场景资源,数据清理、角色动作状态切换,进入时播放动作,离开时播放下一个当作等。
有限状态机
有限状态机简介 有限状态机(FSM)是许多数字系统中用来控制系统和数据流路径行为的时序电路。FSM的实例包括控制单元和时序。 本实验介绍了两种类型的FSM(Mealy和Moore)的概念,以及开发此类状态机的建模方式。 请参阅Vivado教程,了解如何使用Vivado工具创建项目和验证数字电路。 Mealy FSM(米利型有限状态机) 有限状态机(FSM)或称简单状态机用于设计计算机程序和时序逻辑电路。它被设想为抽象机器,可以处于有限数量的用户定义状态之一。机器一次只能处于一种状态; 它在任何给定时间所处的状态称为当前状态。 当由触发事件或条件启动时,它可以从一种状态改变为另一种状态;
156 0