<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 狀態(tài)機簡(jiǎn)介及其思路在單片機程序設計中的應用

狀態(tài)機簡(jiǎn)介及其思路在單片機程序設計中的應用

作者: 時(shí)間:2012-08-18 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/171025.htm

圖2 時(shí)鐘程序遷移圖


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

表2 時(shí)鐘程序遷移表

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


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


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


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

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

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


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


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


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


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


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


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

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


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


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

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


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


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


簡(jiǎn)單的才是最有效的。

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


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>