一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于狀態(tài)機(jī)的程序設(shè)計

CHANBAEK ? 來源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-13 14:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在編碼實(shí)現(xiàn)的過程中,我們會經(jīng)常使用到條件判斷結(jié)構(gòu),而且使用起來很方便。但是在需要轉(zhuǎn)移的狀態(tài)比較多,或是條件比較復(fù)雜時,我們就可能需要很長的條件判斷結(jié)構(gòu)來處理。不過,過于復(fù)雜的條件判斷結(jié)構(gòu)會給代碼的編寫和維護(hù)帶來很大的困擾,所以我們希望探索其他的方法來簡化這類條件結(jié)構(gòu)。

1、原理概述

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

1.1、問題提出

??在項(xiàng)目開發(fā)中經(jīng)常會遇到if/esle語句以及switch/case語句之類,或者是嵌套的多分支條件判斷的結(jié)構(gòu)。這類結(jié)構(gòu)一旦過于復(fù)雜或冗長就會使程序的邏輯結(jié)構(gòu)非常繁瑣。所以很多時候我們希望避免使用過于復(fù)雜的條件結(jié)構(gòu)?;谶@一目的,我們希望探索一些方法來簡化這類問題。

??在我們實(shí)踐的過程中,我們發(fā)現(xiàn)有些復(fù)雜的條件結(jié)構(gòu)實(shí)際控制的是同一事物在不同狀態(tài)下的轉(zhuǎn)換。這就讓我們想到了狀態(tài)機(jī),那么是否可以借用狀態(tài)機(jī)的機(jī)制來解決這一類的問題呢?在這一篇中我們就來分析和實(shí)現(xiàn)這一議題。

1.2、什么是狀態(tài)機(jī)

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

  • 狀態(tài):一個系統(tǒng)在某一時刻所存在的穩(wěn)定的工作情況,系統(tǒng)在整個工作周期中可能有多個狀態(tài)。一個狀態(tài)機(jī)需要在狀態(tài)集合中選取一個狀態(tài)作為初始狀態(tài)。
  • 遷移:系統(tǒng)從一個狀態(tài)轉(zhuǎn)移到另一個狀態(tài)的過程稱作遷移,遷移不是自動發(fā)生的,需要外界對系統(tǒng)施加影響。
  • 事件:某一時刻發(fā)生的對系統(tǒng)有意義的事情,狀態(tài)機(jī)之所以發(fā)生狀態(tài)遷移,就是因?yàn)槌霈F(xiàn)了事件。
  • 動作:在狀態(tài)機(jī)的遷移過程中,狀態(tài)機(jī)會做出一些其它的行為,這些行為就是動作,動作是狀態(tài)機(jī)對事件的響應(yīng)。
  • 條件:狀態(tài)機(jī)對事件并不是有求必應(yīng)的,狀態(tài)機(jī)還要滿足一定的條件才能發(fā)生狀態(tài)遷移并實(shí)現(xiàn)對事件的響應(yīng)。

??對于狀態(tài)機(jī),我們的理解是,一個事物存在多個狀態(tài),這些狀態(tài)可以相互轉(zhuǎn)換,有些可能是雙向的,有些可能是單向的。當(dāng)一定的外部事件發(fā)生時,會促使事物的狀態(tài)發(fā)生轉(zhuǎn)變,這一過程就是發(fā)生了狀態(tài)的遷移。當(dāng)事物的狀態(tài)發(fā)生轉(zhuǎn)換后會執(zhí)行一定的動作。但這些動作有可能是在狀態(tài)轉(zhuǎn)換進(jìn)入時執(zhí)行,也可能是狀態(tài)持續(xù)過程中執(zhí)行,這就要看動作執(zhí)行的前提條件。

2、分析設(shè)計

??接下來我們將以BLDC操作面板的實(shí)際操作項(xiàng)目來分析如何實(shí)現(xiàn)通過狀態(tài)機(jī)機(jī)制簡化條件結(jié)構(gòu)。在這個BLDC操作面板項(xiàng)目中,我們使用按鍵操作來實(shí)現(xiàn)BLDC的操作控制以及LED顯示菜單的切換。

