日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

软件设计开发笔记1:基于状态机的程序设计

發(fā)布時(shí)間:2024/7/23 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 软件设计开发笔记1:基于状态机的程序设计 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??在編碼實(shí)現(xiàn)的過(guò)程中,我們會(huì)經(jīng)常使用到條件判斷結(jié)構(gòu),而且使用起來(lái)很方便。但是在需要轉(zhuǎn)移的狀態(tài)比較多,或是條件比較復(fù)雜時(shí),我們就可能需要很長(zhǎng)的條件判斷結(jié)構(gòu)來(lái)處理。不過(guò),過(guò)于復(fù)雜的條件判斷結(jié)構(gòu)會(huì)給代碼的編寫(xiě)和維護(hù)帶來(lái)很大的困擾,所以我們希望探索其他的方法來(lái)簡(jiǎn)化這類(lèi)條件結(jié)構(gòu)。

1、原理概述

??條件判斷在代碼實(shí)現(xiàn)中非常有用,有時(shí)候甚至是必不可少的。但過(guò)于復(fù)雜的條件結(jié)構(gòu)卻會(huì)讓程序邏輯變得冗長(zhǎng)而繁瑣,而在某些情況下我們希望采取方法避免這一情況出現(xiàn)。

1.1、問(wèn)題提出

??在項(xiàng)目開(kāi)發(fā)中經(jīng)常會(huì)遇到if/esle語(yǔ)句以及switch/case語(yǔ)句之類(lèi),或者是嵌套的多分支條件判斷的結(jié)構(gòu)。這類(lèi)結(jié)構(gòu)一旦過(guò)于復(fù)雜或冗長(zhǎng)就會(huì)使程序的邏輯結(jié)構(gòu)非常繁瑣。所以很多時(shí)候我們希望避免使用過(guò)于復(fù)雜的條件結(jié)構(gòu)。基于這一目的,我們希望探索一些方法來(lái)簡(jiǎn)化這類(lèi)問(wèn)題。

??在我們實(shí)踐的過(guò)程中,我們發(fā)現(xiàn)有些復(fù)雜的條件結(jié)構(gòu)實(shí)際控制的是同一事物在不同狀態(tài)下的轉(zhuǎn)換。這就讓我們想到了狀態(tài)機(jī),那么是否可以借用狀態(tài)機(jī)的機(jī)制來(lái)解決這一類(lèi)的問(wèn)題呢?在這一篇中我們就來(lái)分析和實(shí)現(xiàn)這一議題。

1.2、什么是狀態(tài)機(jī)

??我們先來(lái)看看什么是狀態(tài)機(jī)。一般來(lái)說(shuō),狀態(tài)機(jī)(state machine)包含有5個(gè)要素,分別是狀態(tài)(state)、遷移(transition)、事件(event)、動(dòng)作(action)、條件(guard)。我們來(lái)具體看看這5個(gè)要素都是什么。

  • 狀態(tài):一個(gè)系統(tǒng)在某一時(shí)刻所存在的穩(wěn)定的工作情況,系統(tǒng)在整個(gè)工作周期中可能有多個(gè)狀態(tài)。一個(gè)狀態(tài)機(jī)需要在狀態(tài)集合中選取一個(gè)狀態(tài)作為初始狀態(tài)。

  • 遷移:系統(tǒng)從一個(gè)狀態(tài)轉(zhuǎn)移到另一個(gè)狀態(tài)的過(guò)程稱(chēng)作遷移,遷移不是自動(dòng)發(fā)生的,需要外界對(duì)系統(tǒng)施加影響。

  • 事件:某一時(shí)刻發(fā)生的對(duì)系統(tǒng)有意義的事情,狀態(tài)機(jī)之所以發(fā)生狀態(tài)遷移,就是因?yàn)槌霈F(xiàn)了事件。

  • 動(dòng)作:在狀態(tài)機(jī)的遷移過(guò)程中,狀態(tài)機(jī)會(huì)做出一些其它的行為,這些行為就是動(dòng)作,動(dòng)作是狀態(tài)機(jī)對(duì)事件的響應(yīng)。

  • 條件:狀態(tài)機(jī)對(duì)事件并不是有求必應(yīng)的,狀態(tài)機(jī)還要滿足一定的條件才能發(fā)生狀態(tài)遷移并實(shí)現(xiàn)對(duì)事件的響應(yīng)。

