0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于狀態(tài)機(jī)實(shí)現(xiàn)公交車智能IC卡收費(fèi)機(jī)的應(yīng)用系統(tǒng)設(shè)計(jì)

電子設(shè)計(jì) ? 來(lái)源:?jiǎn)纹瑱C(jī)與嵌入式系統(tǒng)應(yīng)用 ? 作者:楊瑞霞 ? 2020-09-08 17:47 ? 次閱讀

有限狀態(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 function)的計(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)站[2],以及使用GPRS進(jìn)行實(shí)時(shí)調(diào)度[3]等。按照獨(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)行讀寫(xiě)操作。因此要對(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)行讀寫(xiě)前,還需要進(jìn)行密碼的驗(yàn)證。只有密碼正確了,才可以進(jìn)行讀寫(xiě)操作。如果卡片的防沖突處理、選擇卡片操作扇區(qū)、授權(quán)驗(yàn)證這幾個(gè)步驟出錯(cuò),則需要使用Request命令對(duì)卡片重新喚醒,然后再進(jìn)行其他操作。在完成對(duì)卡片某一區(qū)域的讀寫(xiě)后,可以直接對(duì)其他區(qū)域進(jìn)行操作(需要重新驗(yàn)證密碼),或者使用Request命令對(duì)其他卡片進(jìn)行操作。

對(duì)IC卡的操作可以分為以下幾個(gè)部分:接口芯片的初始化、查詢卡片、防沖突處理、選擇卡片、對(duì)操作扇區(qū)授權(quán)驗(yàn)證、讀卡、寫(xiě)卡。根據(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ī)建模。

基于狀態(tài)機(jī)實(shí)現(xiàn)公交車智能IC卡收費(fèi)機(jī)的應(yīng)用系統(tǒng)設(shè)計(jì)

