www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > wenzi嵌入式軟件
[導(dǎo)讀]也許從12年前我第一次開始分享狀態(tài)機(jī)編寫心得開始,“狀態(tài)機(jī)”就像標(biāo)簽一樣緊緊的貼在了“傻孩子”這個(gè)網(wǎng)絡(luò)昵稱的額頭上——真是摳都扣不下來。

(圖片來在網(wǎng)絡(luò),侵刪)

【說在前面的話】


也許從12年前我第一次開始分享狀態(tài)機(jī)編寫心得開始,“狀態(tài)機(jī)”就像標(biāo)簽一樣緊緊的貼在了“傻孩子”這個(gè)網(wǎng)絡(luò)昵稱的額頭上——真是摳都扣不下來。不得不坦白的是,從一開始我介紹狀態(tài)機(jī)更多只注重狀態(tài)機(jī)這一語(yǔ)言的表現(xiàn)形式,而 故意偷懶避開了狀態(tài)機(jī)開發(fā)思維的系統(tǒng)性介紹——也許剛開始真的是沒什么自信,覺得自己也沒有能真正領(lǐng)會(huì)狀態(tài)機(jī)的所謂精髓,所以不敢瞎說;后來慢慢的掌握了所謂的狀態(tài)機(jī)思維模式以后,就是真正的懶惰了。在過去的5年間,盡管那些毛遂自薦參加過我免費(fèi)遠(yuǎn)程培訓(xùn)的人或多或少都學(xué)習(xí)到了一系列使用狀態(tài)機(jī)進(jìn)行開發(fā)的思維方式,但畢竟人數(shù)太少。由阿莫論壇改為付費(fèi)訂閱模式為契機(jī),我也有機(jī)會(huì)仔細(xì)回看、思考之前所寫過的內(nèi)容。 說實(shí)話,它們中的很多實(shí)在談不上“深入淺出”。 作為公眾號(hào) 復(fù)更的開端,我 得有必要 系統(tǒng)性的整理 我那些所謂的“理論”、 把它們 寫下來—— 讓更多的人得以 獲得一個(gè)討論和交流的起點(diǎn) 。雖然 我后面要寫的內(nèi)容既不是什么教條、也不是什么 標(biāo)準(zhǔn)答案更不會(huì)是“金科玉律”, 但一定是一個(gè)非常好的出發(fā)點(diǎn)——如果能引起大家的思考和討論,真正掌握 狀態(tài)機(jī)開發(fā) ,甚至能 發(fā)展出自己的 理論和風(fēng)格,那就再好不過了。

(圖片來源:https://en.wikipedia.org/wiki/Finite-state_machine)

【正文】

說來你不信,有限自動(dòng)機(jī)(Finite State Machine),又叫狀態(tài)機(jī)是整個(gè)計(jì)算機(jī)學(xué)科倒數(shù)第二層的基石;倒數(shù)第一層就是大家所熟悉的組合邏輯(Combinational logic)——如果說組合邏輯是沒啥靈魂的細(xì)胞的話,有限自動(dòng)機(jī)就是第一種“能夠任意描述思維邏輯”的神獸大烏龜——整個(gè)計(jì)算機(jī)學(xué)科都馱在它的背上。

然而,如同組合邏輯電路如同“阿米巴”一樣的簡(jiǎn)單,掌握狀態(tài)機(jī)的難度跟“幼稚園”差不了多少。不相信的話,我們先從幾個(gè)簡(jiǎn)單的概念說起:
  • 怎么理解狀態(tài)?如何才算一個(gè)狀態(tài)


很多小伙伴都曾抱怨說“字面意思我都懂”,但“實(shí)際中如何理解什么是狀態(tài)”?、 “怎樣才算一個(gè)狀態(tài)呢? ”——我不是第一次遇到這種問題了。 答案其實(shí)很直接:
【第一種情況】 假設(shè)我們嘗試去做一件事情,但這件事情不是每次去做就一定會(huì)成功,而且每次去嘗試都有可能產(chǎn)生至少2種以上的結(jié)果,那么針對(duì)這件事情的嘗試就應(yīng)該單獨(dú)劃分一個(gè)狀態(tài) 。舉個(gè)例子:
extern bool serial_out(uint8_t chByte);

函數(shù)serial_out()可以用來向某個(gè)串行外設(shè)發(fā)送一個(gè)字符,比如UART。如果成功了就返回true,如果設(shè)備正忙導(dǎo)致本次發(fā)送失敗則立即返回false。由于外設(shè)的發(fā)送速度相對(duì)CPU的運(yùn)行頻率來說差了好幾個(gè)數(shù)量級(jí)——在CPU眼中外設(shè)慢得跟蝸牛一樣,所以每次通過serial_out() 發(fā)送字符不一定是成功——很可能外設(shè)還在努力“消化”上一次的字符。這種情況下,如果我們要在狀態(tài)機(jī)中描述發(fā)送字符這樣的行為,就值得為其單獨(dú)分配一個(gè)狀態(tài),因?yàn)樗鼭M足了我們前面說的條件:1)一件事情你要不停的嘗試才有可能成功,而且2)每次做都可能會(huì)產(chǎn)生2個(gè)以上的結(jié)果。習(xí)慣上,我們會(huì)用圖示的方法來描述狀態(tài),以發(fā)送字符'H'為例:

