又黄又粗又爽免费观看,色吧电影网,军人武警gay男同gvus69,精品久久久久久久久中文字幕

position>home>Blogs

狀態機思路在嵌入式開發中的應用詳解

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

ID:技術讓夢想更偉大

狀態機思路在嵌入式開發中的應用詳解

整理:李肖遙

狀態機的詳解概念

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

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

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

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

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

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

程序其實就是狀態機。

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

狀態機的要素

狀態機可歸納為4個要素,即現態、條件、動作、次態。這樣的歸納,主要是出于對狀態機的內在因果關系的考慮。“現態”和“條件”是因,“動作”和“次態”是果。詳解如下:

  1. 現態

是指當前所處的狀態。

  1. 條件

又稱為“事件”。當一個條件被滿足,將會觸發一個動作,或者執行一次狀態的遷移。

  1. 動作

條件滿足后執行的動作。動作執行完畢后,可以遷移到新的狀態,也可以仍舊保持原狀態。動作不是必需的,當條件滿足后,也可以不執行任何動作,直接遷移到新狀態。

  1. 次態

條件滿足后要遷往的新狀態。“次態”是相對于“現態”而言的,“次態”一旦被激活,就轉變成新的“現態”了。

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

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

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

狀態遷移圖(STD)

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

圖1狀態遷移圖
  1. 狀態框

用方框表示狀態,包括所謂的“現態”和“次態”。

  1. 條件及遷移箭頭

用箭頭表示狀態遷移的方向,并在該箭頭上標注觸發條件。

  1. 節點圓圈

當多個箭頭指向一個狀態時,可以用節點符號(小圓圈)連接匯總。

  1. 動作框

用橢圓框表示。

  1. 附加條件判斷框

用六角菱形框表示。

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

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

狀態遷移表

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

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

表1狀態遷移表
  1. 采用表格方式來描述狀態機,優點是可容納更多的文字信息。例如,我們不但可以在狀態遷移表中描述狀態的遷移關系,還可以把每個狀態的特征描述也包含在內。

  2. 如果表格內容較多,過于臃腫不利于閱讀,我們也可以將狀態遷移表進行拆分。經過拆分后的表格根據其具體內容,表格名稱也有所變化。

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

  4. 由此可見,狀態遷移表作為狀態遷移圖的有益補充,它的表現形式是靈活的。

  5. 狀態遷移表優點是信息涵蓋面大,缺點是視覺上不夠直觀,因此它并不能取代狀態遷移圖。比較理想的是將圖形和表格結合應用。用圖形展現宏觀,用表格說明細節。二者互為參照,相得益彰。

狀態機思路實現一個時鐘程序

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

圖2時鐘程序狀態遷移圖

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

表2時鐘程序狀態遷移表

狀態機應用的注意事項

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

初學者往往會把某個“程序動作”當作是一種“狀態”來處理。我稱之為“偽態”。那么如何區分“動作”和“狀態”。本匠人的心得是看二者的本質:

  • “動作”是不穩定的,即使沒有條件的觸發,“動作”一旦執行完畢就結束了;

  • 而“狀態”是相對穩定的,如果沒有外部條件的觸發,一個狀態會一直持續下去。

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

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

更復雜的狀態機

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

圖3 線性狀態機結構

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

  1. 多級狀態結構

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

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

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

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

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

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

圖4樹狀多級狀態結構
  1. 多維狀態結構

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

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

圖5多維狀態機結構

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

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

簡單的才是最有效的。

-END-

| 整理文章為傳播相關技術,版權歸原作者所有|
|?如有侵權,請聯系刪除|

往期好文合集

嵌入式大佬 | 嵌入式C語言知識點萬字總結?
嵌入式牛人 | 這些單片機編程思想超硬核?
嵌入式必會!C語言最常用的貪心算法就這么被攻略了

最 后

若覺得文章不錯,轉發分享,也是我們繼續更新的動力。
5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等在公眾號內回復「更多資源」,即可免費獲取,期待你的關注~?

免責聲明:本文內容由21ic獲得授權后發布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!

Popular articles

主站蜘蛛池模板: 毛片日韩| 国产黄色大片网站| 含羞草实验室入口免费网站直接| 国产69精品久久久久妇女| 两个人看的www视频免费完整版| 2022国产麻豆剧果冻传媒影视| 亚洲欧美日韩综合在线播放| 老子午夜影院| chinese国产xxxx实拍| 久久国产精品99精品国产| 被猛男cao尿了| 伊人久久久大香线蕉综合直播| 无需付费大片在线免费| 北条麻妃74部作品在线观看| 国产成人三级经典中文| 亚洲国产一成人久久精品| 久久精品国产99国产精品| 再深点灬舒服灬太大了网站| 国产精品国产三级国产潘金莲| 精品国产www| 美女扒开尿口给男人爽免费视频| 一道本在线播放| 国产精品igao视频网| 日本高清免费不卡在线播放| 西西人体高清444rt·wang| 色悠久久久久综合欧美99| 99久久精品免费观看国产| 蜜柚免费视频下载| 桃花综合久久久久久久久久网| 美美女高清毛片视频免费观看| 免费无毒片在线观看| 国产精品亚洲片在线花蝴蝶| 再去温泉吧| 亚洲va韩国va欧美va| 啊轻点灬大ji巴太粗太长了h| 天海翼一区二区三区高清视频| 小猪视频app下载版最新忘忧草b站| 欧美妇乱xxxxx视频| 欧美日韩亚| 波多野结衣中文字幕一区二区三区| 欧美午夜不卡|