圖1 非接觸IC卡操作的狀態(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。[5]“豎式”程序設(shè)計(jì)如下:

switch(cur_state){//在當(dāng)前狀態(tài)中判斷事件

case RC500Config://進(jìn)行RC500Config初始化狀態(tài)

執(zhí)行初始化動(dòng)作

if(SUCCESS){

next_state = RC500Request;//成功則進(jìn)行卡片查詢

}

else{

斷電重新初始化

}

break;

case RC500Request://在RC500Request狀態(tài)

對(duì)射頻范圍內(nèi)的卡片進(jìn)行查詢

if(SUCCESS){ //將狀態(tài)轉(zhuǎn)移到RC500Anticoll態(tài)

next_state = RC500Anticoll;

}

else{

繼續(xù)查詢

}

break;

case RC500Anticoll://在RC500Anticoll狀態(tài)

進(jìn)行抗沖突處理

if(SUCCESS){

獲取卡片識(shí)別碼,轉(zhuǎn)到選擇卡片狀態(tài)

next_state = RC500Select;

}

case …

}

“橫式”設(shè)計(jì)是把每個(gè)狀態(tài)及所要執(zhí)行的動(dòng)作單獨(dú)放到一個(gè)子函數(shù)中處理,有RC500Config()、RC500Request()、 RC500Anticoll()等。工作狀態(tài)的確定可以通過(guò)查詢狀態(tài)表獲得,找到相應(yīng)的狀態(tài)后運(yùn)行相應(yīng)的子函數(shù)。在每個(gè)子函數(shù)中,既有該狀態(tài)下應(yīng)該執(zhí)行的動(dòng)作,也有狀態(tài)的轉(zhuǎn)換。然后在主程序中判斷狀態(tài)是否發(fā)生了轉(zhuǎn)換,再轉(zhuǎn)到相應(yīng)的狀態(tài)子程序中執(zhí)行。

橫豎兩種寫(xiě)法,實(shí)現(xiàn)的功能完全相同,但是“豎式”隱含了優(yōu)先級(jí)排序,破壞了事件間原有的關(guān)系。同時(shí),由于處在每個(gè)狀態(tài)的事件數(shù)目不一致,而且事件發(fā)生的時(shí)間是隨機(jī)的,“豎式”設(shè)計(jì)為順序查詢方式,因此大量時(shí)間被浪費(fèi)?!皺M式”設(shè)計(jì),在某個(gè)時(shí)間點(diǎn)狀態(tài)是唯一確定的,延遲時(shí)間可以預(yù)先準(zhǔn)確估算。而且在事件發(fā)生時(shí),系統(tǒng)會(huì)調(diào)用相應(yīng)的事件函數(shù),在函數(shù)里查找唯一確定的狀態(tài),并根據(jù)其狀態(tài)執(zhí)行動(dòng)作和狀態(tài)轉(zhuǎn)移。使用這種方式設(shè)計(jì)的軟件思路清晰簡(jiǎn)潔,效率高,故使用“橫式”方法設(shè)計(jì)程序更好。

類似地,對(duì)于GPRS、GPS等功能模塊也可以運(yùn)用狀態(tài)機(jī)機(jī)制進(jìn)行程序設(shè)計(jì),從而在整個(gè)智能收費(fèi)機(jī)的軟件設(shè)計(jì)中,對(duì)所有任務(wù)的處理都可以運(yùn)用狀態(tài)機(jī)機(jī)制進(jìn)行相應(yīng)的程序設(shè)計(jì)。

3 使用狀態(tài)機(jī)的效能分析

在很多嵌入式系統(tǒng)軟件設(shè)計(jì)中都可以用到類似狀態(tài)機(jī)的設(shè)計(jì)思想,比較常用的地方就是各種液晶界面的設(shè)計(jì)。使用狀態(tài)機(jī)機(jī)制設(shè)計(jì)軟件,可以使設(shè)計(jì)思路清晰、靈活,軟件的可讀性強(qiáng),便于以后的維護(hù)。如果合理地使用狀態(tài)機(jī),還可以較大幅度地提高M(jìn)CU的運(yùn)行效率。下面以非接觸式IC卡的軟件設(shè)計(jì)流程為例討論。

圖2 嵌入式軟件設(shè)計(jì)方法比較

圖2(a)是傳統(tǒng)的嵌入式軟件設(shè)計(jì)流程,使用這種流程設(shè)計(jì)的系統(tǒng)軟件按部就班地先執(zhí)行RC500Config(),再執(zhí)行 RC500Request(),然后是RC500Anticoll(),直到對(duì)IC卡操作完成,再轉(zhuǎn)到其他任務(wù)(如GPS)。這樣IC卡的操作任務(wù)占用了整個(gè)MCU資源。圖2(b)是使用狀態(tài)機(jī)設(shè)計(jì)系統(tǒng)軟件的流程。在使用狀態(tài)機(jī)的同時(shí)設(shè)定一個(gè)軟件時(shí)鐘,用來(lái)為系統(tǒng)的各個(gè)任務(wù)進(jìn)行計(jì)時(shí),并進(jìn)行任務(wù)的調(diào)度。軟件時(shí)鐘使用一個(gè)長(zhǎng)整型變量進(jìn)行計(jì)時(shí),利用MCU定時(shí)器1 ms或10 ms的中斷來(lái)實(shí)現(xiàn),從而使時(shí)鐘不受任務(wù)執(zhí)行過(guò)程的影響。當(dāng)某個(gè)任務(wù)執(zhí)行過(guò)程需要等待延時(shí),執(zhí)行子函數(shù)返回main()函數(shù),讓其他任務(wù)使用MCU資源。這樣實(shí)現(xiàn)的軟件,在處理某個(gè)任務(wù)的空隙可以同時(shí)處理其他任務(wù)的操作,有效地提高了MCU處理事件的能力。具體實(shí)現(xiàn)方法如下:

RC500Request(){

time_mark = mS_mark;//若需要延時(shí),更新計(jì)時(shí)的軟件時(shí)間

……

if(!past_200mS())break;//如果延時(shí)不足200 ms,//返回調(diào)用函數(shù),MCU運(yùn)行其他任務(wù)

……

}

當(dāng)延時(shí)不夠200 ms時(shí),函數(shù)RC500Request()直接返回而沒(méi)有改變IC卡操作的狀態(tài),因此MCU下一次進(jìn)行IC卡操作時(shí),繼續(xù)執(zhí)行函數(shù) RC500Request(),直到IC卡操作狀態(tài)改變。同時(shí),函數(shù)RC500Request()返回后,main()函數(shù)會(huì)檢查GPS、GPRS等工作模塊,執(zhí)行其中的某些動(dòng)作。也就是說(shuō),在執(zhí)行IC卡操作的同時(shí),可以執(zhí)行其他任務(wù)的操作;同理,在執(zhí)行其他任務(wù)的操作時(shí),也可以執(zhí)行IC卡的一些操作。這樣就可以充分利用MCU的資源,提高M(jìn)CU對(duì)多任務(wù)的處理效率。

結(jié)語(yǔ)

使用上述狀態(tài)機(jī)機(jī)制設(shè)計(jì)的智能公交車IC卡收費(fèi)機(jī)的系統(tǒng)軟件,能夠及時(shí)處理IC卡信息、GPS定位信息、GPRS通信等多個(gè)任務(wù)的操作,運(yùn)行穩(wěn)定,完全滿足實(shí)際應(yīng)用的要求。該機(jī)制非常適合功能較多的嵌入式軟件系統(tǒng)設(shè)計(jì)。

責(zé)任編輯:gt

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16802

    瀏覽量

    349359
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18912

    瀏覽量

    300797
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于單片機(jī)公交車報(bào)站控制系統(tǒng)

    哪位大神有基于單片機(jī)公交車報(bào)站控制系統(tǒng)的設(shè)計(jì)資料?。壳髱椭??急!?。?/div>
    發(fā)表于 11-21 23:00

    基于單片機(jī)控制的公交車報(bào)站系統(tǒng)

    一直有個(gè)想法,想設(shè)計(jì)一個(gè)基于單片機(jī)控制的公交車報(bào)站系統(tǒng),就是不知道需要從哪塊入手。哪位有過(guò)類似的想法嗎,求一起探討!
    發(fā)表于 07-23 10:09

    基于單片機(jī)公交車自動(dòng)報(bào)站系統(tǒng)的設(shè)計(jì)

    跪求基于單片機(jī)公交車自動(dòng)報(bào)站的系統(tǒng)原理圖。我設(shè)計(jì)所用的器件是STC89C52單片機(jī),語(yǔ)音模塊是IDS4004,顯示模塊是LCD1602,功放模塊是LM368,求大家知道。
    發(fā)表于 03-12 11:50

    路邊停車收費(fèi)機(jī)是什么?

    人工干預(yù)行為,數(shù)據(jù)精準(zhǔn),費(fèi)用清晰。跟蹤統(tǒng)計(jì)停車場(chǎng)所有車位狀態(tài),實(shí)時(shí)發(fā)布空余車位數(shù)量,為停車場(chǎng)放行引導(dǎo)提供可靠的參考依據(jù)。無(wú)需取或取票,操作簡(jiǎn)單便捷。綜上,我們可以看出,路邊停車收費(fèi)機(jī)的功能有:一、車牌
    發(fā)表于 08-31 17:40

    高速公交車的可靠狀態(tài)測(cè)量

    高速公交車的可靠狀態(tài)測(cè)量
    發(fā)表于 04-01 12:08

    公交車信息管理系統(tǒng)的設(shè)計(jì)原理是什么?

    結(jié)合微處理器設(shè)計(jì)tSO/IEC15693瀆器.TJ公司的Tag—itHF-I作為電子標(biāo)簽。通過(guò)軟件部分和數(shù)據(jù)庫(kù)的設(shè)計(jì)對(duì)公交車信息進(jìn)行管理。該系統(tǒng)成本低.效率高。
    發(fā)表于 10-15 07:52

    關(guān)于基于單片機(jī)公交車報(bào)站系統(tǒng)的設(shè)計(jì)

    前一段時(shí)間,做了一個(gè)關(guān)于基于單片機(jī)公交車報(bào)站系統(tǒng)的設(shè)計(jì)
    發(fā)表于 11-10 07:19

    公交車IC電路圖-原理圖

    公交車IC電路圖-原理圖
    發(fā)表于 01-16 12:53 ?151次下載
    <b class='flag-5'>公交車</b><b class='flag-5'>IC</b><b class='flag-5'>卡</b>電路圖-原理圖

    公交車IC原理圖

    screen.width-333)this.width=screen.width-333" border=0 twffan="done"> 公交車IC原理圖
    發(fā)表于 11-22 22:33 ?3010次閱讀

    考勤/收費(fèi)機(jī)的時(shí)鐘功能

    考勤/收費(fèi)機(jī)的時(shí)鐘功能              也就是考勤/收費(fèi)機(jī)所具有的時(shí)鐘功能。對(duì)現(xiàn)有的考勤/收費(fèi)機(jī)廠商來(lái)說(shuō)時(shí)鐘功能
    發(fā)表于 12-30 15:07 ?814次閱讀

    考勤/收費(fèi)機(jī)的接口類型

    考勤/收費(fèi)機(jī)的接口類型              接口是針對(duì)刷卡式考勤/收費(fèi)機(jī)而言的。主要是針對(duì)考勤/收費(fèi)機(jī)和電腦相聯(lián)的
    發(fā)表于 12-30 15:14 ?1161次閱讀

    使用單片機(jī)實(shí)現(xiàn)公交車報(bào)站系統(tǒng)的程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用單片機(jī)實(shí)現(xiàn)公交車報(bào)站系統(tǒng)的程序免費(fèi)下載。
    發(fā)表于 03-16 16:57 ?56次下載

    公交收費(fèi)機(jī)如何集成(選配)二維碼模塊

    公交收費(fèi)機(jī)的使用場(chǎng)景分析
    的頭像 發(fā)表于 08-01 16:13 ?728次閱讀

    公交收費(fèi)機(jī)如何集成二維碼模塊

    公交收費(fèi)機(jī),通過(guò)實(shí)際的場(chǎng)景測(cè)試檢驗(yàn),選出集成適用的二維模塊。
    發(fā)表于 08-08 15:44 ?3次下載

    基于STM32的公交車非接觸式IC自動(dòng)收費(fèi)系統(tǒng)

    方案介紹? ? ? ? ?本設(shè)計(jì)是基于STM32的公交車非接觸式IC自動(dòng)收費(fèi)系統(tǒng)。根據(jù)乘客上站信息,實(shí)
    發(fā)表于 12-28 15:32 ?3次下載