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

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

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

3天內不再提示

淺談狀態機的要素、分類

Q4MP_gh_c472c21 ? 來源:嵌入式ARM ? 作者:嵌入式ARM ? 2020-10-20 17:27 ? 次閱讀

說到單片機編程,不得不說到狀態機,狀態機做為軟件編程的主要架構已經在各種語言中應用,當然包括C語言,在一個思路清晰而且高效的程序中,必然有狀態機的身影浮現。靈活的應用狀態機不僅是程序更高效,而且可讀性和擴展性也很好。狀態無處不在,狀態中有狀態,只要掌握了這種思維,讓它成為您編程中的一種習慣,相信您會受益匪淺。

狀態機可歸納為4個要素,即現態、條件、動作、次態。這樣的歸納,主要是出于對狀態機的內在因果聯系的考慮。“現態”和“條件”是因,“動作”和“次態”是果。詳解如下:

①現態:是指當前所處的狀態。

②條件:又稱為“事件”。當一個條件被滿足,將會觸發一個動作,或者執行一次狀態的遷移。

③動作:條件滿足后執行的動作。動作執行完畢后,可以遷移到新的狀態,也可以仍舊保持原狀態。動作不是必需的,當條件滿足后,也可以不執行任何動作,直接遷移到新狀態。

④次態:條件滿足后要遷往的新狀態。“次態”是相對于“現態”而言的,“次態”一旦被激活,就轉變成新的“現態”了。

如果我們進一步歸納,把“現態”和“次態”統一起來,而把“動作”忽略(降格處理),則只剩下兩個最關鍵的要素,即:狀態、遷移條件。

狀態機的表示要領有許多種,我們可以用文字、圖形或表格的形式來表示一個狀態機。

舉個簡單的例子:就按鍵處理來說,擊鍵動作本身也可以看做一個狀態機。一個細小的擊鍵動作包含了:釋放、抖動、閉合、抖動和重新釋放等狀態。當我們打開思路,把狀態機作為一種思想導入到程序中去時,就會找到處理疑問的一條有效的捷徑。有時候用狀態機的思維去思考程序該干什么,比用控制流程的思維去思考,可能會更有效。這樣一來狀態機便有了更實際的功用。廢話不多說,實踐才是檢驗真理的唯一標準。

也許有人覺得狀態機把問題復雜化了,其實做過軟件設計的人無形之中已經在用狀態機,下面就總結介紹幾種狀態機。

第一種:switch case結構狀態機

switch()。

case1:。

if(not反復執行狀態1)。

進入1狀態前要做的準備。

進入1狀態的過程。

if(not反復執行狀態1)。

離開狀態1的過程。

case2:。

...。

但這種方式不能很有效預定義所有的狀態,也不能把這些狀態之間的切換過程合理的定義出來,“狀態”本身沒有一個合理的定義,幾乎是一種面向過程的方式,只過這種方式足夠簡單,也最容易讓人接受,缺點就沒有“狀態”的定義和指派功能,導致狀態的混亂,出現狀態處理重復代碼,甚至處理不一致的問題,按照OO的觀念,狀態描述本來就應該是一種實體。

第二種狀態機:ifelse語句結構狀態機

這種狀態機相對靈活一點,但對于一些大的項目,系統軟件設計會相對復雜。

以上2種狀態機是是大家接觸最多的,也是經常用到的,這里不多說了。下面重點談談第三種狀態機。

第三種狀態機:消息觸發狀態機

該類型的狀態機實現方式也是很多的,形態多樣,但萬變不離其宗的就是狀態機的4要素及現態、條件、動作、次態。

下面介紹一種消息觸發類型的狀態機。

基于消息驅動的狀態機機制

原理:一旦有消息觸發,系統服務函數立即尋找所在狀態的消息與消息處理函數對,找到后執行消息處理函數

步驟:

1.添加消息與消息映射

BEGIN_MESSAGE_ MAP(Name,Count) :狀態機名,消息數

ADD_NEW_MSG_ITEM (Msg,OnMsg) :消息與消息處理函數

END_MESSAGE_MAP:結束

2.在這里注冊

BEGIN_Register_Task:頭

...

ADD_Register_Task(Name,Count):狀態機名,消息數

...

END_Register_Task:尾

1.劃分電子秤狀態,完成以上步驟后,完成OnMsg消息處理函數

Void OnMsg(void)

{

}

說明:以上用宏完成,具體宏是如下定義:

#defineBEGIN_MESSAGE_MAP(Name,Count) constMSG_NODE_TYP MSG_node_Array_##Name[(Count)]={

#define ADD_NEW_MSG_ITEM(Msg,OnMsg) {Msg,OnMsg},

#define END_MESSAGE_MAP };

#define BEGIN_Register_Task const MSG_MAP TaskMap[TotalTask]={

#define ADD_Register_Task(Name,Count) {(MSG_NODE_TYP*)MSG_node_Array_##Name,Count},

#define END_Register_Task };

從以上代碼可知:

1. 添加消息與消息映射實際上是定義消息與消息處理函數對的數組,以形成一個表

