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

一、状态机实现

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. 各状态对应事件处理的实现(包含状态进入,退出,事件队列处理)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《c8051的c语言的彻底应用.pdf》是一本关于c8051单片机的c语言应用方面的书籍。该书详细介绍了c8051单片机的基础知识、c语言编程技巧和应用示例等内容。 首先,该书对c8051单片机的基础知识进行了全面的介绍。读者可以了解到c8051单片机的特点、结构和工作原理等基本概念。同时,该书还介绍了常用的c语言数据类型、变量和运算符等基本概念,为后续的应用开发打下了坚实的基础。 其次,该书详细讲解了c语言在c8051单片机上的编程技巧。读者可以学习到如何使用c语言编写单片机程序,掌握常用的控制结构、循环结构和函数等编程技巧。此外,该书还介绍了c8051单片机的中断处理、定时器和串口通信等特殊应用编程技巧,帮助读者深入理解c语言在单片机开发中的应用。 最后,该书提供了大量的应用示例,帮助读者将所学知识应用到实际的项目中。这些应用示例涵盖了多个领域,如数字电子钟、温度监测系统、智能小车等。通过对这些实例的学习和仿制,读者可以提高自己的应用开发能力,并将c8051单片机的c语言应用发挥到极致。 总之,《c8051的c语言的彻底应用.pdf》是一本系统全面的c8051单片机c语言应用方面的教材。通过学习这本书,读者可以了解c8051单片机的基础知识、掌握c语言编程技巧,并将其应用于实际项目中,提高自己的工程实践能力。 ### 回答2: 《C8051的C语言彻底应用》是一本关于C8051单片机的C语言应用方面的书籍,主要针对单片机的开发和应用进行详细阐述。 本书首先介绍了C语言的基础知识,包括语法、数据类型、变量和数组等,以帮助读者熟悉C语言的编程特点和基本操作。接着,书中详细介绍了C语言在C8051单片机开发中的应用,包括IO口的操作、定时器和计数器的使用、中断编程等。读者可以通过学习这些内容,了解如何利用C语言编写单片机程序,掌握单片机的底层操作和控制。 此外,书中还介绍了C语言在C8051单片机应用中的高级特性,包括串口通信、模拟和数字转换、PWM波产生等。通过学习这些高级特性,读者可以实现更加复杂和灵活的单片机应用,拓展其在不同领域的应用范围。 本书以简明扼要的方式呈现内容,结合实例和案例进行讲解,帮助读者理解和应用C8051单片机的C语言编程。同时,书中还配有大量的示意图和实际运行效果图,方便读者理解和实践。 《C8051的C语言彻底应用》是一本实用性很强的单片机编程指南,适合计算机、电子等相关专业的学生和从业人员阅读。它不仅有助于读者掌握C语言编程技巧,还能够提高读者在单片机应用方面的能力和水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值