嚴(yán)格意義上來(lái)講,狀態(tài)機(jī)理論應(yīng)該屬于控制理論的范疇,他其實(shí)不光在軟件領(lǐng)域發(fā)光發(fā)熱,實(shí)際上他對(duì)于硬件設(shè)計(jì)更加的重要,多年前我曾讀過分享過那些當(dāng)年看不懂的文章,依舊給他人很大的幫助。
有興趣的童鞋可以去讀一下,不論你從事軟件還是硬件,都值得一讀,接下來(lái)進(jìn)入正題,我們來(lái)速成狀態(tài)機(jī),舉個(gè)例子:
早期的狀態(tài)機(jī)控制理論(不完整)
地震啦~?。。。?我:。。。跑~!?。。ㄟ@就是狀態(tài)機(jī)的早期的事件動(dòng)作范型)(缺點(diǎn):我是誰(shuí) ,我在哪 ,我為什么要跑?)
完整的狀態(tài)機(jī)模型(完整語(yǔ)義)
地震啦~?。?!
版本一,我:我居然在大樓里~! 跑~?。?!
版本二,我:我在大草原上~!沒事兒~!?。?/span>
這就是完整的狀態(tài)機(jī)模型(事件-狀態(tài)-動(dòng)作范型),看到這里你也就學(xué)會(huì)了狀態(tài)機(jī),簡(jiǎn)不簡(jiǎn)單~!是的,狀態(tài)機(jī)的初衷就是為了不制造麻煩~!
狀態(tài)機(jī)進(jìn)階(任何理論都會(huì)因?qū)嵺`慢慢改進(jìn)豐富和進(jìn)階):
普通版狀態(tài)機(jī):
媽媽要出門買雞蛋了,你在家先寫十分鐘的作業(yè),然后就可以看會(huì)兒動(dòng)畫片了, 這時(shí)候你躁動(dòng)了,十分鐘等于六百秒,于是開始1...2...3...600....終于可以看電視了,你再數(shù)數(shù)之前,要先想一下之前數(shù)的是幾(歷史就是狀態(tài)),然后才知道下一個(gè)是幾。要完整這件事你要數(shù)600個(gè)數(shù),轉(zhuǎn)換600中狀態(tài),什么時(shí)候轉(zhuǎn)換呢,你會(huì)盯著時(shí)鐘的秒表,他動(dòng)一下,你加一(事件)。結(jié)果媽媽回來(lái),發(fā)現(xiàn)你居然沒有寫作業(yè),于是不光挨了罵,動(dòng)畫片也看不成了。
擴(kuò)展?fàn)顟B(tài)機(jī)(進(jìn)階版):
媽媽要出門買雞蛋了,你在家先寫十分鐘的作業(yè),然后就可以看會(huì)兒動(dòng)畫片了, 你拿過鬧鐘,定了一個(gè)十分鐘的鬧鐘,然后繼續(xù)寫作業(yè)(狀態(tài)1),十分鐘后,鬧鐘響了(監(jiān)護(hù)條件),時(shí)間到啦,你放下作業(yè),打開電視,開始看動(dòng)畫片(狀態(tài)2),不一會(huì)兒媽媽回來(lái)了,檢查了你的作業(yè),發(fā)現(xiàn)你很守信用,于是不光讓你多看一會(huì)兒電視,而且還獎(jiǎng)勵(lì)了一根棒棒糖。
總結(jié):并不是所有的狀態(tài)都要被構(gòu)造成狀態(tài)機(jī),如果有很多狀態(tài)其實(shí)都是一個(gè)簡(jiǎn)單的變量維護(hù),那么可以建立一個(gè)狀態(tài)機(jī),再其內(nèi)部維護(hù)這個(gè)變量,創(chuàng)建一個(gè)監(jiān)護(hù)條件,只有等監(jiān)護(hù)條件滿足時(shí),才跳轉(zhuǎn)到其它狀態(tài)機(jī)。
注意:在單片機(jī)軟件中構(gòu)造一個(gè)狀態(tài)機(jī)是需要一定內(nèi)存資源開銷的,想想我們那可憐的RAM,一個(gè)項(xiàng)目到底要分解成多少個(gè)狀態(tài)機(jī)不光是技術(shù)問題,更是藝術(shù)問題。
狀態(tài)機(jī)中最重要的幾個(gè)概念:事件 狀態(tài) 動(dòng)作 (擴(kuò)展?fàn)顟B(tài)機(jī)還有監(jiān)護(hù)條件)
一個(gè)簡(jiǎn)單的狀態(tài)機(jī)可以如下描述:
狀態(tài)機(jī)還有個(gè)很重要的概念要RTC(Run-to-Completion):大體意思是運(yùn)行到完成,這個(gè)過程是不可以打斷的,因?yàn)槿绻淮驍嗔耍敲茨憔突謴?fù)現(xiàn)場(chǎng),問題就復(fù)雜了,舉個(gè)例子,鬧鐘響了(事件發(fā)生),我(睡眠狀態(tài))到(起床狀態(tài))需要完成的RTC如下:
伸懶腰 穿衣 穿鞋 洗漱結(jié)束。假如你在穿衣的過程中,突然接到女神的求助電話,這時(shí)候可能直接從床上跳起來(lái),寫也顧不上穿就飛奔而去,這就打亂了我們?cè)镜臓顟B(tài)機(jī)執(zhí)行上下文,導(dǎo)致你鞋沒穿 牙沒刷出門了,理論上這是不允許的,盡管現(xiàn)實(shí)中是你想要的。
到這里基本就完成了傳統(tǒng)意義上的FSM(有限狀態(tài)機(jī))的學(xué)習(xí),理論的東西,理解就好了,詳細(xì)看書可以要花個(gè)半天,當(dāng)然更專業(yè),如下: