简明状态机C语言实现与应用(大致框架)

编程入门 行业动态 更新时间:2024-10-25 16:28:38

<a href=https://www.elefans.com/category/jswz/34/1753864.html style=简明状态机C语言实现与应用(大致框架)"/>

简明状态机C语言实现与应用(大致框架)

文章目录

  • 一、状态机实现
    • 1. 事件入栈
    • 2. 事件出栈,一般在事件执行时调用
    • 3. 事件执行
    • 4. 状态切换
  • 二、状态机应用-实例化状态机
    • 1. 列出所有状态
    • 2. 列出所有事件
    • 3. 定义状态列表
    • 4. 实例化状态机并初始化
    • 5. 各状态对应事件处理的实现(包含状态进入,退出,事件队列处理)

一、状态机实现

1. 事件入栈

uint8_t Fsm_EventPost(FSM_st *p_Fsm,uint8_t Event)
{if(NULL == p_Fsm){return FALSE;}p_Fsm->EventQueue[p_Fsm->EventWrite] = Event;p_Fsm->EventWrite = (p_Fsm->EventWrite+1)% FSM_MAX_EVENT;return TRUE;
}

2. 事件出栈,一般在事件执行时调用

static uchar Fsm_EventGet(FSM_st *p_Fsm)
{uint8_t RetEvent = FSM_EVENT_NONE;if(NULL == p_Fsm){return FSM_EVENT_NONE;}if(p_Fsm->EventRead == p_Fsm->EventWrite){return FSM_EVENT_NONE;	}else{RetEvent = p_Fsm->EventQueue[p_Fsm->EventRead];p_Fsm->EventRead++;p_Fsm->EventRead %= FSM_MAX_EVENT;return u8_RetEvent;}
}

3. 事件执行

void Fsm_Execute(FSM_st *p_Fsm, const state_handle_st *ptbl)
{uint8_t Ret =FSM_RET_IGNORED;uint8_t Event = FSM_EVENT_NONE;if ((NULL == p_Fsm) || ( NULL == ptbl)){return;}Event = Fsm_EventGet(p_Fsm);if(NULL != p_Fsm->p_GlobalHandle){Ret = p_Fsm->p_GlobalHandle(Event);if(FSM_RET_TRAN == Ret){ptbl[p_Fsm->CurState].p_Handle(FSM_EVENT_EXIT);ptbl[p_Fsm->u8_NextState].p_Handle(FSM_EVENT_ENTER);p_Fsm->CurState = p_Fsm->NextState;return;}else if (FSM_RET_IGNORED != Ret){return;}}Ret = ptbl[p_Fsm->CurState].p_Handle(Event);if(FSM_RET_TRAN == Ret){ptbl[p_Fsm->CurState].p_Handle(FSM_EVENT_EXIT);ptbl[p_Fsm->u8_NextState].p_Handle(FSM_EVENT_ENTER);p_Fsm->CurState = p_Fsm->NextState;return;}}

4. 状态切换

uint8_t Fsm_StateTrans(FSM_st *p_Fsm, uint8_t State)
{if(NULL == p_Fsm){return FSM_EVENT_NONE;}p_Fsm->NextState = State;return (FSM_RET_TRAN);}

二、状态机应用-实例化状态机

举例: 针对闹钟功能

1. 列出所有状态

typedef enum
{STATE_SETTING, //闹钟时间设置STATE_TICK     //倒计时中}State_type;

2. 列出所有事件

typedef enum
{//进入和退出 一般是执行完当前状态的事件后进入下一个状态时调用EVENT_ENTER, EVENT_EXIT,EVENT_UP,  //按键加 计时加一小时EVENT_DOWN, //按键减 计时减一小时EVENT_ENTER	//确认键
}Event_type;

3. 定义状态列表

typedef struct 
{uint8_t  State;    //状态uint8_t  (*p_Handle)(uint8_t  Event); //状态执行函数 参数是事件
}state_handle_st;
const state_handle_st Func_tbl[2] =
{{STATE_SETTING,      		Setting_Handle},{STATE_TICK   ,       	    Tick_Handle},
};
static uint8_t Setting_Handle(uint8_t Event)
{switch}static uint8_t Tick_Handle(uint8_t Event)
{}

4. 实例化状态机并初始化

5. 各状态对应事件处理的实现(包含状态进入,退出,事件队列处理)

更多推荐

简明状态机C语言实现与应用(大致框架)

本文发布于:2023-12-03 08:19:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1653145.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:简明   框架   语言   状态机

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!