摘 要: 目前,嵌入式支付應(yīng)用開發(fā)受到硬件開發(fā)板不足、燒片時(shí)間長(zhǎng)、調(diào)試不方便等因素影響,面臨著應(yīng)用開發(fā)周期長(zhǎng)的問題。為了解決以上問題,研究了某個(gè)嵌入式支付系統(tǒng),并在Windows環(huán)境下開發(fā)了該嵌入式支付系統(tǒng)對(duì)應(yīng)的嵌入式支付系統(tǒng)模擬器。所開發(fā)的嵌入式支付模擬器基于軟件模擬硬件功能的基本思想,通過Windows現(xiàn)有API對(duì)嵌入式支付系統(tǒng)的基礎(chǔ)系統(tǒng)進(jìn)行模擬;在保持對(duì)外接口不變、模擬函數(shù)功能的原則下,對(duì)驅(qū)動(dòng)程序進(jìn)行模擬;擴(kuò)展資源工具,實(shí)現(xiàn)中間層的移植;通過配置文件,解決了模擬器適用于不同機(jī)型的問題,并且實(shí)現(xiàn)了人機(jī)交互界面的輸入和輸出;通過動(dòng)態(tài)鏈接庫(Dynamic Link Library,DLL)隔離、宏隔離以及區(qū)域隔離,解決Windows相關(guān)API隔離。
關(guān)鍵詞: 嵌入式;模擬器;系統(tǒng)模擬;驅(qū)動(dòng)模擬
0 引言
隨著生活水平的提高和社會(huì)的發(fā)展,人們對(duì)電子產(chǎn)品的需求也越來越大,這大大促進(jìn)了嵌入式系統(tǒng)產(chǎn)業(yè)迅速發(fā)展壯大。無論是銀行取錢的ATM(Automated Tellermachine,自動(dòng)取款機(jī)),還是通信使用的手機(jī),甚至是日常小朋友玩的智能玩具中的一塊小芯片都離不開嵌入式技術(shù),可以說嵌入式產(chǎn)品已經(jīng)遍及人們生活的各個(gè)方面[1]。嵌入式系統(tǒng)產(chǎn)品各種各樣,不僅在各行各業(yè)得到了廣泛的應(yīng)用,并且對(duì)人們的生活和社會(huì)的發(fā)展產(chǎn)生了重大的影響。隨著消費(fèi)者對(duì)嵌入式產(chǎn)品使用需求的擴(kuò)大,需要開發(fā)者開發(fā)出更高性能的軟硬件系統(tǒng),同時(shí)也將導(dǎo)致嵌入式系統(tǒng)的開發(fā)學(xué)習(xí)難度越來越大。嵌入式開發(fā)過程中經(jīng)常會(huì)碰到軟硬件協(xié)同開發(fā)、嵌入式產(chǎn)品硬件資源非常昂貴、涉及軟硬件知識(shí)以及開發(fā)時(shí)間長(zhǎng)[5]等問題[2-4]。
為了解決以上問題,本文研究和開發(fā)了一個(gè)在Windows環(huán)境下的嵌入式支付系統(tǒng)模擬器,模擬嵌入式支付系統(tǒng)的部分功能,實(shí)現(xiàn)在模擬器上進(jìn)行部分應(yīng)用程序的開發(fā)和調(diào)試,并且在應(yīng)用程序盡可能少地修改甚至不修改的情況下,能夠在嵌入式支付真機(jī)上正常地運(yùn)行起來。
1 嵌入式支付系統(tǒng)模擬器的體系結(jié)構(gòu)
1.1 系統(tǒng)體系結(jié)構(gòu)
系統(tǒng)的體系結(jié)構(gòu)如圖1所示,可以看出系統(tǒng)包括3個(gè)部分:真機(jī)輔助工具、人機(jī)交互以及模擬器處理。
(1)真機(jī)輔助工具模塊
真機(jī)輔助工具是指一些輔助工具的集合,這些工具的目的是加快嵌入式支付應(yīng)用程序的開發(fā)。目前系統(tǒng)擁有資源工具,該工具是一個(gè)由MFC開發(fā)的WIN32應(yīng)用程序,它能夠產(chǎn)生嵌入式支付應(yīng)用程序所需的菜單數(shù)據(jù)。
?。?)人機(jī)交互模塊
主控模塊控制模擬環(huán)境。該模塊包含人機(jī)交互界面和人機(jī)交互處理。
人機(jī)交互界面:模擬實(shí)現(xiàn)嵌入式支付真機(jī)的界面,并將模擬器處理模塊處理的結(jié)果展現(xiàn)給用戶觀看。
人機(jī)交互處理:模擬實(shí)現(xiàn)嵌入式支付系統(tǒng)的按鍵輸入與LCD輸出功能。
?。?)模擬器處理模塊
模擬器處理模塊實(shí)現(xiàn)嵌入式支付系統(tǒng)的模擬,是整個(gè)模擬器的核心部分。該模塊又可以分為3層,分別是中間層、系統(tǒng)層以及配置層。
1.2 系統(tǒng)運(yùn)行流程
系統(tǒng)的運(yùn)行流程為:(1)系統(tǒng)啟動(dòng)主控線程,通過配置信息對(duì)象讀取配置文件內(nèi)容;(2)主控線程根據(jù)窗口配置內(nèi)容繪制人機(jī)交互界面,接著根據(jù)模擬器相關(guān)信息對(duì)模擬器環(huán)境進(jìn)行設(shè)置并對(duì)將要運(yùn)行的應(yīng)用DLL加載進(jìn)來;(3)啟動(dòng)模擬器線程,將應(yīng)用跑起來;(4)應(yīng)用運(yùn)行,用戶通過人機(jī)交互界面輸入數(shù)據(jù)并將數(shù)據(jù)傳遞到模擬器線程,模擬器接收用戶的輸入并處理;(5)用戶結(jié)束應(yīng)用,系統(tǒng)結(jié)束模擬器線程;(6)系統(tǒng)結(jié)束主控線程。
2 嵌入式支付系統(tǒng)模擬器的實(shí)現(xiàn)
2.1 配置層的實(shí)現(xiàn)
配置層包括配置信息以及配置信息對(duì)象。配置信息是一個(gè)數(shù)據(jù)文件,它的數(shù)據(jù)框架由模擬器可配置信息組成,具體內(nèi)容由用戶填充。配置信息對(duì)象是一個(gè)類,它提供統(tǒng)一的接口給用戶操作配置信息。
模擬器系統(tǒng)采用配置信息可以實(shí)現(xiàn)兩個(gè)功能:機(jī)型的可選性和應(yīng)用的動(dòng)態(tài)加載。因?yàn)榍度胧街Ц断到y(tǒng)適用于多種機(jī)型,對(duì)于不同的機(jī)型,它們的差異只是人機(jī)交互界面不同、內(nèi)存大小不同、Flash大小不同以及底層驅(qū)動(dòng)的不一致,所以模擬器系統(tǒng)采用配置文件來動(dòng)態(tài)繪制模擬器人機(jī)交互界面、動(dòng)態(tài)申請(qǐng)模擬器內(nèi)存大小、動(dòng)態(tài)設(shè)置模擬器Flash大小以及動(dòng)態(tài)加載模擬器驅(qū)動(dòng)。因此模擬器系統(tǒng)采用配置信息可以實(shí)現(xiàn)機(jī)型的可選性。對(duì)于同一機(jī)型的不同應(yīng)用程序也同樣可以采用配置文件實(shí)現(xiàn)動(dòng)態(tài)加載。
2.2 基礎(chǔ)系統(tǒng)模擬——“內(nèi)存池”模擬內(nèi)存管理
內(nèi)存池技術(shù)提供一種內(nèi)存分配方式,它向系統(tǒng)申請(qǐng)一大塊地址連續(xù)的內(nèi)存,然后根據(jù)自己的需求管理這塊內(nèi)存,如果出現(xiàn)內(nèi)存塊已經(jīng)不夠的情況時(shí),繼續(xù)申請(qǐng)新的內(nèi)存。這種做法的優(yōu)點(diǎn)是能夠降低內(nèi)存碎片來提高性能。
在Windows上模擬嵌入式支付系統(tǒng)的內(nèi)存管理,理念上與內(nèi)存池技術(shù)非常類似:向Windows系統(tǒng)申請(qǐng)真機(jī)內(nèi)存條同等大小的內(nèi)存,使用該塊內(nèi)存模擬嵌入式支付系統(tǒng)的內(nèi)存管理機(jī)制。其與內(nèi)存池技術(shù)有以下兩個(gè)不同的地方:(1)如果出現(xiàn)內(nèi)存塊不足,拋出異常,而不是繼續(xù)申請(qǐng);(2)模擬的目的不是為了減低內(nèi)存碎片,而是盡可能模擬嵌入式支付系統(tǒng)內(nèi)存的分配方式。
2.3 驅(qū)動(dòng)集模擬
2.3.1點(diǎn)陣映射模擬LCD驅(qū)動(dòng)
LCD(Liquid Crystal Display,液晶顯示器)作為輸出設(shè)備,用戶將要顯示的信息傳送到顯示緩沖區(qū)中,然后LCD通過“點(diǎn)燈”的方式將其顯示出來。在PC上也有LCD,是否可以通過PC上的LCD來模擬嵌入式支付真機(jī)的LCD?答案是可以的,只需要在PC上模擬嵌入式支付系統(tǒng)的LCD驅(qū)動(dòng)即可。在PC上模擬LCD驅(qū)動(dòng)就是將需要顯示的點(diǎn)陣數(shù)據(jù)繪制到PC的LCD上,目前WIN32將一個(gè)點(diǎn)陣數(shù)據(jù)顯示到LCD上可以有以下兩種方式:(1)采用DOS下漢字的顯示原理,利用SetPixel函數(shù)將點(diǎn)陣數(shù)據(jù)一個(gè)點(diǎn)一個(gè)點(diǎn)地畫,這種方式的好處是彩屏的繪制,但是繪制速度慢;(2)直接利用緩沖區(qū)的數(shù)據(jù)創(chuàng)建BMP對(duì)象,這種方式可以快速地刷屏,但是只能實(shí)現(xiàn)單色繪制[6]。本系統(tǒng)借鑒這兩種方法,采用雙緩沖機(jī)制,利用SetPixel函數(shù)將點(diǎn)陣數(shù)據(jù)繪制到一個(gè)中間DC(Device Context,設(shè)備描述表)中,在一定的條件下將該塊DC繪制到屏幕上。這樣既可以實(shí)現(xiàn)彩屏的繪制,繪制速度也可以控制。
2.3.2文件模擬Flash驅(qū)動(dòng)
Flash是一種存儲(chǔ)芯片,它是嵌入式支付真機(jī)重要組成部分。它不僅可以保存用戶的應(yīng)用信息,也可以保持系統(tǒng)的配置信息[7]。
Flash其實(shí)是一大塊連續(xù)的地址區(qū)域,該區(qū)域里面的數(shù)據(jù)是可讀寫、可永久保存的。因?yàn)镕lash的空間比較大,如果直接用內(nèi)存去模擬Flash,可能會(huì)導(dǎo)致一些配置比較低的PC內(nèi)存不夠。模擬器系統(tǒng)根據(jù)Flash可永久保存特性,采用文件對(duì)Flash進(jìn)行模擬。把文件看成是一大塊連續(xù)的地址空間,打開文件后可以獲取該地址空間的首地址,加上偏移地址就可以獲得相應(yīng)的地址空間。這樣Flash驅(qū)動(dòng)的模擬就變得簡(jiǎn)單了,通過WIN32對(duì)文件的打開、地址偏移、讀取、寫入、關(guān)閉函數(shù)來實(shí)現(xiàn)Flash驅(qū)動(dòng)的初始化、讀取、寫入和擦除等操作。
2.4支付業(yè)務(wù)支撐模塊的設(shè)計(jì)與實(shí)現(xiàn)
支付業(yè)務(wù)支撐模塊是與支付應(yīng)用直接相關(guān)的模塊,該模塊為支付應(yīng)用提供銀行卡卡號(hào)信息和部分加密算法。支付具體的流程由于不同銀行的支付協(xié)議不一致導(dǎo)致各不相同,因此具體的支付處理由應(yīng)用層程序根據(jù)不同的需求實(shí)現(xiàn)不同應(yīng)用,而嵌入式支付系統(tǒng)只提供用戶刷卡的銀行卡信息以及提供常見的幾個(gè)加密算法。
嵌入式支付系統(tǒng)由于嵌入式資源的限制,并不能包括所有的加密算法。其加解密算法包括des和3des的加解密。該部分內(nèi)容可以直接移植到模擬器中,不需要進(jìn)行修改。
2.5 中間層的移植
在嵌入式支付系統(tǒng)中封裝一個(gè)middleware(中間層),該層的內(nèi)容是對(duì)底層信息的封裝,供給應(yīng)用程序直接使用。目前模擬器系統(tǒng)middleware有GDI子系統(tǒng)、GUI子系統(tǒng)和DB子系統(tǒng)。GDI(Graphics Device Interface,圖形設(shè)備接口)對(duì)底層LCD驅(qū)動(dòng)進(jìn)行封裝,提供接口給GUI模塊和應(yīng)用程序調(diào)用。嵌入式支付系統(tǒng)中GDI模塊包括動(dòng)態(tài)繪制區(qū)、繪圖、貼圖、文字、光標(biāo)、滾動(dòng)條和開機(jī)啟動(dòng)提示。在LCD驅(qū)動(dòng)已經(jīng)完成模擬的前提下,GDI調(diào)用LCD驅(qū)動(dòng)接口完成繪制操作。在模擬器系統(tǒng)中,大部分GDI操作可以直接從嵌入式支付系統(tǒng)中移植,而以下兩部分內(nèi)容則需要模擬:(1)對(duì)char進(jìn)行位操作實(shí)現(xiàn)相應(yīng)bit位的讀寫、取反實(shí)現(xiàn)GDI中bit操作;(2)模擬器系統(tǒng)中采用直接讀取文字的bin文件來模擬文字的點(diǎn)陣信息的查詢操作。
2.6 WIN32函數(shù)隔離的設(shè)計(jì)與實(shí)現(xiàn)
嵌入式支付系統(tǒng)參考WIN32中的UI設(shè)計(jì),設(shè)計(jì)了適合其終端應(yīng)用的GUI子系統(tǒng)。這樣設(shè)計(jì)既方便不同產(chǎn)品、項(xiàng)目界面風(fēng)格的統(tǒng)一,也方便應(yīng)用對(duì)操作界面的開發(fā)。但它給嵌入式支付系統(tǒng)帶來便利的同時(shí)也給模擬器系統(tǒng)帶來一個(gè)問題:嵌入式支付系統(tǒng)GUI函數(shù)與WIN32中GUI函數(shù)存在大量重名,而且兩者的函數(shù)是不可替代的。例如在WIN32的GUI模塊中擁有CreateWindow函數(shù),在嵌入式支付系統(tǒng)中的GUI模塊中也有CreateWindow函數(shù),并且兩者的參數(shù)與實(shí)現(xiàn)功能不一致。又因?yàn)檎麄€(gè)嵌入式支付系統(tǒng)采用C語言與匯編語言共同開發(fā),所以模擬器系統(tǒng)需要解決一個(gè)大問題:C環(huán)境下如何使得重名函數(shù)共存,并且使其調(diào)用不發(fā)生混亂,即在主控系統(tǒng)中調(diào)用的是WIN32中的GUI函數(shù),而在模擬器應(yīng)用程序中調(diào)用模擬器GUI函數(shù)。如圖2所示,本系統(tǒng)提出利用DLL隔離、宏隔離以及區(qū)域隔離3種方式共同處理該問題。
3 實(shí)驗(yàn)結(jié)果與分析
3.1 實(shí)驗(yàn)環(huán)境
硬件環(huán)境:CPU為Pentium4及以上;內(nèi)存為1 024 MB及以上;可用硬盤空間為1 024 MB及以上。
軟件環(huán)境:操作系統(tǒng)為Microsoft Windows 7;開發(fā)工具為VS2010;開發(fā)語言為C和C++混合編程。
3.2 實(shí)驗(yàn)結(jié)果分析
移植計(jì)算器應(yīng)用(如圖3所示)、菜單應(yīng)用、萬年歷應(yīng)用程序到模擬器上進(jìn)行測(cè)試,移植過程沒有進(jìn)行源代碼的修改,只是將其轉(zhuǎn)換為DLL,運(yùn)行結(jié)果與嵌入式支付真機(jī)上一致。
從測(cè)試結(jié)果可得出以下結(jié)論:
?。?)模擬器的可靠性:實(shí)際運(yùn)行在嵌入式支付真機(jī)上的4個(gè)應(yīng)用程序源碼保持不變,只是將其轉(zhuǎn)換為DLL,通過X86VC編譯器編譯后可以運(yùn)行在模擬器上,并且其結(jié)果與真機(jī)上的結(jié)果保持一致。通過以上4個(gè)應(yīng)用程序的測(cè)試,說明該模擬器是可靠的。
?。?)模擬器應(yīng)用開發(fā)的優(yōu)越性:將應(yīng)用程序移植到模擬器上之后,只需將該DLL配置到應(yīng)用啟動(dòng)項(xiàng)中就可以直接運(yùn)行,期間遇到問題可以直接使用VS2010的調(diào)試工具進(jìn)行調(diào)試。因此在模擬器上開發(fā)應(yīng)用程序不需要真機(jī),不需要燒片時(shí)間,可以通過VS2010提供的調(diào)試工具進(jìn)行調(diào)試,大大加快了應(yīng)用的開發(fā)測(cè)試速度。
4 結(jié)論
本文研究和開發(fā)了一個(gè)在Windows環(huán)境下的嵌入式支付系統(tǒng)模擬器,該模擬器基于功能模擬的基本思想,通過Windows現(xiàn)有API模擬基礎(chǔ)系統(tǒng),提出了保持對(duì)外接口不變、模擬函數(shù)功能的原則,實(shí)現(xiàn)底層驅(qū)動(dòng)的模擬。通過配置文件,解決了模擬器適用于不同機(jī)型的問題。本文還提出同時(shí)利用DLL隔離、宏隔離以及區(qū)域隔離3種方式,解決了C環(huán)境下重名函數(shù)共存,并且調(diào)用不混亂的問題。
參考文獻(xiàn)
[1] 李婷.ARM全系統(tǒng)模擬器中I2C模塊的設(shè)計(jì)與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2012.
[2] Zhang Xiuping, Yang Guowu, Zheng Desheng. Component-based model for simulating the MMU coprocessor[C]. 2010 2nd International Conference on Information Engineering and Computer Science(ICIECS),2010,42(8):1-4.
[3] 鄧漫齡.ARM嵌入式Linuz系統(tǒng)的研究與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2009.
[4] 柯化成.嵌入式系統(tǒng)全系統(tǒng)模擬器框架設(shè)計(jì)與實(shí)現(xiàn)[D].杭州:浙江大學(xué),2006.
[5] Wang Ping. Research on the embedded system[J]. Teaching Education Technology and Training,2008(1):21-22.
[6] GRANHAM I. 面對(duì)對(duì)象方法原理與實(shí)踐(英文版第3版)[M].北京:機(jī)械工業(yè)出版社,2003.
[7] 王洋.NAND Flash在嵌入式系統(tǒng)中的仿真與應(yīng)用[D].成都:電子科技大學(xué),2011.