嵌入式/程序控制之状态机(以C/C++为例)

状态机是什么?

状态机是什么?相信很多人有意无意间都会用到状态机。不过状态机究竟是个什么东西,很多人可能都心里了解,但无法言明。
恰巧今天想到这个问题,便在此记录一下。
状态机:(摘自百度百科)
状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(Finite State Machine),主要分为2大类:
第一类,若输出只和状态有关而与输入无关,则称为Moore状态机
第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机
上述定义对于纯软件人员来说,可能并不太了解。
那么在这里谈一谈我自己的理解。

状态机详述

状态机:即根据当前设备/程序的状态(Status),来进行对应的响应的过程(也就是所谓的迁移(Transition))。状态的控制(Action),以及对应状态的响应。这两种控制相互关联起来,我们就可以称之为状态机。
对于硬件而言,设备状态包括了程序定义的状态,外部IO的输入状态等等。
而对于软件而言,状态就全靠程序的定义、各种事件的产生。
对于软件来说:做一个状态机,那么就要有响应的状态定义。一般用枚举来定义(enum)

状态定义

例:

enum status_dev
{
    status_init = 0,
    status_first,
    status_second
};

上述一个列举了一个状态机的三个状态。
初始态、第一个状态、第二个状态。

状态控制

#include <stdio.h>
static U08 g_p_u08_statusMaker = status_init;
static u08_statusAddOrReduce = 0;// 0--Add 1--Reduce
int status_control()
{
switch(g_p_u08_statusMaker)
{
case status_init:
	{
		printf("now Status is: %d---status_init\n",status_init);
		break;
	}
case status_first:
	{
		printf("now Status is: %d---status_first\n",status_first);
		break;
	}
case status_second:
	{
		printf("now Status is: %d---status_second\n",status_second);
		break;
	}
default{
		u08_statusAddOrReduce = 1;
		printf("ERRPR!Status Is Bad Value! --%d--\n",g_p_u08_statusMaker);
	}
}
return 0;
}

上述代码就是一个响应的过程。
即根据当前的的状态,去产生不同的结果。两段代码说明了状态机存在的基本要素。

状态控制过程(Action)

int main(void)
{
	printf("Start Simulated A State Machine\n ");
	while(1)
	{
		delay_s(1);//延时1s
		status_control();
		if(g_p_u08_statusMaker > status_second)
		{
			--g_p_u08_statusMaker;
		}
		else if(u08_statusAddOrReduce == 0)
		{
			++g_p_u08_statusMaker;
		}
		if(g_p_u08_statusMaker < status_init)
		{
			u08_statusAddOrReduce = 0;
			g_p_u08_statusMaker = 0;//防止小于0
		}
	}
	return 0;
}

上述代码实现了整个状态流程的控制。
在显示终端上会看到状态的循环显示。递增->递减->递增……
至此,一个状态机完整的过程实现,整个状态机处于正常工作状态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值