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

狀態(tài)機的概念

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

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

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

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

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

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

程序其實就是狀態(tài)機。

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

狀態(tài)機的要素

狀態(tài)機可歸納為4個要素,即現態(tài)、條件、動作、次態(tài)。這樣的歸納,主要是出于對狀態(tài)機的內在因果關系的考慮。“現態(tài)”和“條件”是因,“動作”和“次態(tài)”是果。詳解如下:
     
①現態(tài):是指當前所處的狀態(tài)。
②條件:又稱為“事件”。當一個條件被滿足,將會觸發(fā)一個動作,或者執(zhí)行一次狀態(tài)的遷移。
③動作:條件滿足后執(zhí)行的動作。動作執(zhí)行完畢后,可以遷移到新的狀態(tài),也可以仍舊保持原狀態(tài)。動作不是必需的,當條件滿足后,也可以不執(zhí)行任何動作,直接遷移到新狀態(tài)。
④次態(tài):條件滿足后要遷往的新狀態(tài)。“次態(tài)”是相對于“現態(tài)”而言的,“次態(tài)”一旦被激活,就轉變成新的“現態(tài)”了。

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

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

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

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

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

圖1 狀態(tài)遷移圖
     
      ①狀態(tài)框:用方框表示狀態(tài),包括所謂的“現態(tài)”和“次態(tài)”。
      ②條件及遷移箭頭:用箭頭表示狀態(tài)遷移的方向,并在該箭頭上標注觸發(fā)條件。
      ③節(jié)點圓圈:當多個箭頭指向一個狀態(tài)時,可以用節(jié)點符號(小圓圈)連接匯總。
      ④動作框:用橢圓框表示。
      ⑤附加條件判斷框:用六角菱形框表示。

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

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

狀態(tài)遷移表

除了狀態(tài)遷移圖,我們還可以用表格的形式來表示狀態(tài)之間的關系。這種表一般稱為狀態(tài)遷移表。
 
表1就是前面介紹的那張狀態(tài)遷移圖的另一種描述形式。

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

      ①采用表格方式來描述狀態(tài)機,優(yōu)點是可容納更多的文字信息。例如,我們不但可以在狀態(tài)遷移表中描述狀態(tài)的遷移關系,還可以把每個狀態(tài)的特征描述也包含在內。
      ②如果表格內容較多,過于臃腫不利于閱讀,我們也可以將狀態(tài)遷移表進行拆分。經過拆分后的表格根據其具體內容,表格名稱也有所變化。
      ③比如,我們可以把狀態(tài)特征和遷移關系分開列表。被單獨拆分出來的描述狀態(tài)特征的表格,也可以稱為“狀態(tài)真值表”。這其中比較常見的就是把每個狀態(tài)的顯示內容單獨列表。這種描述每個狀態(tài)顯示內容的表稱之為“顯示真值表”。同樣,我們把單獨表述基于按鍵的狀態(tài)遷移表稱為“按鍵功能真值表”。另外,如果每一個狀態(tài)包含的信息量過多,我們也可以把每個狀態(tài)單獨列表。
      ④由此可見,狀態(tài)遷移表作為狀態(tài)遷移圖的有益補充,它的表現形式是靈活的。
      ⑤狀態(tài)遷移表優(yōu)點是信息涵蓋面大,缺點是視覺上不夠直觀,因此它并不能取代狀態(tài)遷移圖。比較理想的是將圖形和表格結合應用。用圖形展現宏觀,用表格說明細節(jié)。二者互為參照,相得益彰。

用狀態(tài)機思路實現一個時鐘程序

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


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

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

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

狀態(tài)機應用的注意事項

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

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

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

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

更復雜的狀態(tài)機

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


 
圖3  線性狀態(tài)機結構


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

1 多級狀態(tài)結構

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

在某些狀態(tài)下,還可以進一步劃分子狀態(tài)。比如,我們可以把前面的時鐘例子修改如下:

把所有和時鐘功能有關的狀態(tài),合并成1個一級狀態(tài)。在這個狀態(tài)下,又可以劃分出3個二級子狀態(tài),分別為顯示時間、設置小時、設置分鐘;

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

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

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


 
圖4 樹狀多級狀態(tài)結構

 2 多維狀態(tài)結構

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

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

圖5 多維狀態(tài)機結構

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

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

簡單的才是最有效的。

結束語

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

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

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