運(yùn)用狀態(tài)機(jī)提高嵌入式軟件效率
“橫式”設(shè)計(jì)是把每個(gè)狀態(tài)及所要執(zhí)行的動(dòng)作單獨(dú)放到一個(gè)子函數(shù)中處理,有RC500Config()、RC500Request()、RC500Anticoll()等。工作狀態(tài)的確定可以通過(guò)查詢(xún)狀態(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ì)為順序查詢(xún)方式,因此大量時(shí)間被浪費(fèi)。“橫式”設(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ì)程序更好。類(lèi)似地,對(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ì)中都可以用到類(lèi)似狀態(tài)機(jī)的設(shè)計(jì)思想,比較常用的地方就是各種液晶界面的設(shè)計(jì)。使用狀態(tài)機(jī)機(jī)制設(shè)計(jì)軟件,可以使設(shè)計(jì)思路清晰、靈活,軟件的可讀性強(qiáng),便于以后的維護(hù)。如果合理地使用狀態(tài)機(jī),還可以較大幅度地提高MCU的運(yùn)行效率。下面以非接觸式IC卡的軟件設(shè)計(jì)流程為例討論。
圖2(a)是傳統(tǒng)的嵌入式軟件設(shè)計(jì)流程,使用這種流程設(shè)計(jì)的系統(tǒng)軟件按部就班地先執(zhí)行RC500Config(),再執(zhí)行RCS00Request(),然后是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í),利用MC[J定時(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ù)使用MCtJ資源。這樣實(shí)現(xiàn)的軟件,在處理某個(gè)任務(wù)的空隙可以同時(shí)處理其他任務(wù)的操作,有效地提高了MCU處理事件的能力。具體實(shí)現(xiàn)方法如下:
……
}
當(dāng)延時(shí)不夠200ms時(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的資源,提高MCU對(duì)多任務(wù)的處理效率。
結(jié) 語(yǔ)
使用上述狀態(tài)機(jī)機(jī)制設(shè)計(jì)的智能公交車(chē)IC卡收費(fèi)機(jī)的系統(tǒng)軟件,能夠及時(shí)處理IC卡信息、GPS定位信息、GPRS通信等多個(gè)任務(wù)的操作,運(yùn)行穩(wěn)定,完全滿(mǎn)足實(shí)際應(yīng)用的要求。該機(jī)制非常適合功能較多的嵌入式軟件系統(tǒng)設(shè)計(jì)。
評(píng)論