先來看一下狀态機的定義:
狀态機由狀态寄存器群組合邏輯電路構成,能夠根據控制信号按照預先設定的狀态進行狀态轉移,是協調相關信号動作、完成特定操作的控制中心。有限狀态機簡寫為FSM(Finite State Machine),主要分為2大類:
第一類,若輸出隻和狀态有關而與輸入無關,則稱為Moore狀态機
第二類,輸出不僅和狀态有關而且和輸入有關系,則稱為Mealy狀态機
考慮狀态機的關鍵點:目前狀态、外部輸入、下一個狀态
狀态機的主要用途:電路設計、FPGA程式設計、軟體設計
- 電路設計中廣泛使用了狀态機思想
- FPGA程式設計
- 軟體設計(架構類型的設計,譬如作業系統的GUI系統、消息機制)
狀态機解決了什麼問題:
一般的程式都是順序執行,這種程式有個特點是程式的大體執行流程是既定的,程式的執行是遵照一定的大的方向有迹可尋的。但是偶爾會碰到這樣的程式:外部不一定會按照既定流程來給程式輸入資訊,而程式還需要完全能夠接收并響應外部的這些輸入信号,還要能做出符合邏輯的輸出。
用C語言實作簡單的狀态機:
題目:開鎖狀态機。功能描述:使用者連續輸入正确的密碼則會開鎖,如果密碼輸入過程錯誤則鎖會退回到初始狀态重新計入密碼,即:使用者隻需要連續輸入出正确的密碼即可開鎖(輸入錯誤不用撤銷、也不用删除)
#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;
}
文章參考自朱友鵬老師物聯網課程