在編碼實現(xiàn)的過程中,我們會經(jīng)常使用到條件判斷結構,而且使用起來很方便。但是在需要轉移的狀態(tài)比較多,或是條件比較復雜時,我們就可能需要很長的條件判斷結構來處理。不過,過于復雜的條件判斷結構會給代碼的編寫和維護帶來很大的困擾,所以我們希望探索其他的方法來簡化這類條件結構。
1、原理概述
??條件判斷在代碼實現(xiàn)中非常有用,有時候甚至是必不可少的。但過于復雜的條件結構卻會讓程序邏輯變得冗長而繁瑣,而在某些情況下我們希望采取方法避免這一情況出現(xiàn)。
1.1、問題提出
??在項目開發(fā)中經(jīng)常會遇到if/esle語句以及switch/case語句之類,或者是嵌套的多分支條件判斷的結構。這類結構一旦過于復雜或冗長就會使程序的邏輯結構非常繁瑣。所以很多時候我們希望避免使用過于復雜的條件結構?;谶@一目的,我們希望探索一些方法來簡化這類問題。
??在我們實踐的過程中,我們發(fā)現(xiàn)有些復雜的條件結構實際控制的是同一事物在不同狀態(tài)下的轉換。這就讓我們想到了狀態(tài)機,那么是否可以借用狀態(tài)機的機制來解決這一類的問題呢?在這一篇中我們就來分析和實現(xiàn)這一議題。
1.2、什么是狀態(tài)機
??我們先來看看什么是狀態(tài)機。一般來說,狀態(tài)機(state machine)包含有5個要素,分別是狀態(tài)(state)、遷移(transition)、事件(event)、動作(action)、條件(guard)。我們來具體看看這5個要素都是什么。
- 狀態(tài):一個系統(tǒng)在某一時刻所存在的穩(wěn)定的工作情況,系統(tǒng)在整個工作周期中可能有多個狀態(tài)。一個狀態(tài)機需要在狀態(tài)集合中選取一個狀態(tài)作為初始狀態(tài)。
- 遷移:系統(tǒng)從一個狀態(tài)轉移到另一個狀態(tài)的過程稱作遷移,遷移不是自動發(fā)生的,需要外界對系統(tǒng)施加影響。
- 事件:某一時刻發(fā)生的對系統(tǒng)有意義的事情,狀態(tài)機之所以發(fā)生狀態(tài)遷移,就是因為出現(xiàn)了事件。
- 動作:在狀態(tài)機的遷移過程中,狀態(tài)機會做出一些其它的行為,這些行為就是動作,動作是狀態(tài)機對事件的響應。
- 條件:狀態(tài)機對事件并不是有求必應的,狀態(tài)機還要滿足一定的條件才能發(fā)生狀態(tài)遷移并實現(xiàn)對事件的響應。
??對于狀態(tài)機,我們的理解是,一個事物存在多個狀態(tài),這些狀態(tài)可以相互轉換,有些可能是雙向的,有些可能是單向的。當一定的外部事件發(fā)生時,會促使事物的狀態(tài)發(fā)生轉變,這一過程就是發(fā)生了狀態(tài)的遷移。當事物的狀態(tài)發(fā)生轉換后會執(zhí)行一定的動作。但這些動作有可能是在狀態(tài)轉換進入時執(zhí)行,也可能是狀態(tài)持續(xù)過程中執(zhí)行,這就要看動作執(zhí)行的前提條件。
2、分析設計
??接下來我們將以BLDC操作面板的實際操作項目來分析如何實現(xiàn)通過狀態(tài)機機制簡化條件結構。在這個BLDC操作面板項目中,我們使用按鍵操作來實現(xiàn)BLDC的操作控制以及LED顯示菜單的切換。
??首先我們來看一看BLDC的操作控制實現(xiàn)。對于BLDC的操作的操作,我們希望按下啟動停止按鈕時,BLDC啟動并按設定的速度持續(xù)運行。在BLDC正常運行的過程中,如果長按啟動停止按鈕則進入全速狀態(tài),如果是短按啟動停止按鈕則停止。如果是在全速狀態(tài),如果長按啟動停止按鈕則停止,如果是短按啟動停止按鈕則回到常規(guī)速度狀態(tài)。
??對于這個需求如果我們使用條件結構則需要使用if/else語句或者switch/case語句來判斷狀態(tài),然后在各個分支中通過條件判斷按鈕的動作以實現(xiàn)對應的操作。在這一方式下,我們需要使用條件結構的嵌套來實現(xiàn)這個過程,從邏輯結構上來說過于復雜而且不同功能模塊的耦合比較緊密。
??接下來,我們以狀態(tài)機的機制來分析一下。我們注意到BLDC實際有3種狀態(tài),分別是停止狀態(tài)、常速運行狀態(tài)、全速運行狀態(tài)。而這3種狀態(tài)之間可以相互轉化,但并無直接關聯(lián),在不同的狀態(tài)下將執(zhí)行不同的操作。它們之間將根據(jù)按鈕的事件產(chǎn)生轉換。對比前面我們對狀態(tài)機的要素的表述,實際上已經(jīng)完全具備了狀態(tài)機的全部要素,所以我們將其狀態(tài)轉化過程表述如下圖:
??接下來我們看一看菜單的切換問題。菜單的切換更復雜一點,就是在不同的情況下,會有不同的顯示。我們將其歸為5類,也就是5個菜單,這些菜單根據(jù)按鍵的不同顯示不同的菜單。我們將每個顯示菜單定義為一種狀態(tài),那么其實就已經(jīng)具備了狀態(tài)機的全部5個要素,具體狀態(tài)轉換過程如下圖所示:
??我們將BLDC的控制以及顯示菜單的切換抽象為狀態(tài)機,以避免冗長的條件選擇結構,簡化程序邏輯結構,使得程序更為清晰。
3、軟件實現(xiàn)
??前述,我們已經(jīng)分析了將BLDC的控制及顯示菜單的切換使用狀態(tài)機來實現(xiàn)的方法。接下來我們就來考慮其具體的實現(xiàn)方式。
??首先,我們來分析BLDC的控制。我們已經(jīng)知道BLDC的控制要求有3個狀態(tài):停止狀態(tài)、常速狀態(tài)、全速狀態(tài)。通過按鍵事件來控制狀態(tài)產(chǎn)生遷移并執(zhí)行動作。我們需要一個變量來記錄按鍵事件對BLDC產(chǎn)生的命令,這個命令變量取值0、1、2以對應3個狀態(tài)的遷移命令。之所以去這樣的3個值并沒有什么特殊之處,僅僅只是為了我們在后續(xù)的處理中方便使用而已。同樣我們需要變量來記錄當前所處的狀態(tài),取值也用0、1、2對應3個狀態(tài)。當然我們還需要定義每種狀態(tài)下所對應的動作,為了操作方便我們將每種狀態(tài)下的動作定義為一個單獨的函數(shù),也就是每種狀態(tài)有一個響應函數(shù)。至于響應函數(shù)的實現(xiàn)則根據(jù)需求而定,函數(shù)中包括相應條件。具體如下:
void (*BldcControl[3])(void)={BldcStopHandler,
BldcNormalSpeedHandler,
BldcFullSpeedHandler};
BldcControl[aPara.phyPara.pumpStartStop]();
??其中aPara.phyPara.pumpStartStop變量記錄的是對按鍵事件的記錄,狀態(tài)機根據(jù)變量的值來調用狀態(tài)響應函數(shù)來遷移并維持在指定的狀態(tài)。三個函數(shù)對應三種狀態(tài)下的響應函數(shù)。這樣就實現(xiàn)了不同的事件遷移到不同的狀態(tài)的狀態(tài)機結構,相比于條件分支判斷結構要簡化很多。
??接下來,我們再來看看菜單顯示狀態(tài)的實現(xiàn)。前面我們已經(jīng)描述過菜單顯示劃分為5種狀態(tài),我們使用一個變量來記錄狀態(tài)及遷移。這個變量取值0、1、2、3、4分別對應當前速度顯示狀態(tài)、量程顯示狀態(tài)、全速設定顯示狀態(tài)、系數(shù)設定顯示狀態(tài)、速度設定顯示狀態(tài)。具體如下:
void (*LedDisPlay[5])(void)={SpeedCurrentDisplay,
SpeedUpperDisplay,
SpeedFullDisplay,
SpeedFactorDisplay,
SpeedSettingDisplay};
LedDisPlay[aPara.phyPara.menuIndex]();
??同樣的aPara.phyPara.menuIndex是狀態(tài)遷移及狀態(tài)記錄變量,而5個函數(shù)則對應不同狀態(tài)下的響應函數(shù)。
4、小結
??在這一篇中,我們以一個BLDC驅動控制板的實例描述了使用狀態(tài)機代替復雜的條件分支判斷結構的過程及方法。我們實現(xiàn)了使用狀態(tài)機機制編碼BLDC的驅動控制和菜單顯示切換的功能。這一實例已經(jīng)應用于多個項目之中,效果良好。
??這一方式其實適用于很多需要條件判斷來切換控制的場合。事實上,我們在多個電機控制、流程控制等應用場合都是用了類似的方法,而且應用的結果都比較滿意。當然,我們并不是建議讀者使用此法,只是提供一種思路,我們認為所謂結構優(yōu)化本就是見仁見智的事情。
-
BLDC
+關注
關注
213文章
833瀏覽量
98347 -
狀態(tài)機
+關注
關注
2文章
493瀏覽量
28250 -
程序設計
+關注
關注
3文章
262瀏覽量
31024
發(fā)布評論請先 登錄
請教狀態(tài)機程序設計的優(yōu)化問題
如何去實現(xiàn)有限狀態(tài)機FSM的程序設計呢
ARM7嵌入式系統(tǒng)在車輛調度中的應用
狀態(tài)機思路在單片機程序設計中的應用

狀態(tài)機思路在單片機程序設計中的應用

用狀態(tài)機原理進行軟件設計
如何對狀態(tài)機的程序進行靈活修改

狀態(tài)機如何簡化PLC程序的編寫
狀態(tài)模式(狀態(tài)機)

評論