2. 注冊狀態機實際上是把所有消息對數組的入口定義成一個數組,以形成一個表

消息是如何被執行的?

分發消息

void Default_DisposeMessage(unsigned char *pMsg)

{

unsigned chari;

unsigned charcount=TaskMap[g_Status].cItemCount;//定位到狀態表

for(i=0;i

{

if(*pMsg==TaskMap[g_Status].pMsgItems.msg)//看能否匹配消息

{

TaskMap[g_Status].pMsgItems.pMsgFunc();//找到就執行消息處理函數

return;

}

}

}

void DispatchMessage(unsigned char*pMsg)

{

if(*pMsg)

{

Default_DisposeMessage(pMsg);

}

}

核心函數:消息處理中心

void Message_Dispose_Central(void)

{

BYTE Msg;

while(GetMessage(&Msg)) //獲取消息

{

TranslateMessage(&Msg); //解釋消息

DispatchMessage(&Msg); //分發消息

}

}

責任編輯:PSY

原文標題:單片機裸奔之狀態機淺談

文章出處:【微信公眾號:嵌入式ARM】歡迎添加關注!文章轉載請注明出處。

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

    關注

    6050

    文章

    44687

    瀏覽量

    641186
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27779

原文標題:單片機裸奔之狀態機淺談

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    光刻分類與原理

    本文主要介紹光刻分類與原理。 ? 光刻分類 光刻分類方式很多。按半導體制造工序
    的頭像 發表于 01-16 09:29 ?956次閱讀
    光刻<b class='flag-5'>機</b>的<b class='flag-5'>分類</b>與原理

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

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

    《DNK210使用指南 -CanMV版 V1.0》第四十八章 自學習分類實驗

    狀態機進行自學習及分類過程 if state_machine.current_state == STATE.CLASSIFY:scores = []feature
    發表于 11-20 09:22

    基于狀態機和面向對象的思想設計按鍵檢測模塊

    嵌入式入門學習的教程里面,按鍵原理普遍被認為是“很簡單”的知識點之一,按鍵輸入檢測的原理,無非就是通過CPU不斷掃描按鍵引腳的電平狀態,或者采用單片引腳外部中斷方式,然后在死循環或者中斷服務程序里面處理按鍵被按下
    的頭像 發表于 11-14 11:44 ?467次閱讀
    基于<b class='flag-5'>狀態機</b>和面向對象的思想設計按鍵檢測模塊

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

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

    如何在FPGA中實現狀態機

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

    玩轉Spring狀態機

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

    關于SMU狀態機的問題求解

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

    在GPIF設計器中設計狀態機時,無法訪問附件中所示的線程編號如何解決?

    在 GPIF 設計器中設計狀態機時,我無法訪問附件中所示的線程編號、 如何解決這個問題?
    發表于 05-23 07: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 ?1906次閱讀

    嵌入式編程,如何用 C 語言實現狀態機設計?

    狀態機模式是一種行為模式,通過多態實現不同狀態的調轉行為的確是一種很好的方法,只可惜在嵌入式環境下,有時只能寫純C代碼,并且還需要考慮代碼的重入和多任務請求跳轉等情形,因此實現起來著實需要一番考慮
    發表于 04-23 11:00

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

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

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

    如果一個系統接收上述“不定長度”的協議幀,將會有一個挑戰--如何高效接收與解析。 為簡化系統設計,我們強烈建議您采用“狀態機”來解析UART數據幀。
    的頭像 發表于 03-25 14:29 ?867次閱讀
    如何采用“<b class='flag-5'>狀態機</b>”解析UART數據幀
    主站蜘蛛池模板: 一受多攻高h | 日本一二三区在线视频 | 免费人妻AV无码专区五月 | 97人妻中文字幕免费视频 | 国产精品无码久久久久不卡 | 成人免费看片45分钟 | 欧美亚洲国产手机在线有码 | 韩国和日本免费不卡在线 | 三级黄网站 | 男人网站在线 | 亚洲精品嫩草AV在线观看 | 色欲午夜无码久久久久久 | 蜜桃视频一区二区 | 伊人久久国产精品 | 久久夜色精品国产亚州AV卜 | 蜜芽资源高清在线观看 | 男女无遮挡吃奶gift动态图 | 亚洲色欲H网在线观看 | 欧美日韩另类在线专区 | 捏奶动态图吃奶动态图q | 成熟YIN荡美妞A片视频麻豆 | 国产强奷糟蹋漂亮邻居在线观看 | 亚洲国产精品综合久久一线 | 武侠古典久久亚洲精品 | 国产成人精品免费视频下载 | 久久精品18 | 性欧美video另类hd高清 | 私密按摩师在线观看 百度网盘 | 999zyz色资源站在线观看 | 超碰在线视频caoporn | 中文字幕天堂久久精品 | 东北足疗店妓女在线观看 | 亚洲蜜芽在线观看精品一区 | 人妻无码AV中文系统久久免费 | 久久机热视频免费 | 伊人久久99热这里只有精品 | 欧美日韩中文字幕综合图区 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产精品伦一区二区三级视频 | 欧美日韩精品一区二区三区高清视频 | 国产精彩视频在线 |