博客專欄

EEPW首頁 > 博客 > 介紹一個超級實用的編程思想——狀態(tài)機

介紹一個超級實用的編程思想——狀態(tài)機

發(fā)布人:xiaomaidashu 時間:2025-08-04 來源:工程師 發(fā)布文章

本篇來再來介紹狀態(tài)機,狀態(tài)機在嵌入式軟件開發(fā)中,是一個比較實用的編程思想,下面來介紹狀態(tài)機的一些知識點,文末推薦閱讀中有之前介紹過的一些狀態(tài)機編程實現(xiàn)的實例。

一、狀態(tài)機要素

可以把狀態(tài)機的要素分為4個要素,即:現(xiàn)態(tài)、條件、動作、次態(tài)?!艾F(xiàn)態(tài)”和“條件”是因,“動作”和“次態(tài)”是果。

(1)現(xiàn)態(tài):是指當前所處狀態(tài);

(2)條件:又稱為“事件”。當條件被滿足時,將會觸發(fā)一個動作,或者執(zhí)行一次狀態(tài)的遷移。

(3)動作:條件滿足后執(zhí)行的動作。動作不是必須的,當條件滿足后,也可以不執(zhí)行任何動作,直接遷移到新狀態(tài)。

(4)次態(tài):條件滿足后要遷移往的新狀態(tài)?!按螒B(tài)”是相對于“現(xiàn)態(tài)”而言的,“次態(tài)”一旦被激活,就轉變成新的“現(xiàn)態(tài)”了。

二、狀態(tài)遷移圖(STD)


(1)狀態(tài)框:用方框表示狀態(tài),包括所謂的“現(xiàn)態(tài)”和“次態(tài)”;

(2)條件及遷移箭頭:用箭頭表示狀態(tài)遷移的方向,并在該箭頭上標注觸發(fā)條件;

(3)節(jié)點圓圈:當多個箭頭指向一個狀態(tài)時,可以用節(jié)點符號(小圓圈)連接匯總;

(4)動作框:用橢圓框表示;

(5)附加條件判斷框:用六角菱形框表示;

三、狀態(tài)遷移表

四、用狀態(tài)機思路實現(xiàn)一個時鐘程序

首先我們畫出他的狀態(tài)遷移圖:


然后我們畫出狀態(tài)遷移表:

五、狀態(tài)機應用注意事項:

注意使用狀態(tài)機的時候不要出現(xiàn)兩種錯誤:1、“偽態(tài)”2、“漏態(tài)” (1)“偽態(tài)”:把某個“程序動作”當成一種“狀態(tài)”來處理。(2)“漏態(tài)”:在狀態(tài)劃分時漏掉一些狀態(tài)。

PS:

區(qū)分狀態(tài)和偽態(tài):(看兩者的本質) “動作”是不穩(wěn)定的,即使沒有條件的觸發(fā),“動作”一旦執(zhí)行完畢就結束了;“狀態(tài)”是相對穩(wěn)定的,如果沒有外部條件的觸發(fā),一個狀態(tài)會一直持續(xù)下去。

六、更復雜的狀態(tài)機

前面介紹的是一種簡單的狀態(tài)結構。它只有一級,并且只有一維,它的結構圖如下所示:

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

1、多級狀態(tài)結構。

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

2、多維狀態(tài)結構。

狀態(tài)機也可以是多維的。從不同的角度對系統(tǒng)進行狀態(tài)的劃分,這些狀態(tài)的某些特性是交叉的。比如,在按照按鍵和顯示劃分狀態(tài)的同時,又按照系統(tǒng)的工作進程做出另一種狀態(tài)劃分。這兩種狀態(tài)劃分同時存在,相互交叉。從而構成了二維的狀態(tài)結構空間。

說明一下,每一維的狀態(tài)都需要用一個狀態(tài)變量(寄存器)來表示。

最后我想說一下:不管是什么樣子的程序寫成狀態(tài)機,只有一個原則,那就是簡單的才是最有效的?。?/p>

轉自:https://www.cnblogs.com/lisongzzx/p/13641206.html

*博客內容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。


關鍵詞: 狀態(tài)機

相關推薦

技術專區(qū)

關閉