浅谈状态机

状态机

前言

前几天接触到一个概念,叫状态机。就马上到网上搜索了一下这个概念。经过网上的学习,对状态机有了一定的认识,写下这篇博客介绍一下。

简介

状态机,表示某几种状态之间的切换。
因为状态机的状态是有限的,所以一般上也叫有限状态机(Finite State Mache)。
在我们做开发的过程中,如果有逻辑关系比较混乱的,我们就可以考虑使用有限状态机来解决问题。
参考链接:
https://www.cnblogs.com/jiangzhaowei/p/9129024.html

示例

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

/* FSM(Finite State Machine),有限状态机
 * date: 2019.12.06
 * author: chasenzhang
 */

typedef enum state
{
    state_1 = 0,
    state_2,
    state_3,
    state_num,
}state_t;

typedef enum event
{
    event_1 = 0,
    event_2,
    event_3,
    event_num,
}event_t;

typedef struct FSM_tables_s
{
    int cur_state;
    int event;
    void (*action)();
    int next_state;
}FSM_tables_t;

void action()
{
    printf("state has change!\n");
}

FSM_tables_t FSM_Tables[] = 
{
    {state_1, event_1, action, state_2},
    {state_2, event_2, action, state_3},
    {state_3, event_3, action, state_1},
    {state_3, event_2, action, state_1},
};

void event_handle(state_t *state, event_t *event)
{
    int i = 0;
    int num = sizeof(FSM_Tables)/sizeof(FSM_Tables[0]);

    for (i = 0; i < num; i++)
    {
        if (*state == FSM_Tables[i].cur_state && *event == FSM_Tables[i].event)
        {
            *state = FSM_Tables[i].next_state;
            FSM_Tables[i].action();
            break;
        }
    }
}

int main()
{
    printf("this is test!\n");

    int num = 6;
    state_t state = 0;
    event_t event = 0;

    while (num--)
    {
        printf("state = %d, event = %d\n", state, event);
        event_handle(&state, &event);
        event++;

        state %= state_num;
        event %= event_num;

        sleep(1);
    }

    return 0;
}

运行结果

this is test!
state = 0, event = 0
state has change!
state = 1, event = 1
state has change!
state = 2, event = 2
state has change!
state = 0, event = 0
state has change!
state = 1, event = 1
state has change!
state = 2, event = 2
state has change!
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Simulink/StateFlow是一种基于图形化建模的工具,可以用来对不同领域的系统进行建模、仿真和分析。它主要应用在自动控制、通信、信号处理等领域。在建模过程中,Simulink/StateFlow提供了大量的模块和工具箱,用户可以根据自己的需求选择不同的模块进行建模。 Simulink/StateFlow的建模过程分为两个部分:系统建模和状态机建模。系统建模是指将系统中的各个部分以模块的形式进行建模,然后将这些模块连接起来形成一个整体系统。状态机建模是指将系统的行为分解成不同的状态,然后通过状态转移的方式描述系统的行为。 Simulink/StateFlow的建模具有以下优点: 1. 易于学习和使用。Simulink/StateFlow基于图形化建模,用户可以直观地看到模型的结构和各个部分之间的关系。 2. 适用于不同领域的系统。Simulink/StateFlow提供了大量的模块和工具箱,可以满足不同领域的系统建模需求。 3. 支持多种仿真方式。Simulink/StateFlow支持离散事件仿真、连续时间仿真和混合仿真等多种仿真方式,可以满足不同系统的仿真需求。 4. 可以通过代码生成方式进行实现。Simulink/StateFlow可以将建模结果通过代码生成的方式进行实现,提高了开发效率。 但是Simulink/StateFlow也存在一些缺点: 1. 对于大型系统建模,会存在模型复杂度高、耗时长等问题。 2. 在状态机建模中,状态的数量和状态转移的复杂度容易增加,需要进行合理的抽象和简化。 3. 对于一些非线性系统的建模,需要使用更高级的工具和方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chasentech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值