運(yùn)用狀態(tài)機(jī)提高嵌入式軟件效率
引 言
有限狀態(tài)機(jī)是根據(jù)當(dāng)前狀態(tài)以及觸發(fā)條件進(jìn)行狀態(tài)轉(zhuǎn)換的一種機(jī)制,包含一組狀態(tài)集(state)、一個(gè)起始狀態(tài)(start state)、一組輸入符號(hào)集(alphabet)、一個(gè)映射輸入符號(hào)和當(dāng)前狀態(tài)到下一狀態(tài)的轉(zhuǎn)換函數(shù)(transition func-tion)的計(jì)算模型。當(dāng)輸入符號(hào)串時(shí),模型隨即進(jìn)入起始狀態(tài)。要讓狀態(tài)機(jī)改變到新的狀態(tài),依賴于系統(tǒng)的轉(zhuǎn)換函數(shù)。有限狀態(tài)機(jī)中有許多變量,例如,與動(dòng)作(actions)轉(zhuǎn)換(Mealy機(jī))或狀態(tài)(摩爾機(jī))關(guān)聯(lián)的動(dòng)作,多重起始狀態(tài),基于沒(méi)有輸入符號(hào)的轉(zhuǎn)換或指定符號(hào)和狀態(tài)(非定有限狀態(tài)機(jī))的多個(gè)轉(zhuǎn)換、指派給接收狀態(tài)(識(shí)別者)的一個(gè)或多個(gè)狀態(tài)。有限狀態(tài)機(jī)多應(yīng)用于硬件時(shí)序電路設(shè)計(jì)。
有限狀態(tài)機(jī)也可以應(yīng)用到嵌入式軟件設(shè)計(jì)中。在進(jìn)行嵌入式軟件設(shè)計(jì)時(shí),通常的做法是按照信息流程進(jìn)行順序編程。例如對(duì)串行數(shù)據(jù)的處理,一般是等待接收數(shù)據(jù),分析數(shù)據(jù),進(jìn)行數(shù)據(jù)處理,然后發(fā)送處理結(jié)果。使用這種軟件設(shè)計(jì)方法,最突出的一點(diǎn)就是在任務(wù)的處理過(guò)程中,任務(wù)基本上獨(dú)占了MCU的資源,即在處理串口數(shù)據(jù)的過(guò)程中,不會(huì)再去處理其他消息(中斷除外)。采用這種方式,MCU會(huì)在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi)只處理一個(gè)任務(wù)。如果合理運(yùn)用狀態(tài)機(jī)機(jī)制開(kāi)發(fā)系統(tǒng)軟件,就可以讓MCU進(jìn)行多任務(wù)的分時(shí)處理。
1 建立有限狀態(tài)機(jī)的模型
其實(shí)在平時(shí)的程序設(shè)計(jì)中,開(kāi)發(fā)人員已經(jīng)不知不覺(jué)地使用了狀態(tài)機(jī),如按鍵狀態(tài)轉(zhuǎn)換、菜單顯示狀態(tài)的轉(zhuǎn)換等。但是,很少有系統(tǒng)會(huì)使用狀態(tài)機(jī)進(jìn)行多任務(wù)處理。在單片機(jī)系統(tǒng)中,通過(guò)對(duì)系統(tǒng)各功能模塊的分析,可以建立有限狀態(tài)機(jī)的模型,繼而在系統(tǒng)的軟件設(shè)計(jì)中利用狀態(tài)機(jī)的特點(diǎn),開(kāi)發(fā)出結(jié)構(gòu)清晰的高效率嵌入式軟件。
1.1 系統(tǒng)功能分析
具有GPS、GPRS功能的公交車智能IC卡收費(fèi)機(jī),其功能包括對(duì)乘客使用的非接觸式IC卡進(jìn)行刷卡消費(fèi),使用GPS進(jìn)行自動(dòng)報(bào)站,以及使用GPRS進(jìn)行實(shí)時(shí)調(diào)度等。按照獨(dú)占式處理模式,智能收費(fèi)機(jī)的軟件系統(tǒng)會(huì)把多個(gè)任務(wù)按照信息流程進(jìn)行排隊(duì),處理完一個(gè)任務(wù)后,再進(jìn)行下一個(gè)任務(wù)的處理。使用狀態(tài)機(jī)進(jìn)行軟件編程,可以把每一個(gè)任務(wù)分解為多個(gè)狀態(tài),在某個(gè)狀態(tài)處理時(shí),同時(shí)檢查其他任務(wù)是否需要進(jìn)行信息處理,并進(jìn)行狀態(tài)的轉(zhuǎn)換。這樣就可以讓MCU在等待的空閑時(shí)間內(nèi)進(jìn)行多個(gè)消息的處理。
1.2 IC卡功能的狀態(tài)機(jī)建模
目前公交車乘客使用的公交卡,一般都是非接觸式IC卡,需要使用一個(gè)接口芯片對(duì)卡片進(jìn)行讀寫操作。因此要對(duì)IC卡進(jìn)行操作,就需要先對(duì)接口芯片進(jìn)行初始化,包括對(duì)相關(guān)I/O引腳的設(shè)置、訪問(wèn)地址的設(shè)定等操作。當(dāng)非接觸式IC卡進(jìn)入無(wú)線操作范圍后,需要使用Request命令喚醒卡片,再對(duì)喚醒的卡片(一張或多張)進(jìn)行防沖突處理,得到卡片的唯一標(biāo)識(shí)碼,然后通過(guò)Select命令選擇要進(jìn)行操作的卡片-。非接觸式IC卡內(nèi)的數(shù)據(jù)是用密碼進(jìn)行保護(hù)的,而且每個(gè)區(qū)的密碼都不一樣。因此在對(duì)某個(gè)區(qū)進(jìn)行讀寫前,還需要進(jìn)行密碼的驗(yàn)證。只有密碼正確了,才可以進(jìn)行讀寫操作。如果卡片的防沖突處理、選擇卡片操作扇區(qū)、授權(quán)驗(yàn)證這幾個(gè)步驟出錯(cuò),則需要使用Request命令對(duì)卡片重新喚醒,然后再進(jìn)行其他操作。在完成對(duì)卡片某一區(qū)域的讀寫后,可以直接對(duì)其他區(qū)域進(jìn)行操作(需要重新驗(yàn)證密碼),或者使用Request命令對(duì)其他卡片進(jìn)行操作。
對(duì)IC卡的操作可以分為以下幾個(gè)部分:接口芯片的初始化、查詢卡片、防沖突處理、選擇卡片、對(duì)操作扇區(qū)授權(quán)驗(yàn)證、讀卡、寫卡。根據(jù)對(duì)IC卡的操作,可以建立IC卡操作的相應(yīng)狀態(tài)作為狀態(tài)機(jī)。建立狀態(tài)機(jī)的模型如圖1所示。類似地,對(duì)于GPRS、GPS等功能模塊,也可以進(jìn)行相應(yīng)的狀態(tài)機(jī)建模。
2 利用狀態(tài)機(jī)進(jìn)行軟件設(shè)計(jì)
利用前面所建立的狀態(tài)機(jī)模型,可以方便地進(jìn)行相應(yīng)的程序設(shè)計(jì)。軟件的主要工作是進(jìn)行正確的狀態(tài)切換和在每個(gè)狀態(tài)下執(zhí)行相應(yīng)的動(dòng)作。對(duì)單個(gè)狀態(tài)機(jī)處理的程序設(shè)計(jì),可以使用“橫式”或“豎式”兩種設(shè)計(jì)方法?!皺M式”設(shè)計(jì)是把每個(gè)狀態(tài)的功能作為一個(gè)子函數(shù)處理,在子函數(shù)外部進(jìn)行狀態(tài)的切換。“豎式”設(shè)計(jì)是在單個(gè)switch語(yǔ)句中對(duì)所有的狀態(tài)進(jìn)行判斷,執(zhí)行相應(yīng)動(dòng)作并進(jìn)行狀態(tài)切換。下面以非接觸式IC卡操作為例,對(duì)兩種軟件設(shè)計(jì)方式進(jìn)行討論。假設(shè)變量如下:當(dāng)前狀態(tài)為CUr_state,下一狀態(tài)為next_state;狀態(tài)分別為RC500Config、RC500Request、RC500Anticoll、RC500Select、RC500Auth、RC500LoadMk、RC500Read、RC500write?!柏Q式”程序設(shè)計(jì)如下:
評(píng)論