美文网首页
状态机学习

状态机学习

作者: 火红色祥云 | 来源:发表于2020-11-21 16:39 被阅读0次

函数指针

  • 状态机学习之前先来了解下>>函数指针学习:
#include <stdio.h>

typedef void (*pActionFun)(void);

typedef enum{
    Status1=1,
    Status2,
}CurStatus;

typedef enum{
    event1=1,
    event2
}TriggerEvent;

typedef enum{
    status1=1,
    status2,
}NextStatus;

typedef struct status
{
    CurStatus       cur_status;     //当前状态
    TriggerEvent    trigger_event;  //触发事件
    NextStatus      next_status;    //触发之后进入下一个状态
    pActionFun      act_exe;        //触发之后执行的函数
}LogicStruct;

void Act_Fun(void)
{
    printf("Act_Fun 0x01 ! \r\n");
}

LogicStruct logic_struct = {Status1,event1,status1,Act_Fun};

int main(int argc, char const *argv[])
{
    logic_struct.act_exe();         //运行void Act_Fun(void)
    printf("status study!\r\n");
    return 0;
}

状态机学习

#include <stdio.h>

typedef void (*pActionFun)(void);

typedef enum{
    event_1=1,
    event_2,
    event_3,
    event_4,
    event_5,
}TriggerEvent;

typedef enum{
    status_1=1,
    status_2,
    status_3,
    status_4,
    status_5,
}Status;

typedef struct status
{
    Status          cur_status;     //当前状态
    TriggerEvent    trigger_event;  //触发事件
    Status          next_status;    //触发之后进入下一个状态
    pActionFun      act_exe;        //触发之后执行的函数
}LogicStruct;

typedef struct
{
    Status        status;
    int           status_num;
    LogicStruct*  logic_content;
}StatusMachine;



void Act_Fun132(void)
{
    printf("Act_Fun 132 ! \r\n");
}
void Act_Fun142(void)
{
    printf("Act_Fun 142 ! \r\n");
}
void Act_Fun213(void)
{
    printf("Act_Fun 213 ! \r\n");
}
void Act_Fun242(void)
{
    printf("Act_Fun 242 ! \r\n");
}
void Act_Fun321(void)
{
    printf("Act_Fun 321 ! \r\n");
}
void Act_Fun332(void)
{
    printf("Act_Fun 332 ! \r\n");
}
void Act_Fun353(void)
{
    printf("Act_Fun 353 ! \r\n");
}


void RunSM(StatusMachine* xSM ,TriggerEvent TrigEveID)
{
    for (int i = 0; i < xSM->status_num; i++)
    {
        if((xSM->logic_content[i].cur_status == xSM->status) && (xSM->logic_content[i].trigger_event == TrigEveID))
        {
            xSM->status = xSM->logic_content[i].next_status;
            xSM->logic_content[i].act_exe();     //运行void Act_Fun(void)
            break;
        }
    }
}


LogicStruct logic_Array[] = {
    {status_1,event_3,status_2,Act_Fun132},//初始化为状态1,当事件3来临时,切换至状态2,运行函数Act_Fun132
    {status_1,event_4,status_2,Act_Fun142},//当状态为状态1,当事件4来临时,切换至状态2,运行函数Act_Fun142
    {status_2,event_1,status_3,Act_Fun213},//当状态为状态2,当事件1来临时,切换至状态3,运行函数Act_Fun213
    {status_2,event_4,status_2,Act_Fun242},//当状态为状态2,当事件4来临时,切换至状态2,运行函数Act_Fun242
    {status_3,event_2,status_1,Act_Fun321},//当状态为状态3,当事件2来临时,切换至状态1,运行函数Act_Fun321
    {status_3,event_3,status_2,Act_Fun332},//当状态为状态3,当事件3来临时,切换至状态2,运行函数Act_Fun332
    {status_3,event_5,status_3,Act_Fun353},//当状态为状态3,当事件5来临时,切换至状态3,运行函数Act_Fun353
};

StatusMachine gSM = {status_1,7,logic_Array};

int main(int argc, char const *argv[])
{

    StatusMachine*  pSM = NULL;

    pSM = &gSM;

    TriggerEvent TrigEve[15] = {
        event_1,event_2,event_3,event_4,event_5,
        event_1,event_2,event_3,event_4,event_5,
        event_1,event_2,event_3,event_4,event_5
    };

    for (int j = 0; j < 15; j++)
    {
        RunSM(pSM ,TrigEve[j]);
    }

    printf("status study!\r\n");
    return 0;
}

相关文章

  • 状态机学习

    函数指针 状态机学习之前先来了解下>>函数指针学习: 状态机学习

  • FPGA状态机

    其他参考:主要是区分moore状态机和mealy状态机的。[原创][FPGA]有限状态机FSM学习笔记(一)[转载...

  • 分布式系统基础-Lamport Clock

    最近在学习分布式系统的知识.在学习Raft算法时,看到其中有提到状态机.于是就去研究了一下状态机,在研究状态机的时...

  • Unity高级——状态机——有限状态机

    一、状态机 状态机能够分离逻辑代码,提高代码的可维护性和重用性 本节课我们来学习,在Unity中使用状态机,来实现...

  • 状态机基础知识

    这几天想研究下状态机,所以开始阅读了squirrel的代码,文档提到了建议先学习下状态机基础知识。所以学习了这方面...

  • 设计模式-状态机

    对于一个状态机来说,需要分成2个部分来考虑状态机,一是状态机本身,二是状态机的实现。 状态机推演 只有状态机本身是...

  • 三国无双。

    1.状态机,有限状态机。

  • 状态机源码分析

    状态机源码 状态机初始化 HandlerThread、SmHandler,Loop使用子线程loop。 状态机树状...

  • [因为我不懂啊]-什么是状态机编程(设计模式)(0)

    写了一年小游戏了,至今没用过状态机。 有个大神室友,写游戏总用状态机(游戏状态机,动画状态机...),感觉他写代码...

  • FPGA Verilog HDL 设计-----有限状态机

    数字系统有两大类有限状态机(Finite State Machine,FSM):Moore状态机和Mealy状态机...

网友评论

      本文标题:状态机学习

      本文链接:https://www.haomeiwen.com/subject/mureiktx.html