從圖中很容易注意到:

  • 我們用圓圈來表示一個(gè)狀態(tài);

  • 圓圈中心我們會(huì)寫一些注釋性質(zhì)的內(nèi)容用來幫助人們理解這個(gè)狀態(tài)是做什么的;

  • 圖中有三個(gè)箭頭,最左上角單純“指向”狀態(tài)的箭頭表示從別的什么地方“躍遷”到了當(dāng)前狀態(tài)——我們稱為“扇入;下方從當(dāng)前狀態(tài)指向別的什么地方的箭頭表示從當(dāng)前狀態(tài)離開;——我們成為“扇出;右上角從當(dāng)前狀態(tài)“扇出”后又“返回到”當(dāng)前狀態(tài)的情況,我們稱之為“自返”——也就是返回自己的意思。是不是特別簡(jiǎn)單。

實(shí)際使用的時(shí)候,如果單憑一個(gè)狀態(tài)圓圈里面的注釋文字,我們?nèi)匀徊荒芾斫膺@個(gè)狀態(tài)實(shí)際做了什么事情;或者說我們非常好奇這個(gè)狀態(tài)實(shí)際嘗試做了什么動(dòng)作,就可以通過以下的標(biāo)注方法追加更多的信息,比如:

你看,是不是更加清晰了?同樣的情況還可以推廣到“調(diào)用一個(gè)函數(shù)而函數(shù)有多個(gè)不同的返回值”的情況;或者是“我們通過調(diào)用函數(shù)做了一件事情,雖然函數(shù)沒有返回值,但是我們可以通過多種其它手段來獲得這件事情的多個(gè)不同結(jié)果”的情況等等——領(lǐng)會(huì)精神,以此類推。

【第二種情況】假設(shè)我們只是單純的在等待某一個(gè)事情發(fā)生;或者等待某個(gè)一結(jié)果——這個(gè)結(jié)果由2個(gè)以上的返回值組成等等,那么這個(gè)等待行為就需要分配一個(gè)獨(dú)立的狀態(tài)。舉個(gè)例子:

int32_t get_sensor_voltage(void);

函數(shù)get_sensor_volatage()可以返回某個(gè)傳感器的電壓值;我們?cè)O(shè)置了上下兩個(gè)門限,一旦電壓超過了任何一個(gè)門限,我們就切換到其它狀態(tài),對(duì)應(yīng)的狀態(tài)圖示如下:

在這里,HIGH_THRESHOLDLOW_THRESHOLD是兩個(gè)宏表示上下兩個(gè)門限??梢钥吹?,這個(gè)狀態(tài)表示:如果傳感器的電壓值在兩個(gè)門限之間,我們就留在當(dāng)前狀態(tài)(通過自返回);如果任意門限被超過,我們就相應(yīng)的跳轉(zhuǎn)到別的狀態(tài)去。

  • 所有的神奇都在狀態(tài)躍遷上


