精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于狀態機的程序設計

CHANBAEK ? 來源:木南創智 ? 作者:尹家軍 ? 2022-12-13 14:33 ? 次閱讀

在編碼實現的過程中,我們會經常使用到條件判斷結構,而且使用起來很方便。但是在需要轉移的狀態比較多,或是條件比較復雜時,我們就可能需要很長的條件判斷結構來處理。不過,過于復雜的條件判斷結構會給代碼的編寫和維護帶來很大的困擾,所以我們希望探索其他的方法來簡化這類條件結構。

1、原理概述

??條件判斷在代碼實現中非常有用,有時候甚至是必不可少的。但過于復雜的條件結構卻會讓程序邏輯變得冗長而繁瑣,而在某些情況下我們希望采取方法避免這一情況出現。

1.1、問題提出

??在項目開發中經常會遇到if/esle語句以及switch/case語句之類,或者是嵌套的多分支條件判斷的結構。這類結構一旦過于復雜或冗長就會使程序的邏輯結構非常繁瑣。所以很多時候我們希望避免使用過于復雜的條件結構。基于這一目的,我們希望探索一些方法來簡化這類問題。

??在我們實踐的過程中,我們發現有些復雜的條件結構實際控制的是同一事物在不同狀態下的轉換。這就讓我們想到了狀態機,那么是否可以借用狀態機的機制來解決這一類的問題呢?在這一篇中我們就來分析和實現這一議題。

1.2、什么是狀態機

??我們先來看看什么是狀態機。一般來說,狀態機(state machine)包含有5個要素,分別是狀態(state)、遷移(transition)、事件(event)、動作(action)、條件(guard)。我們來具體看看這5個要素都是什么。

  • 狀態:一個系統在某一時刻所存在的穩定的工作情況,系統在整個工作周期中可能有多個狀態。一個狀態機需要在狀態集合中選取一個狀態作為初始狀態。
  • 遷移:系統從一個狀態轉移到另一個狀態的過程稱作遷移,遷移不是自動發生的,需要外界對系統施加影響。
  • 事件:某一時刻發生的對系統有意義的事情,狀態機之所以發生狀態遷移,就是因為出現了事件。
  • 動作:在狀態機的遷移過程中,狀態機會做出一些其它的行為,這些行為就是動作,動作是狀態機對事件的響應。
  • 條件:狀態機對事件并不是有求必應的,狀態機還要滿足一定的條件才能發生狀態遷移并實現對事件的響應。

??對于狀態機,我們的理解是,一個事物存在多個狀態,這些狀態可以相互轉換,有些可能是雙向的,有些可能是單向的。當一定的外部事件發生時,會促使事物的狀態發生轉變,這一過程就是發生了狀態的遷移。當事物的狀態發生轉換后會執行一定的動作。但這些動作有可能是在狀態轉換進入時執行,也可能是狀態持續過程中執行,這就要看動作執行的前提條件。

2、分析設計

??接下來我們將以BLDC操作面板的實際操作項目來分析如何實現通過狀態機機制簡化條件結構。在這個BLDC操作面板項目中,我們使用按鍵操作來實現BLDC的操作控制以及LED顯示菜單的切換。

??首先我們來看一看BLDC的操作控制實現。對于BLDC的操作的操作,我們希望按下啟動停止按鈕時,BLDC啟動并按設定的速度持續運行。在BLDC正常運行的過程中,如果長按啟動停止按鈕則進入全速狀態,如果是短按啟動停止按鈕則停止。如果是在全速狀態,如果長按啟動停止按鈕則停止,如果是短按啟動停止按鈕則回到常規速度狀態。

??對于這個需求如果我們使用條件結構則需要使用if/else語句或者switch/case語句來判斷狀態,然后在各個分支中通過條件判斷按鈕的動作以實現對應的操作。在這一方式下,我們需要使用條件結構的嵌套來實現這個過程,從邏輯結構上來說過于復雜而且不同功能模塊的耦合比較緊密。

??接下來,我們以狀態機的機制來分析一下。我們注意到BLDC實際有3種狀態,分別是停止狀態、常速運行狀態、全速運行狀態。而這3種狀態之間可以相互轉化,但并無直接關聯,在不同的狀態下將執行不同的操作。它們之間將根據按鈕的事件產生轉換。對比前面我們對狀態機的要素的表述,實際上已經完全具備了狀態機的全部要素,所以我們將其狀態轉化過程表述如下圖:

