大家晚上好,今天給大家分享一個篇關于狀態機的學習。為啥突然會寫這個話題,因為今天要看文章和視頻學習的時候,突然看到了“狀態機”三個字,也突然讓我想起了,在剛入職一家公司的時候,看產品的源代碼畫出整個軟件框架流程圖來,現在我還清晰的記得當時公司產品里面就有用到這個狀態機的用法,但是當時我剛接觸到這個東西,看了老半天那個源碼嗎,沒看懂,因為那時候第一次看那么大的工程量代碼,說實話腦袋有點暈暈的,不是很習慣。所以今天的文章只是帶大家入門和了解一下狀態機,等你真正在工作當中有遇到這個狀態機作為開發需要的話,你再去深入研究。
一、什么是狀態機?
1、有限狀態機:
常說的狀態機是有限狀態機FSM(Finite State Machine)。FSM指的是有有限個狀態(一般是一個狀態變量的值),這個機器同時能夠從外部接收信號和信息輸入,機器在接收到外部輸入的信號后會綜合考慮當前自己的狀態和用戶輸入的信息,然后機器做出動作:跳轉到另一個狀態。
舉個實際生活例子來理解一下,比如我們平時燒開水喝,在你沒燒之前,水的狀態是液態的,但是當你把外界溫度一升高,水達到它的沸點之后,就會形成水蒸氣;當你把外界溫度降下來,水蒸氣就有會變成液態的水了。這里是外界條件是溫度,溫度的變化會引起水的狀態的變化。這個例子可以和我們的狀態機來做一個簡單的思想對比。
2、考慮狀態機的關鍵點:
從剛才的定義來看,我們只要抓住狀態機的關鍵點來理解就行:
1、外部輸入
2、當前狀態
3、下一個狀態
二、兩種狀態機類型:
(1)Moore型狀態機特點是:輸出只與當前狀態有關(與輸入信號無關)。相對簡單,考慮狀態機的下一個狀態時只需要考慮它的當前狀態就行了。
(2)Mealy型狀態機的特點是:輸出不只和當前狀態有關,還與輸入信號有關。狀態機接收到一個輸入信號需要跳轉到下一個狀態時,狀態機綜合考慮2個條件(當前狀態、輸入值)后才決定跳轉到哪個狀態。
三、狀態機的常見用途:
(1)電路設計中廣泛使用了狀態機思想。
(2)FPGA程序設計。
(3)軟件設計(框架類型的設計,譬如操作系統的GUI系統、消息機制)。
四、狀態機解決了什么問題:
(1)我們平時寫程序都是順序執行的,這種程序有個特點:程序的大體執行流程是既定的,程序的執行是遵照一定的大的方向有跡可尋的。
(2)但是偶爾會碰到這樣的程序:外部不一定會按照既定流程來給程序輸入信息,而程序還需要完全能夠接收并響應外部的這些輸入信號,還要能做出符合邏輯的輸出。
五、實戰例子:
開鎖狀態機。功能描述:用戶連續輸入正確的密碼則會開鎖,如果密碼輸入過程錯誤則鎖會退回到初始狀態重新計入密碼,即:用戶只需要連續輸入出正確的密碼即可開鎖(輸入錯誤不用撤銷、也不用刪除)。
#include <stdio.h>
// 給狀態機定義狀態集
typedef enum
{
STATE1,
STATE2,
STATE3,
STATE4,
STATE5,
STATE6,
STATE7,
}STATE;
int main(void)
{
int num = 0;
// current_state記錄狀態機的當前狀態,初始為STATE1,用戶每輸入一個正確的
// 密碼STATE就走一步,一直到STATE為STATE7后鎖就開了;其中只要有一次用戶
// 輸入對不上就回到STATE1.
STATE current_state = STATE1; // 狀態機初始狀態為STATE1
// 第一步:實現一個用戶循環輸入密碼的循環
printf("請輸入密碼,密碼正確開鎖.");
while (1)
{
scanf("%d", &num);
printf("num = %d.", num);
// 在這里處理用戶的本次輸入
switch (current_state)
{
case STATE1:
if (num == 1)
{
current_state = STATE2; // 用戶輸入對了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
-
狀態機
+關注
關注
2文章
492瀏覽量
27579 -
fsm
+關注
關注
0文章
35瀏覽量
12829
發布評論請先 登錄
相關推薦
評論