www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]狀態(tài)機(jī)的概念 狀態(tài)機(jī)是軟件編程中的一個重要概念。比這個概念更重要的是對它的靈活應(yīng)用。在一個思路清晰而且高效的程序中,必然有狀態(tài)機(jī)的身影浮現(xiàn)。 比如說一個按鍵命令解析程序,就可以被看做狀態(tài)機(jī):本

狀態(tài)機(jī)的概念

      狀態(tài)機(jī)是軟件編程中的一個重要概念。比這個概念更重要的是對它的靈活應(yīng)用。在一個思路清晰而且高效的程序中,必然有狀態(tài)機(jī)的身影浮現(xiàn)。

      比如說一個按鍵命令解析程序,就可以被看做狀態(tài)機(jī):本來在A狀態(tài)下,觸發(fā)一個按鍵后切換到了B狀態(tài);再觸發(fā)另一個鍵后切換到C狀態(tài),或者返回到A狀態(tài)。這就是最簡單的按鍵狀態(tài)機(jī)例子。實(shí)際的按鍵解析程序會比這更復(fù)雜些,但這不影響我們對狀態(tài)機(jī)的認(rèn)識。

      進(jìn)一步看,擊鍵動作本身也可以看做一個狀態(tài)機(jī)。一個細(xì)小的擊鍵動作包含了:釋放、抖動、閉合、抖動和重新釋放等狀態(tài)。

      同樣,一個串行通信的時序(不管它是遵循何種協(xié)議,標(biāo)準(zhǔn)串口也好、I2C也好;也不管它是有線的、還是紅外的、無線的)也都可以看做由一系列有限的狀態(tài)構(gòu)成。

      顯示掃描程序也是狀態(tài)機(jī);通信命令解析程序也是狀態(tài)機(jī);甚至連繼電器的吸合/釋放控制、發(fā)光管(LED)的亮/滅控制又何嘗不是個狀態(tài)機(jī)。

      當(dāng)我們打開思路,把狀態(tài)機(jī)作為一種思想導(dǎo)入到程序中去時,就會找到解決問題的一條有效的捷徑。有時候用狀態(tài)機(jī)的思維去思考程序該干什么,比用控制流程的思維去思考,可能會更有效。這樣一來狀態(tài)機(jī)便有了更實(shí)際的功用。

程序其實(shí)就是狀態(tài)機(jī)。

      也許你還不理解上面這句話。請想想看,計算機(jī)的大廈不就是建立在“0”和“1”兩個基本狀態(tài)的地基之上么?

狀態(tài)機(jī)的要素

      狀態(tài)機(jī)可歸納為4個要素,即現(xiàn)態(tài)、條件、動作、次態(tài)。這樣的歸納,主要是出于對狀態(tài)機(jī)的內(nèi)在因果關(guān)系的考慮?!艾F(xiàn)態(tài)”和“條件”是因,“動作”和“次態(tài)”是果。詳解如下:

      ①現(xiàn)態(tài):是指當(dāng)前所處的狀態(tài)。

      ②條件:又稱為“事件”。當(dāng)一個條件被滿足,將會觸發(fā)一個動作,或者執(zhí)行一次狀態(tài)的遷移。

      ③動作:條件滿足后執(zhí)行的動作。動作執(zhí)行完畢后,可以遷移到新的狀態(tài),也可以仍舊保持原狀態(tài)。動作不是必需的,當(dāng)條件滿足后,也可以不執(zhí)行任何動作,直接遷移到新狀態(tài)。

      ④次態(tài):條件滿足后要遷往的新狀態(tài)?!按螒B(tài)”是相對于“現(xiàn)態(tài)”而言的,“次態(tài)”一旦被激活,就轉(zhuǎn)變成新的“現(xiàn)態(tài)”了。

      如果我們進(jìn)一步歸納,把“現(xiàn)態(tài)”和“次態(tài)”統(tǒng)一起來,而把“動作”忽略(降格處理),則只剩下兩個最關(guān)鍵的要素,即:狀態(tài)、遷移條件。

      狀態(tài)機(jī)的表示方法有許多種,我們可以用文字、圖形或表格的形式來表示一個狀態(tài)機(jī)。

      純粹用文字描述是很低效的,所以就不介紹了。接下來先介紹圖形的方式。

      狀態(tài)遷移圖(STD)

      狀態(tài)遷移圖(STD),是一種描述系統(tǒng)的狀態(tài)、以及相互轉(zhuǎn)化關(guān)系的圖形方式。狀態(tài)遷移圖的畫法有許多種,不過一般都大同小異。我們結(jié)合一個例子來說明一下它的畫法,如圖1所示。

