大白话-有限状态机编程

作为经常跟单片打交道的选手,对状态应该都不陌生,尤其是会涉及ECU的状态,初始化、运行、休眠等。

而实现这种方式,一般都会用Switch case去完成

switch(EcuState)
{
    case EcuInit:
        break;
    case EcuRun:
        break;
    case EcuSleep:
        break;
    default:
        break;
}

然后在每个状态里实现对应的 if 逻辑。做出相应的动作。

这种方式是通用的大家比较熟悉的方式。

其实还可以用状态机编程的思想去实现状态的管理。啥也不说,上测试代码:

定义用到的数据类型

typedef enum
{
	INIT = 0,
	IDLE = 1,
	BUSY = 2,
	DONE = 3,
}eSTATE;

typedef enum
{
	EVENT_0 = 0,
	EVENT_1 = 1,
	EVENT_2 = 2,
	EVENT_3 = 3,
}eEVENT;

typedef struct
{
	eSTATE Cur_state;
	eEVENT event;
	void( *pAction)(void);
	u8   next_state;
}strMachine;
#define NUM_MAX       3

strMachine MachineTable[NUM_MAX] =
{
	{INIT,EVENT_0,func_event0,BUSY },
	{BUSY,EVENT_1,func_event1,DONE },
	{DONE,EVENT_2,func_event2,INIT },
};

eSTATE p_currentstate = INIT;

void Machine_Run(eEVENT ev)
{
	u8 num = 0;

	for (num = 0;num < 3;num++)
	{
		if (ev == MachineTable[num].event)
		{
			if (p_currentstate == MachineTable[num].Cur_state)
			{
				if (MachineTable[num].pAction != NULL)
				{
					MachineTable[num].pAction();
				}
				p_currentstate = MachineTable[num].next_state;
			}
		}
	}

}


void func_event0(void)
{
	printf(" event 0 action:\n\r");
}
void func_event1(void)
{
	printf(" event 1 action:\n\r");
}

void func_event2(void)
{
	printf(" event 2 action:\n\r");
}

在主函数中调用MachineRun即可。看效果:

    while (1)
    {
        printf("input event num:");
        scanf_s("%d", &input);
        Machine_Run(input);
    }

用状态表编程的好处,程序结构会比较清晰。如果你能看到这里,说明我们有共鸣,有什么想法,也可以交流。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值