Java扮演嵌入式應(yīng)用開發(fā)主角 http://mobile.csdn.net/subject/J2ME_Nokia/
嵌入式Java會(huì)在下一代移動(dòng)電話、智能卡、無線設(shè)備、游戲裝置及其他許多嵌入式應(yīng)用中扮演重要角色,關(guān)鍵在于選擇哪一種實(shí)現(xiàn)方法。
Java自從推出以來一直備受關(guān)注,不過在嵌入式系統(tǒng)設(shè)計(jì)師看來,其性能并不能令人滿意。運(yùn)行Java虛擬機(jī)(JVM)解釋Java字節(jié)碼這種方式對大多數(shù)嵌入式應(yīng)用來說占用空間過多,運(yùn)行速度過慢。不過Sun的Java 2 Micro Edition(J2ME)改變了這種狀況。
對嵌入式系統(tǒng)設(shè)計(jì)師來說,Java有許多優(yōu)點(diǎn)。作為一門編程語言,Java允許面向?qū)ο缶幊?,又沒有C++中存在的嚴(yán)重問題。例如,Java允許類繼承,但不允許來自多個(gè)父類,這就排除了產(chǎn)生混淆的可能;同樣,Java防止了C++定義運(yùn)算符時(shí)允許出現(xiàn)的不確定性。Java運(yùn)行時(shí)環(huán)境還提供了有用屬性,它通過先檢查JVM中的代碼然后再執(zhí)行來確保應(yīng)用程序不會(huì)相互干擾,以及整個(gè)系統(tǒng)不會(huì)崩潰,如果代碼試圖改變系統(tǒng)的核心行為,它就無法運(yùn)行。Java提供的內(nèi)存管理功能使得編程人員不必分配及釋放內(nèi)存,避免了內(nèi)存泄露的可能,它還能通過垃圾收集方法,自動(dòng)釋放閑置內(nèi)存。運(yùn)行時(shí)環(huán)境甚至可以通過整合核心類庫來簡化程序分配。
此外,Java在業(yè)界得到了廣泛支持,這意味著有眾多資源可以利用,包括小應(yīng)用程序和經(jīng)驗(yàn)豐富的編程人員,從而每次編寫新應(yīng)用程序無需重復(fù)性工作。
但在上述這些優(yōu)點(diǎn)之外,Java用于嵌入式開發(fā)的問題在于,大多數(shù)嵌入式應(yīng)用面臨Java沒有處理好的兩大約束:沒有足夠的空間和時(shí)間。
Java開發(fā)的時(shí)間和空間約束
之所以會(huì)有時(shí)間上的約束,是嵌入式系統(tǒng)通常必須在短時(shí)間內(nèi)對外部事件做出響應(yīng),如果系統(tǒng)在下一個(gè)事件出現(xiàn)前沒有處理好前一個(gè)事件,就無法完成任務(wù)。
時(shí)間上的約束還意味著需要確定性。設(shè)計(jì)師依靠軟件元素,在已知或者有限的時(shí)間內(nèi)完成各自的任務(wù),本身沒有時(shí)間限制的任務(wù)(如等待循環(huán))在執(zhí)行時(shí)間攸關(guān)的任務(wù)時(shí),能夠暫停掛起。
嵌入式開發(fā)的空間約束來自對成本和便攜性的需求。設(shè)計(jì)師需要盡量少用內(nèi)存,往往使得設(shè)計(jì)受微控制器的片上內(nèi)存資源的制約。但這也有助于降低功耗,這是電池供電的便攜系統(tǒng)所考慮的一個(gè)重要因素。
在這些時(shí)間和空間的約束下Java很難正常工作。Java軟件環(huán)境要與操作系統(tǒng)協(xié)同工作,并使用Java虛擬機(jī)把Java字節(jié)碼轉(zhuǎn)換成系統(tǒng)處理器的本機(jī)語言。它還需要相當(dāng)大的類庫,作為核心系統(tǒng)的一部分。這兩種因素大大增加了對系統(tǒng)內(nèi)存的需求。
Java的解釋碼運(yùn)行起來本身就不如編譯碼快,這樣一來,系統(tǒng)更難滿足實(shí)時(shí)約束條件了。速度更快的處理器或許能幫上忙,但功耗因素往往使得嵌入式系統(tǒng)無法使用更快的處理器。就算系統(tǒng)足夠快,Java的垃圾收集算法也沒有時(shí)間限制、不可中斷,就不可能獲得確定性。
J2ME定義兩類Java
對于Java在嵌入式開發(fā)中遇到的問題,J2ME可以解決其中的一部分。辦法是縮減類庫大小,并且改變垃圾收集算法。J2ME定義了兩類Java:連接設(shè)備配置(CDC)和連接有限設(shè)備配置(CLDC),讓Java得以適用于諸多嵌入式系統(tǒng),如下表所示。這些Java取代了較舊的嵌入式Java,而舊版本實(shí)際上是用于定制應(yīng)用的非標(biāo)準(zhǔn)版本的Java。
CDC是一種功能齊全的Java,面向配有網(wǎng)絡(luò)連接、32位處理器和供Java平臺使用的2MB內(nèi)存的設(shè)備。這個(gè)版本的Java允許設(shè)備以類似桌面機(jī)的方式,下載及運(yùn)行通用的小應(yīng)用程序。PDA、家用電器和汽車導(dǎo)航系統(tǒng)就是適合的目標(biāo)應(yīng)用。
CLDC是一種精簡版的Java,面向運(yùn)行時(shí)環(huán)境更加定制的應(yīng)用。CLDC并不允許運(yùn)行通用小應(yīng)用程序,而是要求Java程序符合設(shè)備的約束條件。這樣一來,Java“編寫一次、到處運(yùn)行”的優(yōu)勢也就無從談起,不過它仍保留了Java編程的其他優(yōu)點(diǎn)。CLDC及其K虛擬機(jī)需要160KB的內(nèi)存和16MHz的16位處理器。
Sun利用這兩種配置,開發(fā)出了符合許多嵌入式系統(tǒng)設(shè)計(jì)空間約束的標(biāo)準(zhǔn)Java配置,Java社區(qū)制訂的實(shí)時(shí)Java規(guī)范使得實(shí)時(shí)和確定性問題迎刃而解。實(shí)時(shí)Java規(guī)范(RTSJ)V1.0提供了Java平臺的標(biāo)準(zhǔn)擴(kuò)展部分,并且改動(dòng)了垃圾收集算法,確保了Java提供許多嵌入式應(yīng)用所需的確定性。
這就只剩下原始性能問題還沒有加以解決。解決辦法來自行業(yè)提高Java執(zhí)行速度的一系列方法,包括使用優(yōu)化的JVM、執(zhí)行前先把Java代碼編譯成本機(jī)碼,使用及時(shí)(JIT)編程器以及使用硬件加速,每種方法各有優(yōu)缺點(diǎn)。
與普通JVM相比,優(yōu)化的JVM通??梢园褕?zhí)行速度提高2~2.5倍。不過,這種優(yōu)化要針對特定處理器。提供優(yōu)化的JVM的廠商可能還會(huì)提供優(yōu)化的類庫和實(shí)時(shí)操作系統(tǒng),能夠與JVM密切合作,進(jìn)一步提高軟件性能。
不管有沒有經(jīng)過優(yōu)化,使用JVM仍需要解釋工作,這就限制了程序的執(zhí)行速度。把Java代碼編譯成本機(jī)碼、然后再執(zhí)行可以避免這種限制。這種情況下,Java成了類似C++的另一種高級語言,限制執(zhí)行速度的因素完全取決于編譯器的代碼效率。問題在于,與其他高級語言一樣,必須在把代碼植入程序內(nèi)存之前,先進(jìn)行這種編譯,結(jié)果導(dǎo)致系統(tǒng)缺乏靈活性,無法下載升級的Java代碼或者是新的應(yīng)用程序。
及時(shí)編譯器力求通過“高速”編譯Java代碼以便可以立即執(zhí)行,重新獲得這種靈活性。這帶來了高性能和靈活性,但也增加了特定應(yīng)用程序的啟動(dòng)時(shí)間,因?yàn)樾枰乳_始編譯。由于至少占用100KB的內(nèi)存(加上JVM和應(yīng)用程序所需內(nèi)存),使用及時(shí)編譯器還加大了對系統(tǒng)內(nèi)存的需求。
硬件加速Java
為了加快Java執(zhí)行,又避開編譯或者軟件JVM的缺點(diǎn),嵌入式開發(fā)人員可以求助于硬件加速器。這種設(shè)備把JVM的部分或者全部任務(wù)轉(zhuǎn)交給專用硬件去處理,因而性能比解釋的Java提高了5~10倍。不過,硬件加速器并不接管所有任務(wù),主機(jī)CPU仍處理特別復(fù)雜或者很少使用的字節(jié)碼。
半導(dǎo)體廠商采用了幾種方法,通過硬件來加快Java的執(zhí)行速度,致力于不同任務(wù)。
一種是使用硬件解釋器。該解釋器把進(jìn)來的Java代碼的大部分轉(zhuǎn)化成本機(jī)碼,從而給JVM省去了麻煩。例如Nazomi的Jstar、InSilicon的JVX和ARM的Jazelle。大多數(shù)情況下,解釋器擁有硅知識產(chǎn)權(quán),這實(shí)際上擴(kuò)大了處理器的指令集。
另一種方法就是使用協(xié)處理器。協(xié)處理器不僅解釋字節(jié)碼,還執(zhí)行由此生成的機(jī)器碼,讓CPU完全得到解放。協(xié)處理器實(shí)際上是一種處理器,使用Java字節(jié)碼作為本機(jī)機(jī)器語言。有些協(xié)處理器如InSilicon公司的JVXtreme是純粹的協(xié)處理器,而有些協(xié)處理器如Aurora VLSI公司的Espresso和DeCaf可以充當(dāng)協(xié)處理器或者獨(dú)立處理器,這樣在另一個(gè)CPU處理用戶界面等事務(wù)時(shí),可以處理Java代碼。Ajile公司的aJ-100、DCT公司的Lightfoot和Zucotto公司的Xpresso都是協(xié)處理器。與解釋器一樣,這些協(xié)處理器往往作為用于ASIC或者FPGA實(shí)現(xiàn)的核心。
第三種方式是利用硬件及時(shí)編譯器高速編譯Java字節(jié)碼。這種設(shè)備有別于硬件解釋器,它不僅僅把軟件從一種形式轉(zhuǎn)換成另一種形式,實(shí)際上還能夠編譯,包括進(jìn)行優(yōu)化、重新安排代碼執(zhí)行次序等。Parthus公司的MachStream就屬于這一類。
有了這一系列加快Java代碼執(zhí)行速度的軟硬件方案,嵌入式系統(tǒng)的Java性能問題似乎可以得到解決了。遺憾的是,很難預(yù)測它們會(huì)給性能帶來多大幅度的提升。加速器與其他系統(tǒng)單元的相互關(guān)系更是加大了預(yù)測難度。CPU架構(gòu)、可用系統(tǒng)內(nèi)存的數(shù)量、實(shí)時(shí)操作系統(tǒng)(RTOS)、JVM、類庫和硬件加速都可能影響系統(tǒng)的最終性能,甚至應(yīng)用軟件也會(huì)對性能產(chǎn)生影響。例如適用于Internet設(shè)備的系統(tǒng)軟硬件配置在機(jī)頂盒里面運(yùn)行起來可能會(huì)比較慢,在移動(dòng)電話上就完全不適合。
遺憾的是,嵌入式設(shè)計(jì)師沒有多少工具可以幫助自己測試非傳統(tǒng)配置的性能。最有用的工具就是系統(tǒng)性能測試公司開發(fā)的SPEC JVM98基準(zhǔn)測試。但SPEC JVM98不是為了滿足嵌入式系統(tǒng)的測試需求,而是為聯(lián)網(wǎng)和獨(dú)立的客戶機(jī)開發(fā)的,并且前提是假設(shè)完全實(shí)現(xiàn)了Java,并擁有完整的桌面系統(tǒng)環(huán)境,而很少有嵌入式系統(tǒng)擁有這么豐富的資源。
Pendragon軟件公司的CaffeineMark這個(gè)基準(zhǔn)測試在嵌入式領(lǐng)域頗為流行。與Dhrystone MIPS基準(zhǔn)測試一樣,CaffeineMark也是一種人工基準(zhǔn)測試,僅僅測試幾項(xiàng)Java特性,不包括浮點(diǎn)運(yùn)算、垃圾收集和多線程這些項(xiàng)目,而對這些嵌入式開發(fā)人員來說可能很重要。另外,沒有標(biāo)準(zhǔn)配置可供基準(zhǔn)測試來運(yùn)行。因而,不同廠商的基準(zhǔn)測試結(jié)果很難解讀。
對嵌入式Java而言,缺少測試工具問題也許不會(huì)長期存在。EDN嵌入式微處理器基準(zhǔn)測試協(xié)會(huì)(EEMBC)已開始開發(fā)Java基準(zhǔn)測試套件。EEMBC基準(zhǔn)測試準(zhǔn)備采用諸多系統(tǒng)測試指標(biāo),包括垃圾收集時(shí)間和確定性、I/O性能、中斷時(shí)延、內(nèi)存使用以及測試過程中的系統(tǒng)功耗。還會(huì)包括詳細(xì)的軟件執(zhí)行基準(zhǔn)測試,測試項(xiàng)目包括類加載時(shí)間、類方法執(zhí)行、所用線程數(shù)量、每個(gè)線程所用時(shí)間、以及調(diào)用線程的時(shí)間。該協(xié)會(huì)計(jì)劃在眾多應(yīng)用環(huán)境下進(jìn)行基準(zhǔn)測試,包括智能卡、移動(dòng)電話、掌上設(shè)備、Internet設(shè)備和機(jī)頂盒。
一旦這些工具準(zhǔn)備到位,就可以根據(jù)預(yù)期應(yīng)用來進(jìn)行比較,從而大大方便了開發(fā)人員選擇嵌入式Java的諸多方案、確保系統(tǒng)的最終性能能夠達(dá)到預(yù)期。那樣,Java可以在將來的嵌入式系統(tǒng)開發(fā)當(dāng)中扮演主角。
posted on 2006-12-20 16:26 leoli 閱讀(196) 評論(0) 編輯 收藏 所屬分類: java