圖1 狀態(tài)遷移圖

      ①狀態(tài)框:用方框表示狀態(tài),包括所謂的“現(xiàn)態(tài)”和“次態(tài)”。

      ②條件及遷移箭頭:用箭頭表示狀態(tài)遷移的方向,并在該箭頭上標(biāo)注觸發(fā)條件。

      ③節(jié)點(diǎn)圓圈:當(dāng)多個箭頭指向一個狀態(tài)時,可以用節(jié)點(diǎn)符號(小圓圈)連接匯總。

      ④動作框:用橢圓框表示。

      ⑤附加條件判斷框:用六角菱形框表示。

      狀態(tài)遷移圖和我們常見的流程圖相比有著本質(zhì)的區(qū)別,具體體現(xiàn)為:在流程圖中,箭頭代表了程序PC指針的跳轉(zhuǎn);而在狀態(tài)遷移圖中,箭頭代表的是狀態(tài)的改變。

      我們會發(fā)現(xiàn),這種狀態(tài)遷移圖比普通程序流程圖更簡練、直觀、易懂。這正是我們需要達(dá)到的目的。

      狀態(tài)遷移表

      除了狀態(tài)遷移圖,我們還可以用表格的形式來表示狀態(tài)之間的關(guān)系。這種表一般稱為狀態(tài)遷移表。

      表1就是前面介紹的那張狀態(tài)遷移圖的另一種描述形式。

表1 狀態(tài)遷移表

      ①采用表格方式來描述狀態(tài)機(jī),優(yōu)點(diǎn)是可容納更多的文字信息。例如,我們不但可以在狀態(tài)遷移表中描述狀態(tài)的遷移關(guān)系,還可以把每個狀態(tài)的特征描述也包含在內(nèi)。

      ②如果表格內(nèi)容較多,過于臃腫不利于閱讀,我們也可以將狀態(tài)遷移表進(jìn)行拆分。經(jīng)過拆分后的表格根據(jù)其具體內(nèi)容,表格名稱也有所變化。

      ③比如,我們可以把狀態(tài)特征和遷移關(guān)系分開列表。被單獨(dú)拆分出來的描述狀態(tài)特征的表格,也可以稱為“狀態(tài)真值表”。這其中比較常見的就是把每個狀態(tài)的顯示內(nèi)容單獨(dú)列表。這種描述每個狀態(tài)顯示內(nèi)容的表稱之為“顯示真值表”。同樣,我們把單獨(dú)表述基于按鍵的狀態(tài)遷移表稱為“按鍵功能真值表”。另外,如果每一個狀態(tài)包含的信息量過多,我們也可以把每個狀態(tài)單獨(dú)列表。

      ④由此可見,狀態(tài)遷移表作為狀態(tài)遷移圖的有益補(bǔ)充,它的表現(xiàn)形式是靈活的。

      ⑤狀態(tài)遷移表優(yōu)點(diǎn)是信息涵蓋面大,缺點(diǎn)是視覺上不夠直觀,因此它并不能取代狀態(tài)遷移圖。比較理想的是將圖形和表格結(jié)合應(yīng)用。用圖形展現(xiàn)宏觀,用表格說明細(xì)節(jié)。二者互為參照,相得益彰。

用狀態(tài)機(jī)思路實(shí)現(xiàn)一個時鐘程序

      接下來,我將就狀態(tài)機(jī)的應(yīng)用,結(jié)合流程圖、狀態(tài)遷移圖和狀態(tài)遷移,舉一個實(shí)際例子。下面這張圖是一個時鐘程序的狀態(tài)遷移圖,如圖2所示。

圖2 時鐘程序狀態(tài)遷移圖

      把這張圖稍做歸納,就可以得到它的另一種表現(xiàn)形式——狀態(tài)遷移表,如表2所示。

表2 時鐘程序狀態(tài)遷移表

