其他分享
首页 > 其他分享> > 论状态机的实际应用:

论状态机的实际应用:

作者:互联网

前言:

状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。

这里同学们可以看一下我有关于状态机的另一篇博客

被数电老师痛斥期中试卷后的数电知识总结(四):时序逻辑电路的分析与设计_靳小锅er的博客-CSDN博客

我最先得知到这个概念是在FPGA里,但是实际使用它的时候,是在STM32的应用中,因为当初还没有接触到FreeRTOS和ucos系统,(汗颜,到现在跑系统还是处于一种似会非会的状态),之后听闻楼上实验室在电赛的时候使用这个状态机,收效颇好,于是才正式接触这一概念。

好了不在继续闲聊了,下面直接步入正题。

一、状态机的设计

首先这边我也是看了原子哥有关的在FPGA里视频了解相应概念的(如果有问题请轻喷)

其实设计状态机主要分为四个步骤,也就图下的四段论

第一步:

状态空间定义,这个比较好理解,就是定义状态机有几个状态量,明确每个状态的工作。这里在C语言里主要靠enum枚举,将所有的状态量提前枚举定义。

第二步:

状态跳转,这个其实也好理解,类似于我们标志位操作,就是设置标志位状态,根据自己的需求,在各个状态结束后通过更新状态标志位状态量,来实现跳转操作,这里最好是闭环跳转。

第三步:

下个状态判断,这个其实也比较好理解,在C语言里的主要体现,就是if和switch case,通过各种if和switch的操作,来进行判断是否已经满足状态跳转的要求,如果符合要求,就进行状态跳转。

第四步:

各个状态下的动作,这就相当于系统下的任务分配了

二、代码分享

#include <stdio.h>
 
typedef enum		// 定义状态机的状态集
{
	STATE1,
	STATE2,
	STATE3,
	STATE4,
	STATE5,
	STATE6,
	STATE7,
}STATE;
 
int main(void)
{
	int num = 0;
	STATE state = STATE1;
	
	printf("Please enter the password, continue to enter the correct lock.\n");
	while(1)
	{
		scanf("%d", &num);
		printf("The number you entered is:%d\n", num);
		switch(state)
		{
			case STATE1:
				if(num == 1)
				{
					state = STATE2;
				}
				else
				{
					state = STATE1;
				}
				break;
			case STATE2:
				if(num == 2)
				{
					state = STATE3;
				}
				else
				{
					state = STATE1;
				}
				break;
			case STATE3:
				if(num == 3)
				{
					state = STATE4;
				}
				else
				{
					state = STATE1;
				}
				break;
			case STATE4:
				if(num == 4)
				{
					state = STATE5;
				}
				else
				{
					state = STATE1;
				}
				break;
			case STATE5:
				if(num == 5)
				{
					state = STATE6;
				}
				else
				{
					state = STATE1;
				}
				break;
			case STATE6:
				if(num == 6)
				{
					state = STATE7;
				}
				else
				{
					state = STATE1;
				}
				break;
			default:
				state = STATE1;
		}
		if(state == STATE7)
		{
			printf("Password entered correctly.\n");
			break;
		}
	}
	
	return 0;
}

标签:状态,state,状态机,STATE1,num,应用,break,实际
来源: https://blog.csdn.net/qq_52528413/article/details/121408001