• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機程序設(shè)計中狀態(tài)機思路的應(yīng)用

    單片機程序設(shè)計中狀態(tài)機思路的應(yīng)用

    作者: 時間:2012-07-18 來源:網(wǎng)絡(luò) 收藏

    本文引用地址:http://www.czjhyjcfj.com/article/171145.htm

    圖2 時鐘程序遷移圖


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

    表2 時鐘程序遷移表

    狀態(tài)機的注意事項
    基于狀態(tài)機的程序調(diào)度機制,其的難點并不在于對狀態(tài)機概念的理解,而在于對系統(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)機
    前面介紹的是一種簡單的狀態(tài)結(jié)構(gòu)。它只有一級,并且只有一維,如圖3所示。

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


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


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


    在某些狀態(tài)下,還可以進一步劃分子狀態(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)進行狀態(tài)的劃分,這些狀態(tài)的某些特性是交叉的。比如,在按照按鍵和顯示劃分狀態(tài)的同時,又按照系統(tǒng)的工作進程做出另一種狀態(tài)劃分。這兩種狀態(tài)劃分同時存在,相互交叉,從而構(gòu)成了二維的狀態(tài)結(jié)構(gòu)空間。


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

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


    上一頁 1 2 下一頁

    評論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 冀州市| 洛隆县| 安平县| 昭通市| 石泉县| 景宁| 门源| 双鸭山市| 仙居县| 壶关县| 巴东县| 金平| 沐川县| 赞皇县| 台东市| 安国市| 桂东县| 云霄县| 鲁山县| 广饶县| 昌吉市| 云霄县| 青阳县| 邻水| 察雅县| 聂荣县| 石景山区| 门源| 城固县| 武陟县| 凌海市| 阳山县| 三门峡市| 饶平县| 新源县| 蚌埠市| 漾濞| 台州市| 平潭县| 阳东县| 沁阳市|