C语言状态机--MP3的事件驱动实现

有些场景下,状态机可以使得我们的程序代码变得简洁,可扩展,可维护。

先看下状态迁移图。

 代码设计分为五个步骤完成状态机。

#include <stdio.h>

// 第一步:定义两个事件
typedef enum {
    STOP,
    PLAY_PAUSE,
    EVE_MAX
} EVENT;

// 第二步:定义三种状态
typedef enum {
    PLAY_STA,
    PAUSE_STA,
    STOP_SAT,
    STA_MAX
} STA;

typedef void (*func)(void *p);

// 第三步:定义状态机结构体
typedef struct 
{
    EVENT evn;
    STA currentSta;
    STA nextSta;
    func handle;        
} M_TB;

void func_1(void *p) {};
void func_2(void *p) {};
void func_3(void *p) {};
void func_4(void *p) {};
void func_5(void *p) {};
void func_none(void *p) {};

// 第四步:定义状态迁移表
const M_TB statFunc[STA_MAX][EVE_MAX] = {
    {
        {STOP, PLAY_STA, STOP_SAT, func_1},
        {PLAY_PAUSE, PLAY_STA, PAUSE_STA, func_2},
    },

    {
        {STOP, PAUSE_STA, STOP_
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现嵌入式系统状态机的基本步骤如下: 1. 定义状态:根据嵌入式系统的需求,定义状态集合,每个状态都有一个唯一的标识符。 2. 状态转换:根据系统的需求和状态定义,确定状态之间的转换条件和转换规则(转移函数),即在什么情况下从一个状态转移到另一个状态。 3. 状态执行:在每个状态下执行相应的任务,包括读取传感器数据、执行控制操作等。 4. 定时器:嵌入式系统中通常需要使用定时器来触发状态转换,需要实现定时器的初始化和中断处理函数。 5. 事件驱动:在一些需要响应外部事件的场景中,需要使用事件驱动的方式来触发状态转换,需要实现事件处理函数。 6. 状态机框架:将以上步骤封装成一个状态机框架,使得状态机实现状态机的使用分离开来,方便重用和维护。 在C语言中,可以用结构体来表示状态,用函数指针来表示状态转移函数,用枚举类型来表示状态标识符。具体实现方式可以参考以下代码: ``` typedef enum { STATE_IDLE, STATE_RUNNING, STATE_STOPPED } State; typedef struct { State current_state; void (*state_func)(void); } StateMachine; void idle_state_func(void); void running_state_func(void); void stopped_state_func(void); void idle_to_running(void); void running_to_idle(void); void running_to_stopped(void); void stopped_to_idle(void); void init_timer(void); void timer_isr(void); void init_event(void); void event_handler(void); int main(void) { StateMachine sm = {STATE_IDLE, idle_state_func}; init_timer(); init_event(); while (1) { sm.state_func(); switch (sm.current_state) { case STATE_IDLE: if (event_occurs()) { event_handler(); } else if (timer_expired()) { idle_to_running(); } break; case STATE_RUNNING: if (event_occurs()) { event_handler(); } else if (timer_expired()) { running_to_stopped(); } break; case STATE_STOPPED: if (event_occurs()) { event_handler(); } else if (timer_expired()) { stopped_to_idle(); } break; default: break; } } return 0; } void idle_state_func(void) { // execute idle state task } void running_state_func(void) { // execute running state task } void stopped_state_func(void) { // execute stopped state task } void idle_to_running(void) { sm.current_state = STATE_RUNNING; sm.state_func = running_state_func; } void running_to_idle(void) { sm.current_state = STATE_IDLE; sm.state_func = idle_state_func; } void running_to_stopped(void) { sm.current_state = STATE_STOPPED; sm.state_func = stopped_state_func; } void stopped_to_idle(void) { sm.current_state = STATE_IDLE; sm.state_func = idle_state_func; } void init_timer(void) { // initialize timer } void timer_isr(void) { // handle timer interrupt } void init_event(void) { // initialize event } void event_handler(void) { // handle event } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值