??對(duì)于狀態(tài)機(jī),我們的理解是,一個(gè)事物存在多個(gè)狀態(tài),這些狀態(tài)可以相互轉(zhuǎn)換,有些可能是雙向的,有些可能是單向的。當(dāng)一定的外部事件發(fā)生時(shí),會(huì)促使事物的狀態(tài)發(fā)生轉(zhuǎn)變,這一過(guò)程就是發(fā)生了狀態(tài)的遷移。當(dāng)事物的狀態(tài)發(fā)生轉(zhuǎn)換后會(huì)執(zhí)行一定的動(dòng)作。但這些動(dòng)作有可能是在狀態(tài)轉(zhuǎn)換進(jìn)入時(shí)執(zhí)行,也可能是狀態(tài)持續(xù)過(guò)程中執(zhí)行,這就要看動(dòng)作執(zhí)行的前提條件。

2、分析設(shè)計(jì)

??接下來(lái)我們將以BLDC操作面板的實(shí)際操作項(xiàng)目來(lái)分析如何實(shí)現(xiàn)通過(guò)狀態(tài)機(jī)機(jī)制簡(jiǎn)化條件結(jié)構(gòu)。在這個(gè)BLDC操作面板項(xiàng)目中,我們使用按鍵操作來(lái)實(shí)現(xiàn)BLDC的操作控制以及LED顯示菜單的切換。

??首先我們來(lái)看一看BLDC的操作控制實(shí)現(xiàn)。對(duì)于BLDC的操作的操作,我們希望按下啟動(dòng)停止按鈕時(shí),BLDC啟動(dòng)并按設(shè)定的速度持續(xù)運(yùn)行。在BLDC正常運(yùn)行的過(guò)程中,如果長(zhǎng)按啟動(dòng)停止按鈕則進(jìn)入全速狀態(tài),如果是短按啟動(dòng)停止按鈕則停止。如果是在全速狀態(tài),如果長(zhǎng)按啟動(dòng)停止按鈕則停止,如果是短按啟動(dòng)停止按鈕則回到常規(guī)速度狀態(tài)。

??對(duì)于這個(gè)需求如果我們使用條件結(jié)構(gòu)則需要使用if/else語(yǔ)句或者switch/case語(yǔ)句來(lái)判斷狀態(tài),然后在各個(gè)分支中通過(guò)條件判斷按鈕的動(dòng)作以實(shí)現(xiàn)對(duì)應(yīng)的操作。在這一方式下,我們需要使用條件結(jié)構(gòu)的嵌套來(lái)實(shí)現(xiàn)這個(gè)過(guò)程,從邏輯結(jié)構(gòu)上來(lái)說(shuō)過(guò)于復(fù)雜而且不同功能模塊的耦合比較緊密。

??接下來(lái),我們以狀態(tài)機(jī)的機(jī)制來(lái)分析一下。我們注意到BLDC實(shí)際有3種狀態(tài),分別是停止?fàn)顟B(tài)、常速運(yùn)行狀態(tài)、全速運(yùn)行狀態(tài)。而這3種狀態(tài)之間可以相互轉(zhuǎn)化,但并無(wú)直接關(guān)聯(lián),在不同的狀態(tài)下將執(zhí)行不同的操作。它們之間將根據(jù)按鈕的事件產(chǎn)生轉(zhuǎn)換。對(duì)比前面我們對(duì)狀態(tài)機(jī)的要素的表述,實(shí)際上已經(jīng)完全具備了狀態(tài)機(jī)的全部要素,所以我們將其狀態(tài)轉(zhuǎn)化過(guò)程表述如下圖:

??接下來(lái)我們看一看菜單的切換問(wèn)題。菜單的切換更復(fù)雜一點(diǎn),就是在不同的情況下,會(huì)有不同的顯示。我們將其歸為5類(lèi),也就是5個(gè)菜單,這些菜單根據(jù)按鍵的不同顯示不同的菜單。我們將每個(gè)顯示菜單定義為一種狀態(tài),那么其實(shí)就已經(jīng)具備了狀態(tài)機(jī)的全部5個(gè)要素,具體狀態(tài)轉(zhuǎn)換過(guò)程如下圖所示:

??我們將BLDC的控制以及顯示菜單的切換抽象為狀態(tài)機(jī),以避免冗長(zhǎng)的條件選擇結(jié)構(gòu),簡(jiǎn)化程序邏輯結(jié)構(gòu),使得程序更為清晰。

3、軟件實(shí)現(xiàn)

??前述,我們已經(jīng)分析了將BLDC的控制及顯示菜單的切換使用狀態(tài)機(jī)來(lái)實(shí)現(xiàn)的方法。接下來(lái)我們就來(lái)考慮其具體的實(shí)現(xiàn)方式。