??接下來我們看一看菜單的切換問題。菜單的切換更復雜一點,就是在不同的情況下,會有不同的顯示。我們將其歸為5類,也就是5個菜單,這些菜單根據按鍵的不同顯示不同的菜單。我們將每個顯示菜單定義為一種狀態,那么其實就已經具備了狀態機的全部5個要素,具體狀態轉換過程如下圖所示:

??我們將BLDC的控制以及顯示菜單的切換抽象為狀態機,以避免冗長的條件選擇結構,簡化程序邏輯結構,使得程序更為清晰。

3、軟件實現

??前述,我們已經分析了將BLDC的控制及顯示菜單的切換使用狀態機來實現的方法。接下來我們就來考慮其具體的實現方式。

??首先,我們來分析BLDC的控制。我們已經知道BLDC的控制要求有3個狀態:停止狀態、常速狀態、全速狀態。通過按鍵事件來控制狀態產生遷移并執行動作。我們需要一個變量來記錄按鍵事件對BLDC產生的命令,這個命令變量取值0、1、2以對應3個狀態的遷移命令。之所以去這樣的3個值并沒有什么特殊之處,僅僅只是為了我們在后續的處理中方便使用而已。同樣我們需要變量來記錄當前所處的狀態,取值也用0、1、2對應3個狀態。當然我們還需要定義每種狀態下所對應的動作,為了操作方便我們將每種狀態下的動作定義為一個單獨的函數,也就是每種狀態有一個響應函數。至于響應函數的實現則根據需求而定,函數中包括相應條件。具體如下:

void (*BldcControl[3])(void)={BldcStopHandler,
                 BldcNormalSpeedHandler,
                 BldcFullSpeedHandler};

BldcControl[aPara.phyPara.pumpStartStop]();

??其中aPara.phyPara.pumpStartStop變量記錄的是對按鍵事件的記錄,狀態機根據變量的值來調用狀態響應函數來遷移并維持在指定的狀態。三個函數對應三種狀態下的響應函數。這樣就實現了不同的事件遷移到不同的狀態的狀態機結構,相比于條件分支判斷結構要簡化很多。

??接下來,我們再來看看菜單顯示狀態的實現。前面我們已經描述過菜單顯示劃分為5種狀態,我們使用一個變量來記錄狀態及遷移。這個變量取值0、1、2、3、4分別對應當前速度顯示狀態、量程顯示狀態、全速設定顯示狀態、系數設定顯示狀態、速度設定顯示狀態。具體如下:

void (*LedDisPlay[5])(void)={SpeedCurrentDisplay,
              SpeedUpperDisplay,
              SpeedFullDisplay,
              SpeedFactorDisplay,
              SpeedSettingDisplay};

LedDisPlay[aPara.phyPara.menuIndex]();

??同樣的aPara.phyPara.menuIndex是狀態遷移及狀態記錄變量,而5個函數則對應不同狀態下的響應函數。

4、小結

??在這一篇中,我們以一個BLDC驅動控制板的實例描述了使用狀態機代替復雜的條件分支判斷結構的過程及方法。我們實現了使用狀態機機制編碼BLDC的驅動控制和菜單顯示切換的功能。這一實例已經應用于多個項目之中,效果良好。

??這一方式其實適用于很多需要條件判斷來切換控制的場合。事實上,我們在多個電機控制、流程控制等應用場合都是用了類似的方法,而且應用的結果都比較滿意。當然,我們并不是建議讀者使用此法,只是提供一種思路,我們認為所謂結構優化本就是見仁見智的事情。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • BLDC
    +關注

    關注

    205

    文章

    795

    瀏覽量

    96749
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27485
  • 程序設計
    +關注

    關注

    3

    文章

    261

    瀏覽量

    30368
