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