新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 狀態機簡介及其思路在單片機程序設計中的應用

        狀態機簡介及其思路在單片機程序設計中的應用

        作者: 時間:2012-08-18 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/171025.htm

        圖2 時鐘程序遷移圖


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

        表2 時鐘程序遷移表

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


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


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


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

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

        圖3 線性狀態機結構


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


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


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


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


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


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

        圖4 樹狀多級狀態結構


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


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

        圖5 多維狀態機結構


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


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


        簡單的才是最有效的。

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


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 格尔木市| 中牟县| 什邡市| 宝清县| 开平市| 宁国市| 旅游| 错那县| 龙胜| 涞源县| 延寿县| 波密县| 祁连县| 多伦县| 浑源县| 扎兰屯市| 香港 | 章丘市| 寻乌县| 周宁县| 玉山县| 将乐县| 晋城| 河津市| 买车| 五指山市| 武陟县| 嘉峪关市| 青阳县| 乌兰县| 长垣县| 怀柔区| 河南省| 远安县| 昌吉市| 临城县| 农安县| 宁都县| 民县| 阳西县| 阳春市|