蒙蒙plus
蒙蒙plus
Published on 2024-04-23 / 92 Visits
0
0

事件驱动型状态机

事件驱动型状态机

项目简介

这个项目提供了一个用于实现有限状态机(Finite State Machine, FSM)的简单框架,用于管理状态和处理事件。该框架支持状态的初始化、退出、周期性任务执行,以及状态切换和事件处理。

使用方法

仓库地址
mengplus-plus/efsm

1. 包含头文件

#include "efsm.h"

2. 定义状态和事件

在使用状态机前,你需要定义状态和事件。状态通过 efsm_state_t 结构体表示,事件通过命令(cmd)进行触发。

// 定义状态
efsm_state_t stateA = {NULL, initA, exitA, actionA};
efsm_state_t stateB = {NULL, initB, exitB, actionB};

// 定义事件命令
#define CMD_START  (EFSM_STATE_USER_CMD_BASE + 1)
#define CMD_STOP   (EFSM_STATE_USER_CMD_BASE + 2)

3. 定义状态机管理结构体

efsm_manage_t myStateMachine;

4. 初始化状态机

efsm_manage_init(&myStateMachine);

5. 注册状态机

efsm_register(&myStateMachine);

6. 定义状态机管理函数

void myInitFunction(void *obj) {
    // 初始化操作
}

void myTickFunction(void *obj) {
    // 周期性任务
}

void myExitFunction(void *obj) {
    // 退出操作
}

void myControlFunction(void *obj, uint32_t cmd, void *param) {
    // 控制函数,根据cmd执行相应的操作
}

7. 设置状态机管理函数

myStateMachine.init = myInitFunction;
myStateMachine.tick = myTickFunction;
myStateMachine.exit = myExitFunction;
myStateMachine.control = myControlFunction;

8. 定义状态事件处理函数

void actionA(void *obj, uint32_t cmd, void *param) {
    // 处理状态A的事件
}

void actionB(void *obj, uint32_t cmd, void *param) {
    // 处理状态B的事件
}

9. 初始化状态机状态

efsm_transition(&myStateMachine, &stateA);  // 初始状态为A

10. 执行状态机

efsm_manage_tick();

注意事项

  • 在使用状态机之前,确保你的状态、事件和函数都已经正确定义和设置。
  • 通过设置命令(cmd)来触发相应的事件处理函数。
  • 使用 efsm_transition 函数进行状态切换。
  • 可以通过修改状态机管理结构体的成员来控制状态机的行为。

示例

查看 example.c 文件以获取一个简单的状态机使用示例。

许可证

该项目基于 MIT 许可证。详细信息请参阅许可证文件。

贡献

欢迎贡献!如果你发现问题或有改进建议,请提出 issue 或提交 Pull Request。

联系方式

如有任何问题,请通过邮件联系:chengmeng_2@outlook,com。


Comment