色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

什么是狀態機?狀態機5要素

FPGA那點事兒 ? 來源:Alicedodo ? 作者:Alicedodo ? 2021-07-27 11:23 ? 次閱讀

單片機還可以,各個外設也都會驅動,但是如果讓你完整的寫一套代碼時,卻無邏輯與框架可言。這說明編程還處于比較低的水平,你需要學會一種好的編程框架或者一種編程思想!比如模塊化編程、狀態機編程、分層思想等。

本文來說一下狀態機編程。

什么是狀態機?

狀態機(state machine)有5個要素:

狀態(state)

遷移(transition)

事件(event)

動作(action)

條件(guard) 狀態:一個系統在某一時刻所存在的穩定的工作情況,系統在整個工作周期中可能有多個狀態。例如一部電動機共有正轉、反轉、停轉這 3 種狀態。

一個狀態機需要在狀態集合中選取一個狀態作為初始狀態。

遷移:系統從一個狀態轉移到另一個狀態的過程稱作遷移,遷移不是自動發生的,需要外界對系統施加影響。停轉的電動機自己不會轉起來,讓它轉起來必須上電。

事件:某一時刻發生的對系統有意義的事情,狀態機之所以發生狀態遷移,就是因為出現了事件。對電動機來講,加正電壓、加負電壓、斷電就是事件。

動作:在狀態機的遷移過程中,狀態機會做出一些其它的行為,這些行為就是動作,動作是狀態機對事件的響應。給停轉的電動機加正電壓,電動機由停轉狀態遷移到正轉狀態,同時會啟動電機,這個啟動過程可以看做是動作,也就是對上電事件的響應。

條件:狀態機對事件并不是有求必應的,有了事件,狀態機還要滿足一定的條件才能發生狀態遷移。還是以停轉狀態的電動機為例,雖然合閘上電了,但是如果供電線路有問題的話,電動機還是不能轉起來。

舉個例子

要解決的問題

電路如下圖:

器件包括單片機MCU、一按鍵K0、LED燈L1和L2。

實現功能描述:

L1L2狀態轉換順序OFF/OFF---》ON/OFF---》ON/ON---》OFF/ON---》OFF/OFF

通過按鍵控制L1L2的狀態,每次狀態轉換需連續按鍵5次

L1L2的初始狀態OFF/OFF

e9a65d1a-e426-11eb-a97a-12bb97331649.png

狀態轉換圖

在狀態機編程中,正確的順序應該是先有狀態轉換圖,后有程序,程序應該是根據設計好的狀態圖寫出來的。

下面這張按鍵控制流水燈狀態轉換圖,是用UML(統一建模語言)的語法元素畫出來的,語法不是很標準,但拿來解釋問題足夠了。

e9db62d0-e426-11eb-a97a-12bb97331649.png

上圖中,圓角矩形代表狀態機的各個狀態,里面標注著狀態的名稱。

帶箭頭的直線或弧線代表狀態遷移,起于初態,止于次態。

圖中的文字內容是對遷移的說明,格式是:事件[條件]/動作列表(后兩項可選)。

“事件[條件]/動作列表”要說明的意思是:如果在某個狀態下發生了“事件”,并且狀態機

滿足“[條件]”,那么就要執行此次狀態轉移,同時要產生一系列“動作”,以響應事件。在這個例子里,我用“KEY”表示擊鍵事件。

圖中有一個黑色實心圓點,表示狀態機在工作之前所處的一種不可知的狀態,在運行之前狀態機必須強制地由這個狀態遷移到初始狀態,這個遷移可以有動作列表(如圖1所示),但不需要事件觸發。

圖中還有一個包含黑色實心圓點的圓圈,表示狀態機生命周期的結束,這個例子中的狀態機生生不息,所以沒有狀態指向該圓圈。

程序代碼

下面是根據上述狀態轉換圖寫成的代碼:

void main(void){ sys_init(); led_off(LED1); led_off(LED2); g_stFSM.u8LedStat = LS_OFFOFF; g_stFSM.u8KeyCnt = 0; while(1) { if(test_key()==TRUE) { fsm_active(); } else { ; /*idle code*/ } }}void fsm_active(void){ if(g_stFSM.u8KeyCnt 》 3) /*擊鍵是否滿 5 次*/ { switch(g_stFSM.u8LedStat) { case LS_OFFOFF: led_on(LED1); /*輸出動作*/ g_stFSM.u8KeyCnt = 0; g_stFSM.u8LedStat = LS_ONOFF; /*狀態遷移*/ break; case LS_ONOFF: led_on(LED2); /*輸出動作*/ g_stFSM.u8KeyCnt = 0; g_stFSM.u8LedStat = LS_ONON; /*狀態遷移*/ break; case LS_ONON: led_off(LED1); /*輸出動作*/ g_stFSM.u8KeyCnt = 0; g_stFSM.u8LedStat = LS_OFFON; /*狀態遷移*/ break; case LS_OFFON: led_off(LED2); /*輸出動作*/ g_stFSM.u8KeyCnt = 0; g_stFSM.u8LedStat = LS_OFFOFF; /*狀態遷移*/ break; default: /*非法狀態*/ led_off(LED1); led_off(LED2); g_stFSM.u8KeyCnt = 0; g_stFSM.u8LedStat = LS_OFFOFF; /*恢復初始狀態*/ break; } } else { g_stFSM.u8KeyCnt++; /*狀態不遷移,僅記錄擊鍵次數*/ }}