狀態(tài)機(jī)應(yīng)用的注意事項

      基于狀態(tài)機(jī)的程序調(diào)度機(jī)制,其應(yīng)用的難點(diǎn)并不在于對狀態(tài)機(jī)概念的理解,而在于對系統(tǒng)工作狀態(tài)的合理劃分。

      初學(xué)者往往會把某個“程序動作”當(dāng)作是一種“狀態(tài)”來處理。我稱之為“偽態(tài)”。那么如何區(qū)分“動作”和“狀態(tài)”。本匠人的心得是看二者的本質(zhì):“動作”是不穩(wěn)定的,即使沒有條件的觸發(fā),“動作”一旦執(zhí)行完畢就結(jié)束了;而“狀態(tài)”是相對穩(wěn)定的,如果沒有外部條件的觸發(fā),一個狀態(tài)會一直持續(xù)下去。

      初學(xué)者的另一種比較致命的錯誤,就是在狀態(tài)劃分時漏掉一些狀態(tài)。我稱之為“漏態(tài)”。

      “偽態(tài)”和“漏態(tài)”這兩種錯誤的存在,將會導(dǎo)致程序結(jié)構(gòu)的渙散。因此要特別小心避免。

更復(fù)雜的狀態(tài)機(jī)

      前面介紹的是一種簡單的狀態(tài)結(jié)構(gòu)。它只有一級,并且只有一維,如圖3所示。

圖3  線性狀態(tài)機(jī)結(jié)構(gòu)

      如果有必要,我們可以建立更復(fù)雜的狀態(tài)機(jī)模型。

      1 多級狀態(tài)結(jié)構(gòu)

      狀態(tài)機(jī)可以是多級的。在分層的多級狀態(tài)機(jī)系統(tǒng)里面,一個“父狀態(tài)”下可以劃分多個“子狀態(tài)”,這些子狀態(tài)共同擁有上級父狀態(tài)的某些共性,同時又各自擁有自己的一些個性。

      在某些狀態(tài)下,還可以進(jìn)一步劃分子狀態(tài)。比如,我們可以把前面的時鐘例子修改如下:
把所有和時鐘功能有關(guān)的狀態(tài),合并成1個一級狀態(tài)。在這個狀態(tài)下,又可以劃分出3個二級子狀態(tài),分別為顯示時間、設(shè)置小時、設(shè)置分鐘;

      同樣,我們也可以把所有和鬧鐘功能有關(guān)的狀態(tài),合并成1個一級狀態(tài)。在這個狀態(tài)下,再劃分出4個二級子狀態(tài),分別為顯示鬧鐘、設(shè)置“時”、設(shè)置“分”、設(shè)置鳴叫時間。

      我們需要用另一個狀態(tài)變量(寄存器)來表示這些子狀態(tài)。

      子狀態(tài)下面當(dāng)然還可以有更低一級的孫狀態(tài)(子子孫孫無窮盡也),從而將整個狀態(tài)體系變成了樹狀多級狀態(tài)結(jié)構(gòu),如圖4所示。

圖4 樹狀多級狀態(tài)結(jié)構(gòu)

      2 多維狀態(tài)結(jié)構(gòu)

      狀態(tài)結(jié)構(gòu)也可以是多維的。從不同的角度對系統(tǒng)進(jìn)行狀態(tài)的劃分,這些狀態(tài)的某些特性是交叉的。比如,在按照按鍵和顯示劃分狀態(tài)的同時,又按照系統(tǒng)的工作進(jìn)程做出另一種狀態(tài)劃分。這兩種狀態(tài)劃分同時存在,相互交叉,從而構(gòu)成了二維的狀態(tài)結(jié)構(gòu)空間。

      舉一個這方面的例子,如:空調(diào)遙控器,如圖5所示。

圖5 多維狀態(tài)機(jī)結(jié)構(gòu)

      同樣,我們也可以構(gòu)建三維、四維甚至更多維的狀態(tài)結(jié)構(gòu)。每一維的狀態(tài)都需要用一個狀態(tài)變量(寄存器)來表示。

      無論多級狀態(tài)結(jié)構(gòu)和多維狀態(tài)結(jié)構(gòu)看上去多么迷人,匠人的忠告是:我們依然要盡可能地簡化狀態(tài)結(jié)構(gòu),能用單級、單維的結(jié)構(gòu),就不要給自己找事,去玩那噩夢般的復(fù)雜結(jié)構(gòu)。

      簡單的才是最有效的。

結(jié)束語

      對狀態(tài)機(jī)的理解需要一個由淺入深的過程。這個過程應(yīng)該是與實(shí)踐應(yīng)用和具體案例思考相結(jié)合的。當(dāng)一種良好的思路成為設(shè)計的習(xí)慣,它就能給設(shè)計者帶來回報。愿這篇手記里介紹的基于狀態(tài)機(jī)的編程思路能給新手們帶來一些啟迪,幫助大家找到“程序設(shè)計”的感覺。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