在前面的圖示中,所有的箭頭我們都稱之為“ 躍遷”,表示 從當(dāng)前狀態(tài)跳轉(zhuǎn)到箭頭所指向的目標(biāo)狀態(tài)(自返的躍遷就是自己跳回自己)。 躍遷不是無條件的,也不允許無條件——換句話說, 每個(gè)躍遷都必須有一個(gè)條件:例如第一個(gè)例子中的 truefalse就是對(duì)應(yīng)躍遷的條件;后面例子中與門限值的比較也是對(duì)應(yīng)的條件。需要特別強(qiáng)調(diào)的是: 1)一個(gè)狀態(tài)所有的躍遷條件必須是彼此“互斥”的、唯一的;2)所有的躍遷必須能覆蓋一個(gè)狀態(tài)機(jī)所有可能的情況——絕不允許出現(xiàn)漏網(wǎng)之魚,否則 一旦沒有被覆蓋的情況出現(xiàn)就有可能導(dǎo)致整個(gè)狀態(tài)機(jī)的行為存在“不確定性”——如果狀態(tài)機(jī)描述的是一個(gè)機(jī)器人的行為的話,這就是導(dǎo)致機(jī)器人邏輯故障的嚴(yán)重 Bug3)躍遷是個(gè)瞬間的行為,你只能認(rèn)為當(dāng)條件滿足時(shí)躍遷的行為就像白駒過隙一樣一下就做完了——這點(diǎn)很重要,我們馬上就要細(xì)說。前面說過,當(dāng)某個(gè)躍遷的條件得到了滿足,我們就要沿著箭頭的方向從當(dāng)前狀態(tài)調(diào)轉(zhuǎn)到箭頭所指向的目標(biāo)狀態(tài)。實(shí)際上,在躍遷的過程中我們還可以執(zhí)行一些動(dòng)作。需要注意的是,正如前面 3)說的那樣, “躍遷是個(gè)瞬間行為”,所以這里的 動(dòng)作也只會(huì)被執(zhí)行一次。習(xí)慣上,如果某個(gè)躍遷存在動(dòng)作,我們就在躍遷的條件下面加一個(gè)橫線,并在橫線的下方按順序列舉所有要執(zhí)行的動(dòng)作。
比如,我們可以通過一個(gè)專門的狀態(tài)來實(shí)現(xiàn)一個(gè)計(jì)數(shù)器延時(shí)的效果:

在這個(gè)例子中,我們注意到:

  • 雖然左上角扇入Delay狀態(tài)的躍遷條件我們并不知道,但在此時(shí)復(fù)位計(jì)數(shù)器s_wCounter是再好不過了。所以我們空出了躍遷條件,并在橫線的下方寫下了計(jì)數(shù)器的初始化代碼;

  • 右上角的躍遷條件是:“如果計(jì)數(shù)器的值小于延時(shí)1s所需的最大值”,那么對(duì)應(yīng)的動(dòng)作就是讓計(jì)數(shù)器自增;

  • 右下角躍遷的條件是:“計(jì)數(shù)器的值超過了規(guī)定的最大值”,因此直接跳到目標(biāo)狀態(tài)而無需做其它動(dòng)作。

  • 狀態(tài)機(jī)的起點(diǎn)和終點(diǎn)


一個(gè)狀態(tài)機(jī)可以沒有終點(diǎn),但一定有一個(gè)起點(diǎn),我們稱之為 start。圖示上,習(xí)慣用一個(gè)實(shí)心小圓點(diǎn)來表示。 start 不僅是狀態(tài)機(jī)的起點(diǎn),由一個(gè)躍遷來連接它和第一個(gè)狀態(tài); start 還是“兼任” 這一躍遷的條件,例如:

容易看出,這里 start 不僅是整個(gè)狀態(tài)機(jī)的起點(diǎn),還兼任了扇入Delay狀態(tài)的躍遷的條件——從圖上來看,很容易理解成:“當(dāng)狀態(tài)機(jī)開始時(shí)復(fù)位計(jì)數(shù)器s_wCounter”——可謂一目了然。


start 類似,狀態(tài)機(jī)的終點(diǎn)也是一個(gè)實(shí)心小圓點(diǎn),以 cpl 來標(biāo)記; cplcomplete的縮寫。值得強(qiáng)調(diào)的是,雖然每個(gè)狀態(tài)機(jī)只有一個(gè) start點(diǎn),但卻可以擁有 0個(gè)或多個(gè) cpl點(diǎn)。 一旦狀態(tài)機(jī)躍遷到了 cpl 點(diǎn),這就意味著當(dāng)前狀態(tài)機(jī)結(jié)束了,下次再執(zhí)行狀態(tài)機(jī)就自動(dòng)從 start 點(diǎn)開始了。
  • 狀態(tài)機(jī)有多簡(jiǎn)單


