博客專欄

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

介紹一個(gè)超級(jí)實(shí)用的編程思想——狀態(tài)機(jī)

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

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

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

可以把狀態(tài)機(jī)的要素分為4個(gè)要素,即:現(xiàn)態(tài)、條件、動(dòng)作、次態(tài)。“現(xiàn)態(tài)”和“條件”是因,“動(dòng)作”和“次態(tài)”是果。

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

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

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

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

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


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

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

(3)節(jié)點(diǎn)圓圈:當(dāng)多個(gè)箭頭指向一個(gè)狀態(tài)時(shí),可以用節(jié)點(diǎn)符號(hào)(小圓圈)連接匯總;

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

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

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

四、用狀態(tài)機(jī)思路實(shí)現(xiàn)一個(gè)時(shí)鐘程序

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


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

五、狀態(tài)機(jī)應(yīng)用注意事項(xiàng):

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

PS:

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

六、更復(fù)雜的狀態(tài)機(jī)

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

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

1、多級(jí)狀態(tài)結(jié)構(gòu)。

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

2、多維狀態(tài)結(jié)構(gòu)。

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

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

最后我想說一下:不管是什么樣子的程序?qū)懗蔂顟B(tài)機(jī),只有一個(gè)原則,那就是簡單的才是最有效的!!

轉(zhuǎn)自:https://www.cnblogs.com/lisongzzx/p/13641206.html

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


關(guān)鍵詞: 狀態(tài)機(jī)

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