??首先我們來看一看BLDC的操作控制實(shí)現(xiàn)。對于BLDC的操作的操作,我們希望按下啟動停止按鈕時,BLDC啟動并按設(shè)定的速度持續(xù)運(yùn)行。在BLDC正常運(yùn)行的過程中,如果長按啟動停止按鈕則進(jìn)入全速狀態(tài),如果是短按啟動停止按鈕則停止。如果是在全速狀態(tài),如果長按啟動停止按鈕則停止,如果是短按啟動停止按鈕則回到常規(guī)速度狀態(tài)。

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

??接下來,我們以狀態(tài)機(jī)的機(jī)制來分析一下。我們注意到BLDC實(shí)際有3種狀態(tài),分別是停止?fàn)顟B(tài)、常速運(yùn)行狀態(tài)、全速運(yùn)行狀態(tài)。而這3種狀態(tài)之間可以相互轉(zhuǎn)化,但并無直接關(guān)聯(lián),在不同的狀態(tài)下將執(zhí)行不同的操作。它們之間將根據(jù)按鈕的事件產(chǎn)生轉(zhuǎn)換。對比前面我們對狀態(tài)機(jī)的要素的表述,實(shí)際上已經(jīng)完全具備了狀態(tài)機(jī)的全部要素,所以我們將其狀態(tài)轉(zhuǎn)化過程表述如下圖:

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

??我們將BLDC的控制以及顯示菜單的切換抽象為狀態(tài)機(jī),以避免冗長的條件選擇結(jié)構(gòu),簡化程序邏輯結(jié)構(gòu),使得程序更為清晰。

3、軟件實(shí)現(xiàn)

??前述,我們已經(jīng)分析了將BLDC的控制及顯示菜單的切換使用狀態(tài)機(jī)來實(shí)現(xiàn)的方法。接下來我們就來考慮其具體的實(shí)現(xiàn)方式。

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

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

BldcControl[aPara.phyPara.pumpStartStop]();

??其中aPara.phyPara.pumpStartStop變量記錄的是對按鍵事件的記錄,狀態(tài)機(jī)根據(jù)變量的值來調(diào)用狀態(tài)響應(yīng)函數(shù)來遷移并維持在指定的狀態(tài)。三個函數(shù)對應(yīng)三種狀態(tài)下的響應(yīng)函數(shù)。這樣就實(shí)現(xiàn)了不同的事件遷移到不同的狀態(tài)的狀態(tài)機(jī)結(jié)構(gòu),相比于條件分支判斷結(jié)構(gòu)要簡化很多。

??接下來,我們再來看看菜單顯示狀態(tài)的實(shí)現(xiàn)。前面我們已經(jīng)描述過菜單顯示劃分為5種狀態(tài),我們使用一個變量來記錄狀態(tài)及遷移。這個變量取值0、1、2、3、4分別對應(yīng)當(dāng)前速度顯示狀態(tài)、量程顯示狀態(tài)、全速設(shè)定顯示狀態(tài)、系數(shù)設(shè)定顯示狀態(tài)、速度設(shè)定顯示狀態(tài)。具體如下:

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

LedDisPlay[aPara.phyPara.menuIndex]();

??同樣的aPara.phyPara.menuIndex是狀態(tài)遷移及狀態(tài)記錄變量,而5個函數(shù)則對應(yīng)不同狀態(tài)下的響應(yīng)函數(shù)。

4、小結(jié)