美國紐約州阿蒙克2022年10月20日 /美通社/ -- IBM(NYSE: IBM)發(fā)布 2022 年第三季度業(yè)績報告。 IBM 董事長兼首席執(zhí)行官 Arvind Kri...

關(guān)鍵字: IBM 軟件 BSP 云平臺

成都2022年10月19日 /美通社/ -- 近期,平安養(yǎng)老險積極籌備個人養(yǎng)老金的產(chǎn)品設(shè)計和系統(tǒng)開發(fā)工作,發(fā)展多樣化的養(yǎng)老金融產(chǎn)品,推動商業(yè)養(yǎng)老保險、個人養(yǎng)老金、專屬商業(yè)養(yǎng)老保險等產(chǎn)品供給。 搭養(yǎng)老政策東風(fēng) ...

關(guān)鍵字: 溫度 BSP 東風(fēng) 大眾

廣東佛山2022年10月19日 /美通社/ -- 空間是人居生活的基礎(chǔ)單元,承載著生存與活動的最基本功能。而對于理想空間的解構(gòu)意義卻在物理性容器之外,體現(xiàn)出人們對于空間和生活深層關(guān)系的思考,同時也塑造著人與空間的新型連接...

關(guān)鍵字: 溫度 BSP 智能化 進(jìn)程

上海2022年10月19日 /美通社/ -- 10月17日晚間,安集科技披露業(yè)績預(yù)告。今年前三季度,公司預(yù)計實(shí)現(xiàn)營業(yè)收入7.54億元至8.33億元,同比增長60.24%至77.03%;歸母凈利潤預(yù)計為1.73億...

關(guān)鍵字: 電子 安集科技 BSP EPS

北京2022年10月19日 /美通社/ -- 10月18日,北京市經(jīng)濟(jì)和信息化局發(fā)布2022年度第一批北京市市級企業(yè)技術(shù)中心創(chuàng)建名單的通知,諾誠健華正式獲得"北京市企業(yè)技術(shù)中心"認(rèn)定。 北京市企業(yè)技...

關(guān)鍵字: BSP ARMA COM 代碼

北京2022年10月18日 /美通社/ -- 10月14日,國際數(shù)據(jù)公司(IDC)發(fā)布《2022Q2中國軟件定義存儲及超融合市場研究報告》,報告顯示:2022年上半年浪潮超融合銷售額同比增長59.4%,近5倍于...

關(guān)鍵字: IDC BSP 數(shù)字化 數(shù)據(jù)中心

上海2022年10月18日 /美通社/ -- 2022年9月5日,是首都銀行集團(tuán)成立60周年的紀(jì)念日。趁著首都銀行集團(tuán)成立60周年與首都銀行(中國)在華深耕經(jīng)營12年的“大日子”,圍繞作為外資金融機(jī)構(gòu)對在華戰(zhàn)略的構(gòu)想和業(yè)...

關(guān)鍵字: 數(shù)字化 BSP 供應(yīng)鏈 控制

東京2022年10月18日  /美通社/ -- NIPPON EXPRESS HOLDINGS株式會社(NIPPON EXPRESS HOLDINGS, INC.)旗下集團(tuán)公司上海通運(yùn)國際物流有限公司(Nipp...

關(guān)鍵字: 溫控 精密儀器 半導(dǎo)體制造 BSP

廣州2022年10月18日 /美通社/ -- 10月15日,第 132 屆中國進(jìn)出口商品交易會("廣交會")于"云端"開幕。本屆廣交會上高新技術(shù)企業(yè)云集,展出的智能產(chǎn)品超過140,...

關(guān)鍵字: 中國智造 BSP 手機(jī) CAN

要問機(jī)器人公司哪家強(qiáng),波士頓動力絕對是其中的佼佼者。近來年該公司在機(jī)器人研發(fā)方面獲得的一些成果令人印象深刻,比如其開發(fā)的機(jī)器人會后空翻,自主爬樓梯等。這不,波士頓動力又發(fā)布了其機(jī)器人組團(tuán)跳男團(tuán)舞的新視頻,表演的機(jī)器人包括...

關(guān)鍵字: 機(jī)器人 BSP 工業(yè)機(jī)器人 現(xiàn)代汽車

單片機(jī)

21600 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