先看一下fsm_active()這個函數,g_stFSM.u8KeyCnt = 0;這個語句在switch—case里共出現了 5 次,前 4 次是作為各個狀態遷移的動作出現的。從代碼簡化提高效率的角度來看,我們完全可以把這 5 次合并為 1 次放在 switch—case 語句之前,兩者的效果是完全一樣的,代碼里之所以這樣啰嗦,是為了清晰地表明每次狀態遷移中所有的動作細節,這種方式和上面狀態轉換圖所要表達的意圖是完全一致的。

再看一下g_stFSM這個狀態機結構體變量,它有兩個成員:u8LedStat和 u8KeyCnt。用這個結構體來做狀態機好像有點兒啰嗦,我們能不能只用一個像 u8LedStat 這樣的整型變量來做狀態機呢?

當然可以!我們把上圖中的這 4 個狀態各自拆分成 5 個小狀態,這樣用 20 個狀態同樣能實現這個狀態機,而且只需要一個 unsigned char 型的變量就足夠了,每次擊鍵都會引發狀態遷移, 每遷移 5 次就能改變一次 LED 燈的狀態,從外面看兩種方法的效果完全一樣。

假設我把功能要求改一下,把連續擊鍵5次改變L1L2的狀態改為連續擊鍵100次才能改變L1L2的狀態。這樣的話第二種方法需要4X100=400個狀態!而且函數fsm_active()中的switch—case語句里要有400個case,這樣的程序還有法兒寫么?!

同樣的功能改動,如果用g_stFSM這個結構體來實現狀態機的話,函數fsm_active()只需要將if(g_stFSM.u8KeyCnt》3)改為if(g_stFSM.u8KeyCnt 》 98)就可以了!

g_stFSM結構體的兩個成員中,u8LedStat可以看作是質變因子,相當于主變量;u8KeyCnt可以看作是量變因子,相當于輔助變量。量變因子的逐步積累會引發質變因子的變化。

像g_stFSM這樣的狀態機被稱作Extended State Machine。

編輯:jq

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

    關注

    2

    文章

    492

    瀏覽量

    27529

原文標題:談談單片機編程思想——狀態機

