状态机是什么?
状态机是什么?相信很多人有意无意间都会用到状态机。不过状态机究竟是个什么东西,很多人可能都心里了解,但无法言明。
恰巧今天想到这个问题,便在此记录一下。
状态机:(摘自百度百科)
状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为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;
}
上述代码实现了整个状态流程的控制。
在显示终端上会看到状态的循环显示。递增->递减->递增……
至此,一个状态机完整的过程实现,整个状态机处于正常工作状态。