??首先,我們來(lái)分析BLDC的控制。我們已經(jīng)知道BLDC的控制要求有3個(gè)狀態(tài):停止?fàn)顟B(tài)、常速狀態(tài)、全速狀態(tài)。通過(guò)按鍵事件來(lái)控制狀態(tài)產(chǎn)生遷移并執(zhí)行動(dòng)作。我們需要一個(gè)變量來(lái)記錄按鍵事件對(duì)BLDC產(chǎn)生的命令,這個(gè)命令變量取值0、1、2以對(duì)應(yīng)3個(gè)狀態(tài)的遷移命令。之所以去這樣的3個(gè)值并沒(méi)有什么特殊之處,僅僅只是為了我們?cè)诤罄m(xù)的處理中方便使用而已。同樣我們需要變量來(lái)記錄當(dāng)前所處的狀態(tài),取值也用0、1、2對(duì)應(yīng)3個(gè)狀態(tài)。當(dāng)然我們還需要定義每種狀態(tài)下所對(duì)應(yīng)的動(dòng)作,為了操作方便我們將每種狀態(tài)下的動(dòng)作定義為一個(gè)單獨(dú)的函數(shù),也就是每種狀態(tài)有一個(gè)響應(yīng)函數(shù)。至于響應(yīng)函數(shù)的實(shí)現(xiàn)則根據(jù)需求而定,函數(shù)中包括相應(yīng)條件。具體如下:

void (*BldcControl[3])(void)={BldcStopHandler,BldcNormalSpeedHandler,BldcFullSpeedHandler};BldcControl[aPara.phyPara.pumpStartStop]();

??其中aPara.phyPara.pumpStartStop變量記錄的是對(duì)按鍵事件的記錄,狀態(tài)機(jī)根據(jù)變量的值來(lái)調(diào)用狀態(tài)響應(yīng)函數(shù)來(lái)遷移并維持在指定的狀態(tài)。三個(gè)函數(shù)對(duì)應(yīng)三種狀態(tài)下的響應(yīng)函數(shù)。這樣就實(shí)現(xiàn)了不同的事件遷移到不同的狀態(tài)的狀態(tài)機(jī)結(jié)構(gòu),相比于條件分支判斷結(jié)構(gòu)要簡(jiǎn)化很多。

??接下來(lái),我們?cè)賮?lái)看看菜單顯示狀態(tài)的實(shí)現(xiàn)。前面我們已經(jīng)描述過(guò)菜單顯示劃分為5種狀態(tài),我們使用一個(gè)變量來(lái)記錄狀態(tài)及遷移。這個(gè)變量取值0、1、2、3、4分別對(duì)應(yīng)當(dāng)前速度顯示狀態(tài)、量程顯示狀態(tài)、全速設(shè)定顯示狀態(tài)、系數(shù)設(shè)定顯示狀態(tài)、速度設(shè)定顯示狀態(tài)。具體如下:

void (*LedDisPlay[5])(void)={SpeedCurrentDisplay,SpeedUpperDisplay,SpeedFullDisplay,SpeedFactorDisplay,SpeedSettingDisplay};LedDisPlay[aPara.phyPara.menuIndex]();

??同樣的aPara.phyPara.menuIndex是狀態(tài)遷移及狀態(tài)記錄變量,而5個(gè)函數(shù)則對(duì)應(yīng)不同狀態(tài)下的響應(yīng)函數(shù)。

4、小結(jié)

??在這一篇中,我們以一個(gè)BLDC驅(qū)動(dòng)控制板的實(shí)例描述了使用狀態(tài)機(jī)代替復(fù)雜的條件分支判斷結(jié)構(gòu)的過(guò)程及方法。我們實(shí)現(xiàn)了使用狀態(tài)機(jī)機(jī)制編碼BLDC的驅(qū)動(dòng)控制和菜單顯示切換的功能。這一實(shí)例已經(jīng)應(yīng)用于多個(gè)項(xiàng)目之中,效果良好。

??這一方式其實(shí)適用于很多需要條件判斷來(lái)切換控制的場(chǎng)合。事實(shí)上,我們?cè)诙鄠€(gè)電機(jī)控制、流程控制等應(yīng)用場(chǎng)合都是用了類(lèi)似的方法,而且應(yīng)用的結(jié)果都比較滿意。當(dāng)然,我們并不是建議讀者使用此法,只是提供一種思路,我們認(rèn)為所謂結(jié)構(gòu)優(yōu)化本就是見(jiàn)仁見(jiàn)智的事情。

歡迎關(guān)注:

總結(jié)

以上是生活随笔為你收集整理的软件设计开发笔记1:基于状态机的程序设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。