前言:
状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。
这里同学们可以看一下我有关于状态机的另一篇博客
被数电老师痛斥期中试卷后的数电知识总结(四):时序逻辑电路的分析与设计_靳小锅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;
}