收藏 人收藏

    評論

    相關推薦

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

    狀態機思路在單片程序設計中的應用
    發表于 08-17 16:18

    請教狀態機程序設計的優化問題

    圖示的狀態機中設計了一個獨立的Update狀態用于更新UI界面的文本顯示為什么不直接在每個狀態動作分支直接將更新的文本直接輸出到顯示控件?或者說圖示的編程方式相較于上述思路而言有什么好處?萌新求教
    發表于 07-19 09:40

    如何去實現有限狀態機FSM的程序設計

    什么是有限狀態機FSM呢?如何去實現有限狀態機FSM的程序設計呢?
    發表于 01-21 07:04

    采用狀態機和消息機制的串口接收程序

    采用狀態機和消息機制的串口接收程序
    發表于 05-16 14:51 ?48次下載

    ARM7嵌入式系統在車輛調度中的應用

    本文設計并實現了車輛監控調度系統,在系統設計中采用S3C44B0X做為處理器,并對嵌入式系統中開發中的幾個關鍵技術進行了分析:操作系統內核調度機理,基于狀態機程序設計
    發表于 08-15 08:10 ?16次下載

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

    狀態機思路在單片程序設計中的應用 狀態機的概念狀態機是軟件編程中的一個重要概念。比這個概念更重要的是對它的靈活應用。在一個思路清晰而且高
    發表于 02-09 11:25 ?1w次閱讀
    <b class='flag-5'>狀態機</b>思路在單片<b class='flag-5'>機</b><b class='flag-5'>程序設計</b>中的應用

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

    狀態機思路在單片程序設計中的應用 狀態機的概念       狀態機是軟件編程中的一個
    發表于 03-18 15:00 ?1251次閱讀
    <b class='flag-5'>狀態機</b>思路在單片<b class='flag-5'>機</b><b class='flag-5'>程序設計</b>中的應用

    狀態機原理及用法

    狀態機原理及用法狀態機原理及用法狀態機原理及用法
    發表于 03-15 15:25 ?0次下載

    狀態機VHDL程序

    狀態機VHDL程序,感興趣的小伙伴們可以瞧一瞧。
    發表于 11-11 15:51 ?5次下載

    狀態機原理進行軟件設計

    組成部分。 不過,狀態機理論的發展卻很緩慢。在眾多原因中,狀態機只是做為編程的實現工具而不是設計工具是一個最重要的原因。 本文的重點就在于,怎樣利用狀態機原理進行程序設計。本文會先給出
    發表于 12-02 15:03 ?537次閱讀

    如何對狀態機程序進行靈活修改

    狀態機最主要的特點就是靈活性,這個優勢在程序后期的維護上更會顯示出來,本集中工程師將展現出狀態機是如何輕松對程序進行靈活修改,從而滿足日益復雜的開發要求。
    的頭像 發表于 06-14 03:19 ?3285次閱讀
    如何對<b class='flag-5'>狀態機</b>的<b class='flag-5'>程序</b>進行靈活修改

    狀態機如何簡化PLC程序的編寫

    在PLC程序的編寫過程中,可以使用狀態機的控制思路,將一些復雜的控制過程使用狀態機的方法處理。這里簡單給大家介紹一下什么是狀態機?如下圖所示,為一個
    的頭像 發表于 09-10 14:44 ?3890次閱讀
    <b class='flag-5'>狀態機</b>如何簡化PLC<b class='flag-5'>程序</b>的編寫

    FPGA:狀態機簡述

    本文目錄 前言 狀態機簡介 狀態機分類 Mealy 型狀態機 Moore 型狀態機 狀態機描述 一段式
    的頭像 發表于 11-05 17:58 ?7312次閱讀
    FPGA:<b class='flag-5'>狀態機</b>簡述

    狀態模式(狀態機)

    share,作者:亞索老哥)),原來狀態機還可以這么簡單地玩~~亞索老哥提出的狀態機六步法(1)、定義狀態接口(2)、定義系統當前狀態指針(3)、定義具體
    發表于 12-16 16:53 ?9次下載
    <b class='flag-5'>狀態</b>模式(<b class='flag-5'>狀態機</b>)

    什么是狀態機狀態機的種類與實現

    狀態機,又稱有限狀態機(Finite State Machine,FSM)或米利狀態機(Mealy Machine),是一種描述系統狀態變化的模型。在芯片設計中,
    的頭像 發表于 10-19 10:27 ?9052次閱讀