版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
有限狀態(tài)機(jī)在單片機(jī)編程中的應(yīng)用有限狀態(tài)機(jī)在單片機(jī)編程中的應(yīng)用有限狀態(tài)機(jī)在單片機(jī)編程中的應(yīng)用有限狀態(tài)機(jī)在單片機(jī)編程中的應(yīng)用編制僅供參考審核批準(zhǔn)生效日期地址:電話:傳真:郵編:學(xué)習(xí)筆記有限狀態(tài)機(jī)在單片機(jī)編程中的應(yīng)用在單片機(jī)編程中,如果在不使用操作系統(tǒng)的情況下同時執(zhí)行多個任務(wù),可能會遇到下面這些情況:一個任務(wù)的執(zhí)行時間過長,導(dǎo)致其他任務(wù)無法及時執(zhí)行在一些任務(wù)中大量使用delay()等函數(shù)進(jìn)行軟件延時,這些延時函數(shù)占用過多時間,影響其他任務(wù)的執(zhí)行一些復(fù)雜任務(wù)的程序邏輯不清晰,不便于以后對程序進(jìn)行維護(hù),或添加新功能本文介紹的有限狀態(tài)機(jī),可以做到將一個耗時較長的復(fù)雜任務(wù)分解為多個簡單任務(wù),同時使代碼邏輯更加清晰,從而解決上述問題。目錄:1.什么是有限狀態(tài)機(jī)2.有限狀態(tài)機(jī)的作用分解耗時過長的任務(wù)避免軟件延時對CPU資源造成浪費(fèi)使程序邏輯更加清晰3.有限狀態(tài)機(jī)的實(shí)現(xiàn)通過switch-case語句實(shí)現(xiàn)通過Arduino庫實(shí)現(xiàn)其他方式4.示例一:按鍵去抖動程序的優(yōu)化傳統(tǒng)的按鍵去抖動程序優(yōu)化后的按鍵去抖動程序5.示例二:通過有限狀態(tài)機(jī)實(shí)現(xiàn)的鬧鐘程序6.后記1.什么是有限狀態(tài)機(jī)根據(jù)維基百科上的定義,有限狀態(tài)機(jī)(finite-statemachine,FSM,簡稱狀態(tài)機(jī))是表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學(xué)模型。1為了理解這句話,假設(shè)自己還有三天就要考試,這時候就要進(jìn)入緊張的備考狀態(tài),將空閑時間用在復(fù)習(xí)上。但是,為了保證足夠的精力,小睡一會兒也是十分有必要的。那么,什么時候復(fù)習(xí),什么時候睡覺呢可以這樣描述:在復(fù)習(xí)的時候:如果感到瞌睡,則睡覺如果沒有感覺到瞌睡,則繼續(xù)復(fù)習(xí)在小睡的時候:如果感覺不再瞌睡,則開始復(fù)習(xí)如果感覺依舊瞌睡,則繼續(xù)睡覺也可通過一幅簡單的示意圖(也叫「狀態(tài)轉(zhuǎn)移圖」)表示出來:這個例子其實(shí)就是一個簡單的有限狀態(tài)機(jī),其中,復(fù)習(xí)和小睡是兩個狀態(tài),感覺瞌睡和感覺清醒這兩個條件可以使?fàn)顟B(tài)發(fā)生轉(zhuǎn)換。2另外,ProgrammingBasics3網(wǎng)站上也提供了狀態(tài)機(jī)相關(guān)的教程,用形象化的圖片解釋了什么是有限狀態(tài)機(jī),可通過此鏈接訪問。在嵌入式程序設(shè)計中,如果一個系統(tǒng)需要處理一系列連續(xù)發(fā)生的任務(wù),或在不同的模式下對輸入進(jìn)行不同的處理,常常使用有限狀態(tài)機(jī)實(shí)現(xiàn)。例如測量、監(jiān)測、控制等控制邏輯型應(yīng)用。42.有限狀態(tài)機(jī)的作用分解耗時過長的任務(wù)大家應(yīng)該都知道,CPU沒有并行執(zhí)行任務(wù)的能力。計算機(jī)「同時」運(yùn)行多個程序,其實(shí)是多個程序依次交替執(zhí)行,給人以程序同時運(yùn)行的錯覺。各個程序在什么時候開始執(zhí)行,執(zhí)行多長時間后切換到下一個程序,由操作系統(tǒng)決定。單片機(jī)執(zhí)行多任務(wù)也是類似的過程,但由于其資源有限,為了節(jié)省對CPU和存儲空間的占用,在很多情況下沒有使用操作系統(tǒng)。這時,單片機(jī)中運(yùn)行的各個任務(wù)必須在一定時間內(nèi)主動執(zhí)行完畢,才能保證下一個任務(wù)能夠及時執(zhí)行。對于一些需要長時間執(zhí)行的任務(wù),例如按鍵去除抖動、讀取和播放MP3文件等,采用有限狀態(tài)機(jī)的方式,將任務(wù)劃分為多個小的步驟(狀態(tài)),每次只執(zhí)行其中的一步。這樣,其他任務(wù)就有機(jī)會「插入」到這個任務(wù)之中,確保了各個任務(wù)都能按時執(zhí)行。避免軟件延時對CPU資源造成浪費(fèi)對于一些簡單的程序,可通過delay(),delay_ms()之類的函數(shù)進(jìn)行軟件延時。這些延時函數(shù),一般是通過將某個變量循環(huán)遞加或遞加,到達(dá)一定值后跳出循環(huán),從而通過消耗CPU時間實(shí)現(xiàn)了延時。這種方式雖然簡單,但在延時函數(shù)執(zhí)行的過程中,其他程序無法運(yùn)行,消耗了大量CPU資源。而通過狀態(tài)機(jī),有助于減少軟件延時的使用,提高CPU利用率。請參考下文中的示例一:按鍵去抖動程序的優(yōu)化,這一例子展示了如何通過軟件延時分解耗時較長的任務(wù),同時減少軟件延時的使用。使程序邏輯更加清晰通過狀態(tài)機(jī),將一個復(fù)雜任務(wù)劃分為多個狀態(tài),可以使程序清晰易懂,便于維護(hù)。以后想要添加、刪除程序中的功能,都會變得非常容易。下文中的示例二:通過狀態(tài)機(jī)實(shí)現(xiàn)的鬧鐘展示了如何通過狀態(tài)機(jī)優(yōu)化程序邏輯。3.有限狀態(tài)機(jī)的實(shí)現(xiàn)通過switch-case語句實(shí)現(xiàn)如果使用C語言,switch-case語句,即可簡單地實(shí)現(xiàn)有限狀態(tài)機(jī)。/*定義各個狀態(tài)所對應(yīng)的數(shù)值*/#defineSTATUS_A0#defineSTATUS_B1#defineSTATUS_C2/*該變量的值即為當(dāng)前狀態(tài)機(jī)所處的狀態(tài)*/uint8_tcurrentStatus=STATUS_A;/*通過狀態(tài)機(jī)實(shí)現(xiàn)的某個任務(wù),*需要放入while(1)等地方循環(huán)執(zhí)行*/voidfsm_app(void){switch(currentStatus)/*根據(jù)現(xiàn)在的狀態(tài)執(zhí)行相應(yīng)的程序*/{caseSTATUS_A:/*狀態(tài)A*/doThingsForStatusA();/*執(zhí)行狀態(tài)A中需要執(zhí)行的任務(wù)*//*若滿足狀態(tài)轉(zhuǎn)換的條件,則轉(zhuǎn)換到另一個狀態(tài)*/if(condition_1){currentStatus=STATUE_B;}break;caseSTATUS_B:/*狀態(tài)B*/doThingsForStatusB();/*執(zhí)行狀態(tài)B中需要執(zhí)行的任務(wù)*//*若滿足狀態(tài)轉(zhuǎn)換的條件,則轉(zhuǎn)換到另一個狀態(tài)*/if(condition_2){currentStatus=STATUE_C;}if(condition_3){currentStatus=STATUE_A;}break;caseSTATUS_C:/*狀態(tài)C*/doThingsForStatusB();/*執(zhí)行狀態(tài)B中需要執(zhí)行的任務(wù)*//*若滿足狀態(tài)轉(zhuǎn)換的條件,則轉(zhuǎn)換到另一個狀態(tài)*/if(condition_4){currentStatus=STATUE_A;}break;default:currentStatus=STATUE_A;}}通過這段程序,即可實(shí)現(xiàn)一個具有三個狀態(tài)的狀態(tài)機(jī)。狀態(tài)轉(zhuǎn)移圖如下圖所示:通過Arduino庫實(shí)現(xiàn)對于Arduino用戶,還可以使用FSMLibrary實(shí)現(xiàn)。這一庫將有限狀態(tài)機(jī)進(jìn)行了封裝,可以以更簡潔的方式實(shí)現(xiàn)狀態(tài)機(jī)。下載地址及使用說明:其他方式對于一些更復(fù)雜的任務(wù),使用switch-case語句,代碼可能會太簡潔。這時候,使用其他方式實(shí)現(xiàn)狀態(tài)機(jī),可能會更好。具體請查閱相關(guān)資料。4.示例一:按鍵去抖動程序的優(yōu)化傳統(tǒng)的按鍵去抖動程序初學(xué)單片機(jī)時,我們接觸的按鍵去抖動程序一般是這樣的5:voidkeyscan(){if(key1==0)示例二:通過有限狀態(tài)機(jī)實(shí)現(xiàn)的鬧鐘程序最近正在制作一個鬧鐘。這個鬧鐘支持播放MP3格式的鬧鐘聲6,支持貪睡模式,同時還有一些功能打算以后再添加上。為了使程序邏輯更加清晰,也為了更方便
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車文化課件 第一章 汽車發(fā)展史 第三節(jié) 汽車外觀的發(fā)展
- 山東省煙臺市蓬萊區(qū)2025-2026學(xué)年魯教版(五四制)七年級上冊數(shù)學(xué)期末模擬試卷(含答案)
- 2025-2026學(xué)年廣東省深圳市坪山區(qū)九年級(上)期末數(shù)學(xué)試卷(含答案)
- 鋼結(jié)構(gòu)數(shù)字化制造技術(shù)要點(diǎn)
- 飛機(jī)維護(hù)技術(shù)基礎(chǔ)
- 特殊食品管理辦法
- 2026甘肅酒泉藝術(shù)職業(yè)高級中學(xué)招聘1人備考考試試題及答案解析
- 2026福建廈門市海員培訓(xùn)中心教學(xué)人員選聘1人參考考試題庫及答案解析
- 2026江蘇南京市氣象部門招聘高層次人才2人筆試參考題庫及答案解析
- 飛機(jī)小知識課件
- (高清版)AQ∕T 2081-2023 金屬非金屬礦山在用帶式輸送機(jī)安全檢測檢驗(yàn)規(guī)范
- 西師版 三年級下冊數(shù)學(xué) 全冊 預(yù)習(xí)單及答案
- 小學(xué)六年級上冊數(shù)學(xué)期末測試卷及參考答案(輕巧奪冠)
- DZ∕T 0130-2006 地質(zhì)礦產(chǎn)實(shí)驗(yàn)室測試質(zhì)量管理規(guī)范(正式版)
- (高清版)JGJT 178-2009 補(bǔ)償收縮混凝土應(yīng)用技術(shù)規(guī)程
- 電梯日管控、周排查、月調(diào)度內(nèi)容表格
- QC-提高衛(wèi)生間防水一次驗(yàn)收合格率
- 江蘇省徐州市2022-2023學(xué)年高一上學(xué)期期末抽測政治試題(原卷版)
- 地基處理施工中的安全風(fēng)險與防范
- 人教版六年級科學(xué)上期末測試題(2份)有答案
- 食品安全全球標(biāo)準(zhǔn)BRCGS第9版內(nèi)部審核全套記錄
評論
0/150
提交評論