新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > Java在嵌入式系統(tǒng)中的解決方案

Java在嵌入式系統(tǒng)中的解決方案

作者: 時間:2011-08-08 來源:網(wǎng)絡(luò) 收藏

一、引言

本文引用地址:http://m.butianyuan.cn/article/150399.htm

  的設(shè)計者企圖建立一個簡單的、面向?qū)ο蟮摹⒅腔鄣摹⒁呀?jīng)解譯的、強大的、安全的、架構(gòu)合理的、可移植的、高性能的、多線程的、動態(tài)的語言。為使對開發(fā)者有吸引力,Sun公司融合了類似于C語言的語法和結(jié)構(gòu)。然而Sun最終沒有達到這個目標,還是被證明不適合小型的電子設(shè)備,這很大程度是因為它大而且速度慢。應用Java程序所需要的處理能力和內(nèi)存量,對這類設(shè)備來說太昂貴了。

  然而,Sun公司設(shè)計Java時最重要的是平臺無關(guān)及網(wǎng)絡(luò)集成。一個無須更改能夠在幾種不同硬件和軟件平臺運行的程序,對網(wǎng)絡(luò)環(huán)境來說是一個理想的程序。對想建立通過網(wǎng)絡(luò)來通訊并利用網(wǎng)上資源的分布式程序的開發(fā)者來說,一種在任何平臺上都有內(nèi)置的和標準的網(wǎng)絡(luò)支持的語言是一個大實惠。

  1、Java語言與

  對于選用編程語言,一般說,越是高級的語言,其編譯和運行庫施加的開銷越大,你的應用程序也越大,越慢。已經(jīng)公認用匯編語言能寫出最小最快的程序,其次是用C或Forth,接下來較大的是C++或Basic,然后才是Java。因此一般來說,編程人員都會首選匯編和C,而然后才會考慮C++或Java。

  但是開發(fā)者為何要來關(guān)注Java呢?筆者以為,隨著不斷增長的市場需求,很多嵌入設(shè)備必須適應網(wǎng)上交流的需要,為了迎合此要求,考慮這種到開發(fā)Internet應用程序的便利,眾多開發(fā)者都發(fā)現(xiàn)使用這種語言是有意義的。另一個原因是隨著內(nèi)存條及32位處理器價格的下降,最初在嵌入使用Java太昂貴的問題不再有了。隨著使用Java的成本代價減少,它的很多優(yōu)點應當被考慮作為嵌入平臺。

  2、Java對于嵌入式的優(yōu)點分析

  Java語言的優(yōu)點在于:它當初就是由理解和信奉網(wǎng)絡(luò)計算夢想的一個小巧而專注的開發(fā)組設(shè)計的,雖然該語言最初的實施方案有點缺陷,有許多后來已被解決了,但為了這個夢想,他們很少在技術(shù)上妥協(xié),結(jié)果誕生了一種專為以相互通訊為主要目的的設(shè)備而設(shè)計的語言。

  有許多技術(shù)上的優(yōu)點都可能會引導嵌入開發(fā)者選擇Java,以下就是這些優(yōu)點(其中有幾個也適用于通用編程)

  A)與處理器無關(guān)

  Java的第一個優(yōu)點就是與處理器無關(guān),這個優(yōu)點似乎與嵌入式沒什么相干。傳統(tǒng)上,嵌入程序就是針對特定的微處理器設(shè)計并在其上運行的,而C語言程序的可移植性則可通過編譯或交叉編譯來保障。

  但是在Sun公司的模型中,一個程序可能是存儲在一個系統(tǒng)上,而被下載并運行在另一個完全不同的系統(tǒng)上;設(shè)備可能從不同地方下載一些程序來在一個處理器上運行,或者不同的處理器運行一個程序,通過網(wǎng)絡(luò)在相互間傳遞數(shù)據(jù)。使用Java,一個嵌入式系統(tǒng)就可能成為一個通用的通信設(shè)備,能下載并運行能完成特定任務(wù)的程序。

  對嵌入式系統(tǒng),這是一個新的模型,已經(jīng)有一些開發(fā)者正在向它靠攏。例如,電視機機頂盒的供應商已宣布并入JVM,以使用戶能通過Java applets在他們觀看電視的同時接收到的支持該電視節(jié)目的一些內(nèi)容。這樣你在觀看足球比賽時,看到的支持內(nèi)容就可以是對球員的技術(shù)統(tǒng)計;若你在看電影,看到的支持內(nèi)容就可以是演員的背景資料。JVM還被并入到移動電話中,這樣用戶可接收股票報價信息、比賽分數(shù)及其他即時信息。

  筆者以為,這是一個恰當?shù)脑O(shè)計和實施模型。其一是你在選擇開發(fā)平臺時更加靈活了。你無需在與目標相同的平臺上開發(fā),也不用去關(guān)心交叉編譯,因為Java字節(jié)碼能在任何有JVM的操作系統(tǒng)中運行;另一個優(yōu)點是:幾乎所有的檢測和調(diào)試可以獨立于目標設(shè)備來進行。但是,一些數(shù)據(jù)輸入和硬件交互要求在目標(或是很好的仿真系統(tǒng))上測試。由于個別JVM有時有兼容性的問題,你應該在所有將用到該程序的平臺上測試它。但一般來說,你并不要高級而昂貴的、配備有邏輯探針、ICE以及其它調(diào)試工具的、針對目標平臺的開發(fā)環(huán)境。

  B)面向?qū)ο蟮木幊?/p>

  Java是一種純粹面向?qū)ο蟮恼Z言。所有代碼和數(shù)據(jù)都是某個類的一部分,沒有全局變量或是獨立于類存在的代碼,一個對象是一個類的實例,對象是通過調(diào)用操作方法,或者說函數(shù)來操作的,而這些方法或函數(shù)也是類的一部分,對象的方法就對象的數(shù)據(jù)進行操作。Java類被組織成一個等級層次,在層次結(jié)構(gòu)中,一個子類能夠繼承其超類的行為,并可用子類所具備的一些特有功能來擴展其超類的功能。對象模型是你能定義對應真實事物的數(shù)據(jù)結(jié)構(gòu),使得程序的任務(wù)和任務(wù)如何實現(xiàn)者二者之間的轉(zhuǎn)換變得基本上透明。

  面向?qū)ο蟮脑O(shè)計和編程的優(yōu)點在于其開發(fā)速度和代碼的可維護性,許多面向?qū)ο蟮拈_發(fā)都能通過利用和更改現(xiàn)存類庫來完成,而不是創(chuàng)造一個新的結(jié)構(gòu),這就使開發(fā)加快了,例如,一個硬件開關(guān)能在軟件中使用一個開關(guān)對象來實現(xiàn),該對象包含用于控制和操作開關(guān)的所有必需的數(shù)據(jù)和代碼。面向?qū)ο蟮姆椒ㄟ€盡量使用自然的結(jié)構(gòu),使其有很高的可讀性,且可輕易更改和加強。

  C)安全和安全操作

  由于有了JVM,一個Java應用程序與操作系統(tǒng)或硬件完全隔絕,因此計算機病毒或其它作祟的的代碼就很難獲得對設(shè)備的控制。虛擬機是主機設(shè)備和那些可能難以確定其質(zhì)量和可靠性的軟件之間的一個保護層。

  另外,Java設(shè)計者從該語言中去掉了指針變量的概念。Java不能任意訪問其內(nèi)存位置,它們只能讀寫有Java內(nèi)存分配管理系統(tǒng)創(chuàng)建的對象。由于Java編譯器所強制的嚴格的分類機制,從理論上來說,訪問那些未分配給程序的內(nèi)存區(qū)域是不可能的。這個限制使得要寫惡意代碼的程序變得非常困難了。

  對Java applet施加的限制就更加嚴格了。由于Java applet被設(shè)計成從Internet上下載,因而被視為不可信任的代碼,除非它包括你已認定為可信任的主機的數(shù)字指紋。JVM在內(nèi)存的一個稱之為sandbox的區(qū)域運行諸如applet這種不可信任的代碼。它給每個applet分配資源和特權(quán),并將其限定在這些分配區(qū)域范圍中。

  D)內(nèi)存管理

  Java的內(nèi)存管理遠比其他語言簡單,因為它不使用指針。當對象被實例化時,內(nèi)存被動態(tài)分配。正如我們前面分析的,對個別內(nèi)存地址的訪問被Java的設(shè)計者視為一個對安全的潛在危險,因此,訪問也被禁止。而且,Sun的網(wǎng)絡(luò)模型已假定你也許不知道目標處理器,而引用專用內(nèi)存地址變得沒有必要。去掉指針的結(jié)果不僅提高了安全性,還簡化了編程,錯誤也減少了。

  在C語言中,可以用值或引用的方式來訪問數(shù)據(jù)。事實上,出于靈活性和控制考慮,非原始數(shù)據(jù)類型都由引用方式來存取,即通過指針訪問。因此,值和引用的不同變得非常清楚,特別是:因為你不得不使用不同的符號(*和)來存取數(shù)據(jù)。要用這兩種不同的訪問方式,你必須清楚理解它們是什么以及你為什么應該使用這一個,而不使用那一個。

  在Java中,由值和引用來存儲是無縫的,尤其因為其符號都一樣。兩者間唯一不同在于數(shù)據(jù)類型本身:所有原始數(shù)據(jù)類型始終由值的方式存取;所有對象,包括字串、數(shù)組以及文件流,始終由引用方式訪問。聲明為原始數(shù)據(jù)變量類型包含該變量的值,聲明為對象的變量則包含對該對象(即該對象的地址)的一個引用,而非對象自身的引用。僅僅聲明一個對象變量并不給對象分配內(nèi)存,你必須用“new”關(guān)鍵字來分配內(nèi)存和創(chuàng)建對象。

  這兩種方法最根本的不同在于:不可能象在C中那樣就Java內(nèi)存地址做指針算術(shù)或其他操作。Java中對象的地址是相對的(或虛擬的),它由虛擬機任意分配,因此你沒有理由還想要指針地址。

  E)垃圾收集

  垃圾收集自動收集內(nèi)存中未引用的內(nèi)存,并將其歸回空閑內(nèi)存鏈表中。JVM使用此功能將不在使用的內(nèi)存還給系統(tǒng)。

  當Java程序說明并實例化一個對象或數(shù)組時,它僅僅做一個JVM請求,訪問其下面的系統(tǒng)內(nèi)存(通常是通過主機操作系統(tǒng))并分配內(nèi)存,Java的垃圾收集系統(tǒng)通過內(nèi)存收集對象,然后檢查它們的引用鏈。Java的垃圾收集系統(tǒng)的工作方式一般是搜索內(nèi)存中的對象,然后檢查它們的引用表。它計算程序中有多少變量當前正在引用每個對象。若對象的引用數(shù)目為零,它知道此對象不再在使用了,它的內(nèi)存可以收回。其結(jié)果就是,不必像你在C語言所作的那樣,要人工來釋放分配的內(nèi)存。在C中,釋放內(nèi)存是一個必要、耗時且易出錯的細節(jié)。Java自動而精確的處理此過程,去除了C/C++程序中那種常見的錯誤致因。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

上一頁 1 2 3 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