??在這一篇中,我們以一個BLDC驅(qū)動控制板的實(shí)例描述了使用狀態(tài)機(jī)代替復(fù)雜的條件分支判斷結(jié)構(gòu)的過程及方法。我們實(shí)現(xiàn)了使用狀態(tài)機(jī)機(jī)制編碼BLDC的驅(qū)動控制和菜單顯示切換的功能。這一實(shí)例已經(jīng)應(yīng)用于多個項(xiàng)目之中,效果良好。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • BLDC
    +關(guān)注

    關(guān)注

    213

    文章

    833

    瀏覽量

    98315
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    493

    瀏覽量

    28235
  • 程序設(shè)計
    +關(guān)注

    關(guān)注

    3

    文章

    262

    瀏覽量

    31003
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

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

    狀態(tài)機(jī)思路在單片機(jī)程序設(shè)計中的應(yīng)用
    發(fā)表于 08-17 16:18

    請教狀態(tài)機(jī)程序設(shè)計的優(yōu)化問題

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

    如何去實(shí)現(xiàn)有限狀態(tài)機(jī)FSM的程序設(shè)計

    什么是有限狀態(tài)機(jī)FSM呢?如何去實(shí)現(xiàn)有限狀態(tài)機(jī)FSM的程序設(shè)計呢?
    發(fā)表于 01-21 07:04

    采用狀態(tài)機(jī)和消息機(jī)制的串口接收程序

    采用狀態(tài)機(jī)和消息機(jī)制的串口接收程序
    發(fā)表于 05-16 14:51 ?48次下載

    ARM7嵌入式系統(tǒng)在車輛調(diào)度中的應(yīng)用

    本文設(shè)計并實(shí)現(xiàn)了車輛監(jiān)控調(diào)度系統(tǒng),在系統(tǒng)設(shè)計中采用S3C44B0X做為處理器,并對嵌入式系統(tǒng)中開發(fā)中的幾個關(guān)鍵技術(shù)進(jìn)行了分析:操作系統(tǒng)內(nèi)核調(diào)度機(jī)理,基于狀態(tài)機(jī)程序設(shè)計
    發(fā)表于 08-15 08:10 ?16次下載

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

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

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

    狀態(tài)機(jī)思路在單片機(jī)程序設(shè)計中的應(yīng)用 狀態(tài)機(jī)的概念       狀態(tài)機(jī)是軟件編程中的一個
    發(fā)表于 03-18 15:00 ?1437次閱讀
    <b class='flag-5'>狀態(tài)機(jī)</b>思路在單片<b class='flag-5'>機(jī)</b><b class='flag-5'>程序設(shè)計</b>中的應(yīng)用

    狀態(tài)機(jī)原理及用法

    狀態(tài)機(jī)原理及用法狀態(tài)機(jī)原理及用法狀態(tài)機(jī)原理及用法
    發(fā)表于 03-15 15:25 ?0次下載

    狀態(tài)機(jī)VHDL程序

    狀態(tài)機(jī)VHDL程序,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 11-11 15:51 ?5次下載

    狀態(tài)機(jī)原理進(jìn)行軟件設(shè)計

    組成部分。 不過,狀態(tài)機(jī)理論的發(fā)展卻很緩慢。在眾多原因中,狀態(tài)機(jī)只是做為編程的實(shí)現(xiàn)工具而不是設(shè)計工具是一個最重要的原因。 本文的重點(diǎn)就在于,怎樣利用狀態(tài)機(jī)原理進(jìn)行程序設(shè)計。本文會先給出
    發(fā)表于 12-02 15:03 ?644次閱讀

    如何對狀態(tài)機(jī)程序進(jìn)行靈活修改

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

    狀態(tài)機(jī)如何簡化PLC程序的編寫

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

    FPGA:狀態(tài)機(jī)簡述

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

    狀態(tài)模式(狀態(tài)機(jī))

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

    什么是狀態(tài)機(jī)?狀態(tài)機(jī)的種類與實(shí)現(xiàn)

    狀態(tài)機(jī),又稱有限狀態(tài)機(jī)(Finite State Machine,F(xiàn)SM)或米利狀態(tài)機(jī)(Mealy Machine),是一種描述系統(tǒng)狀態(tài)變化的模型。在芯片設(shè)計中,
    的頭像 發(fā)表于 10-19 10:27 ?1.2w次閱讀