大家晚上好,今天給大家分享一個篇關(guān)于狀態(tài)機的學(xué)習(xí)。為啥突然會寫這個話題,因為今天要看文章和視頻學(xué)習(xí)的時候,突然看到了“狀態(tài)機”三個字,也突然讓我想起了,在剛?cè)肼氁患夜镜臅r候,看產(chǎn)品的源代碼畫出整個軟件框架流程圖來,現(xiàn)在我還清晰的記得當(dāng)時公司產(chǎn)品里面就有用到這個狀態(tài)機的用法,但是當(dāng)時我剛接觸到這個東西,看了老半天那個源碼嗎,沒看懂,因為那時候第一次看那么大的工程量代碼,說實話腦袋有點暈暈的,不是很習(xí)慣。所以今天的文章只是帶大家入門和了解一下狀態(tài)機,等你真正在工作當(dāng)中有遇到這個狀態(tài)機作為開發(fā)需要的話,你再去深入研究。
一、什么是狀態(tài)機?
1、有限狀態(tài)機:
常說的狀態(tài)機是有限狀態(tài)機FSM(Finite State Machine)。FSM指的是有有限個狀態(tài)(一般是一個狀態(tài)變量的值),這個機器同時能夠從外部接收信號和信息輸入,機器在接收到外部輸入的信號后會綜合考慮當(dāng)前自己的狀態(tài)和用戶輸入的信息,然后機器做出動作:跳轉(zhuǎn)到另一個狀態(tài)。
舉個實際生活例子來理解一下,比如我們平時燒開水喝,在你沒燒之前,水的狀態(tài)是液態(tài)的,但是當(dāng)你把外界溫度一升高,水達到它的沸點之后,就會形成水蒸氣;當(dāng)你把外界溫度降下來,水蒸氣就有會變成液態(tài)的水了。這里是外界條件是溫度,溫度的變化會引起水的狀態(tài)的變化。這個例子可以和我們的狀態(tài)機來做一個簡單的思想對比。
2、考慮狀態(tài)機的關(guān)鍵點:
從剛才的定義來看,我們只要抓住狀態(tài)機的關(guān)鍵點來理解就行:
1、外部輸入
2、當(dāng)前狀態(tài)
3、下一個狀態(tài)
二、兩種狀態(tài)機類型:
(1)Moore型狀態(tài)機特點是:輸出只與當(dāng)前狀態(tài)有關(guān)(與輸入信號無關(guān))。相對簡單,考慮狀態(tài)機的下一個狀態(tài)時只需要考慮它的當(dāng)前狀態(tài)就行了。
(2)Mealy型狀態(tài)機的特點是:輸出不只和當(dāng)前狀態(tài)有關(guān),還與輸入信號有關(guān)。狀態(tài)機接收到一個輸入信號需要跳轉(zhuǎn)到下一個狀態(tài)時,狀態(tài)機綜合考慮2個條件(當(dāng)前狀態(tài)、輸入值)后才決定跳轉(zhuǎn)到哪個狀態(tài)。
三、狀態(tài)機的常見用途:
(1)電路設(shè)計中廣泛使用了狀態(tài)機思想。
(2)FPGA程序設(shè)計。
(3)軟件設(shè)計(框架類型的設(shè)計,譬如操作系統(tǒng)的GUI系統(tǒng)、消息機制)。
四、狀態(tài)機解決了什么問題:
(1)我們平時寫程序都是順序執(zhí)行的,這種程序有個特點:程序的大體執(zhí)行流程是既定的,程序的執(zhí)行是遵照一定的大的方向有跡可尋的。
(2)但是偶爾會碰到這樣的程序:外部不一定會按照既定流程來給程序輸入信息,而程序還需要完全能夠接收并響應(yīng)外部的這些輸入信號,還要能做出符合邏輯的輸出。
五、實戰(zhàn)例子:
開鎖狀態(tài)機。功能描述:用戶連續(xù)輸入正確的密碼則會開鎖,如果密碼輸入過程錯誤則鎖會退回到初始狀態(tài)重新計入密碼,即:用戶只需要連續(xù)輸入出正確的密碼即可開鎖(輸入錯誤不用撤銷、也不用刪除)。
#include <stdio.h>
// 給狀態(tài)機定義狀態(tài)集
typedef enum
{
STATE1,
STATE2,
STATE3,
STATE4,
STATE5,
STATE6,
STATE7,
}STATE;
int main(void)
{
int num = 0;
// current_state記錄狀態(tài)機的當(dāng)前狀態(tài),初始為STATE1,用戶每輸入一個正確的
// 密碼STATE就走一步,一直到STATE為STATE7后鎖就開了;其中只要有一次用戶
// 輸入對不上就回到STATE1.
STATE current_state = STATE1; // 狀態(tài)機初始狀態(tài)為STATE1
// 第一步:實現(xiàn)一個用戶循環(huán)輸入密碼的循環(huán)
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;
-
狀態(tài)機
+關(guān)注
關(guān)注
2文章
501瀏覽量
29321 -
fsm
+關(guān)注
關(guān)注
0文章
36瀏覽量
13125
發(fā)布評論請先 登錄
單片機的入門準(zhǔn)備
條件判斷法來實現(xiàn)狀態(tài)機
睿遠研究院丨IO-Link規(guī)范解讀(十一):ISDU狀態(tài)機與EVENT事件
什么是狀態(tài)機?
嵌入式開發(fā)為何經(jīng)常用到狀態(tài)機架構(gòu)
睿遠研究院丨IO-Link規(guī)范解讀(八):M-Sequence Type 與消息處理狀態(tài)機
睿遠研究院丨IO-Link規(guī)范解讀(六):主從站狀態(tài)機解析
JTAG標(biāo)準(zhǔn)的狀態(tài)機實現(xiàn)
請問如何在FX10上使用GPIF III狀態(tài)機 *.h 文件?
NVMe高速傳輸之?dāng)[脫XDMA設(shè)計之十:NVMe初始化狀態(tài)機設(shè)計
NVMe高速傳輸之?dāng)[脫XDMA設(shè)計之八:PCIe初始化狀態(tài)機設(shè)計
有可能在 FX3 GPIF2 中創(chuàng)建兩個獨立的狀態(tài)機嗎?
求助,關(guān)于srammaster.cydsn中狀態(tài)機的問題求解
NVME控制器設(shè)計之指令控制
簡單的狀態(tài)機入門知識詳解
評論