至此,借助前面介紹的概念和圖式方法,我們已經(jīng)可以輕松的繪制一個(gè)狀態(tài)機(jī)(圖)了。其實(shí)前面的例子中,我們已經(jīng)看到了一個(gè)完整的 Delay狀態(tài)機(jī),盡管它只有一個(gè)狀態(tài)但已麻雀雖小五臟俱全。接下來,我們?cè)僬故疽粋€(gè)更直接的例子——如何使用 serial_out()發(fā)送字符串“ hello”:

還有另外一種更為通用的方法:


  • “不要問,問就是子狀態(tài)機(jī)”

如果狀態(tài)機(jī)不能調(diào)用子狀態(tài)機(jī),那它跟咸魚有什么兩樣?那么如何用圖示表示子狀態(tài)機(jī)呢?廢話少說,直接上圖:

如圖所示:

  • 子狀態(tài)機(jī)是被圓角矩形包裹的

  • 子狀態(tài)機(jī)的右上角有一個(gè)自反的狀態(tài)遷移,條件是“on going”意味子狀態(tài)機(jī)正在執(zhí)行,還未得出一個(gè)結(jié)果;

  • 子狀態(tài)機(jī)的右下角(或者別的什么位置)需要有一個(gè)標(biāo)記有cpl條件的狀態(tài)遷移,表示當(dāng)子狀態(tài)機(jī)內(nèi)部達(dá)到了終點(diǎn)cpl以后,子狀態(tài)機(jī)從這里退出并躍遷到指定的狀態(tài);

  • 子狀態(tài)機(jī)有一個(gè)標(biāo)題欄,里面分別列舉了狀態(tài)機(jī)的名稱以及傳遞給當(dāng)前子狀態(tài)機(jī)的形參列表。(狀態(tài)機(jī)的返回值只能是類似cpl, on-going這樣的狀態(tài),所以不需要特別標(biāo)記)

通過子狀態(tài)機(jī)調(diào)用,我們很容易用已有的狀態(tài)機(jī)實(shí)現(xiàn)搭積木的功能,比如假設(shè)我們將此前Delay的狀態(tài)機(jī)也做成子狀態(tài)機(jī),配合這個(gè)已有的print_hello子狀態(tài)機(jī),就可以輕松實(shí)現(xiàn)一個(gè)“打印hello然后延時(shí)1秒”的狀態(tài)機(jī):

(這里需要注意,當(dāng)子狀態(tài)機(jī)被調(diào)用時(shí),它使用圓角矩形替代了普通狀態(tài)的圓圈。)

考慮到任何一個(gè)狀態(tài)機(jī)其實(shí)都可以在未來被其它狀態(tài)機(jī)調(diào)用,我們實(shí)際操作上會(huì)把每一個(gè)狀態(tài)機(jī)都按照子狀態(tài)機(jī)的格式進(jìn)行繪制,因此上面的狀態(tài)機(jī)正確的畫法應(yīng)該是:

怎么樣,是不是很簡(jiǎn)單?

【后記】


請(qǐng)不要懷疑, 狀態(tài)機(jī)本身是一種編程語(yǔ)言;狀態(tài)圖是描述狀態(tài)機(jī)的最常見方式之一;繪制狀態(tài)圖的圖例規(guī)范有很多種,比如 UML規(guī)范等等。本文以及后續(xù)其它文章使用的是一種筆者自己結(jié)合狀態(tài)機(jī)的常見畫法并針對(duì)嵌入式軟件開發(fā)習(xí)慣簡(jiǎn)化后的圖例規(guī)范, 簡(jiǎn)單、明確、有效,并且可以毫無歧義的嚴(yán)格且無腦的翻譯成包括switch狀態(tài)機(jī)在內(nèi)的多種C語(yǔ)言實(shí)現(xiàn)。在下一篇文章里,我們將以 switch狀態(tài)機(jī)為例,介紹狀態(tài)圖的無腦翻譯方式,盡情期待。

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