ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

论状态机的实际应用:

2021-11-18 20:03:05  阅读:187  来源: 互联网

标签:状态 state 状态机 STATE1 num 应用 break 实际


前言:

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

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

被数电老师痛斥期中试卷后的数电知识总结(四):时序逻辑电路的分析与设计_靳小锅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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有