文章出處:【微信號:gh_94c30763133f,微信公眾號:FPGA那點事兒】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Simulink中的狀態機建模方法 Simulink數據可視化與分析功能

    1. Simulink中的狀態機建模方法 1.1 理解狀態機的基本概念 在開始建模之前,了解狀態機的基本概念是必要的。狀態機由以下幾個部分組成:
    的頭像 發表于 12-12 09:27 ?279次閱讀

    觸發器和狀態機的關系是什么

    觸發器和狀態機在數字電路設計中有著緊密的關系,它們共同構成了時序邏輯電路的基礎,用于實現數據的存儲、處理和傳輸。
    的頭像 發表于 08-12 11:24 ?424次閱讀

    如何在FPGA中實現狀態機

    在FPGA(現場可編程門陣列)中實現狀態機是一種常見的做法,用于控制復雜的數字系統行為。狀態機能夠根據當前的輸入和系統狀態,決定下一步的動作和新的狀態。這里,我們將詳細探討如何在FPG
    的頭像 發表于 07-18 15:57 ?568次閱讀

    玩轉Spring狀態機

    說起Spring狀態機,大家很容易聯想到這個狀態機和設計模式中狀態模式的區別是啥呢?沒錯,Spring狀態機就是狀態模式的一種實現,在介紹S
    的頭像 發表于 06-25 14:21 ?933次閱讀
    玩轉Spring<b class='flag-5'>狀態機</b>

    關于SMU狀態機的問題求解

    我有一些關于 SMU 狀態機的問題。 假設由于某種原因,SMU 已進入故障狀態。 手冊指出,要返回運行狀態并將 FSP 恢復到無故障狀態,應調用IfxSmu_releaseFSP()。
    發表于 05-29 08:18

    使用系統滴答定時中斷,基于按鍵的狀態機怎么只能1個1個+,不能連+?

    使用系統滴答定時中斷,基于按鍵的狀態機怎么只能1個1個+,不能連+ #define KEY1_USERGPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13
    發表于 05-16 06:27

    請問STM32F051用了操作系統RTX后還需要寫狀態機不?

    現在學會了rtx操作系統后,原來用狀態機的學的程序,可不可以不切割,直接單線程來執行列?各位前前輩指點一下。多謝!
    發表于 05-08 06:11

    在Verilog中實現Moore型和Mealy型狀態機的方法簡析

    編寫能夠被綜合工具識別的狀態機,首先需要理解狀態機的基本概念和分類。狀態機(FSM)是表示有限個狀態以及在這些狀態之間轉換的邏輯結構。
    的頭像 發表于 05-01 11:38 ?1578次閱讀

    求助LabVIEW,狀態機里面反饋節點如何初始化問題

    求助labview,狀態機里面反饋節點如何初始化,下次執行這個狀態的時候初始化一次!謝謝謝謝!
    發表于 03-25 18:17

    如何采用“狀態機”解析UART數據幀

    如果一個系統接收上述“不定長度”的協議幀,將會有一個挑戰--如何高效接收與解析。 為簡化系統設計,我們強烈建議您采用“狀態機”來解析UART數據幀。
    的頭像 發表于 03-25 14:29 ?681次閱讀
    如何采用“<b class='flag-5'>狀態機</b>”解析UART數據幀

    請問GPIF狀態機的內部信號需要延遲才能斷言嗎?

    dma_wm_thn 這樣的過渡觸發器需要一些周期的延遲才能斷言嗎? 在我的實踐中,DMA_WM_THN 觸發器似乎有 1 個時鐘周期延遲: ? 圖像是我的狀態機的一部分,數據總線是 32 位
    發表于 02-23 07:43

    什么是有限狀態機?如何解決傳統有限狀態機狀態爆炸」問題?

    有限狀態機(Finite State Machine,簡稱FSM)是一種用來進行對象行為建模的工具,其作用主要是描述對象在它的生命周期內所經歷的狀態序列以及如何響應來自外界的各種事件。
    的頭像 發表于 02-17 16:09 ?6220次閱讀
    什么是有限<b class='flag-5'>狀態機</b>?如何解決傳統有限<b class='flag-5'>狀態機</b>「<b class='flag-5'>狀態</b>爆炸」問題?

    Verilog狀態機+設計實例

    在verilog中狀態機的一種很常用的邏輯結構,學習和理解狀態機的運行規律能夠幫助我們更好地書寫代碼,同時作為一種思想方法,在別的代碼設計中也會有所幫助。 一、簡介 在使用過程中我們常說
    的頭像 發表于 02-12 19:07 ?4059次閱讀
    Verilog<b class='flag-5'>狀態機</b>+設計實例

    狀態機該怎么監控

    狀態機卡住的場景——通過狀態跳轉條件的DFX信號去判斷卡住的原因
    的頭像 發表于 01-15 10:03 ?416次閱讀
    <b class='flag-5'>狀態機</b>該怎么監控

    Spring狀態機的實現原理和使用方法

    說起 Spring 狀態機,大家很容易聯想到這個狀態機和設計模式中狀態模式的區別是啥呢?沒錯,Spring 狀態機就是狀態模式的一種實現,在
    的頭像 發表于 12-26 09:39 ?1977次閱讀
    Spring<b class='flag-5'>狀態機</b>的實現原理和使用方法
    主站蜘蛛池模板: 国产精品成久久久久三级四虎| 男人日女人的b| 99在线精品国自产拍| 无人区乱码1区2区3区网站| 美丽的姑娘BD在线观看| 国产叼嘿久久精品久久| 99re这里只有精品国产| 亚洲AV美女成人网站P站| 欧美性情video sexo视频| 久久 这里只精品 免费| 免费视频精品38| 国产久久热99视频| 草莓视频app深夜福利| 在线看免费毛片| 亚洲精品高清中文字幕完整版| 日本黄色网站在线观看| 伦理片 qvod| 久久久久国产| 黑人 尺寸 强行害怕 痛哭| 纯肉高H放荡受BL文库| 99精品免费久久久久久久久蜜桃| 亚洲欲色欲色XXXXX在线AV| 午夜亚洲WWW湿好爽| 日本一区精品久久久久影院| 女人高潮被爽到呻吟在线观看| 极品少妇伦理一区二区| 国产女人喷潮视频免费| 国产99久久亚洲综合精品西瓜tv| 99在线观看视频免费| 99re久久热在线视频| 中文字幕精品AV内射夜夜夜| 亚洲熟女乱色一区二区三区| 午夜在线观看免费完整直播网页| 兽交白浆喷水高潮| 色综合99久久久国产AV| 日日摸夜夜添无码AVA片| 日本高清免费在线| 日本一本免费线观看视频 | 欧美高清video mr.sexo| 久久视热频国只有精品| 久久这里只有精品2|