<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時間:2011-08-08 來源:網(wǎng)絡(luò) 收藏
          3、用于的局限及

          本文引用地址:http://www.ex-cimer.com/article/150399.htm

            A)性能

            如前所述、解釋字節(jié)碼比相當(dāng)?shù)腃或C++寫的程序運行起來要慢5到10倍。對一些并非受制于CPU的嵌入來說,這一個性能缺點不是問題,但是更經(jīng)常的較慢的速度會導(dǎo)致無法接受的應(yīng)答時間。有幾種可能的可緩解速度慢的問題。

            1)使用更快、更強大的處理器,使響應(yīng)時間縮小到可以接受的范圍。這個方法將增加每個系統(tǒng)的成本。

            2)使用母語編譯器來獲得比較好的性能。但這樣做,你就放棄了與Java平臺無關(guān)的優(yōu)點,好在大多數(shù)嵌入系統(tǒng)都只在一種平臺上運行。

            3)在你的系統(tǒng)上并入一個JIT編譯器,這樣Java類裝入時就被編譯。若你為接納JIT編譯器而不得不增加額外的內(nèi)存,這個方法也會增加系統(tǒng)成本。另外,若你的系統(tǒng)各部分是按需求逐漸添加,你應(yīng)控制程序裝入的時機,以使在裝入類進行編譯時產(chǎn)生的暫停不會影響系統(tǒng)的響應(yīng)時間。

            B)垃圾收集的系統(tǒng)開銷

            前面論述過,Java中的自動內(nèi)存分配和垃圾收集性能是實惠的,因為它去掉了最通常的程序錯誤根源并簡化了程序設(shè)計人員的工作。但是,從實時系統(tǒng)的角度來看,它的問題恰好就在于它是自動的。當(dāng)垃圾收集進行時,你的控制就受限了。

            垃圾收集運行時,它凍結(jié)了系統(tǒng)其余部分的處理。這是因為它必須要在內(nèi)存中移動對象,并必須在程序再次運行前,更新所有引用(指向)那些對象的程序變量。垃圾收集能凍結(jié)處理達數(shù)十分之一秒,具體取決于內(nèi)存量和處理器的速度。很顯然,這對硬實時系統(tǒng)是無法接受的,甚至極端時對軟實時系統(tǒng)也是成問題的。

            垃圾收集以三種方式開啟。首先JVM有一個后臺垃圾收集線程,此線程傾向于在它一看見系統(tǒng)有空閑就開始垃圾收集,若有事件想要喚醒另一個線程,后臺垃圾收集就會被該線程占先,但它不會立刻被占先,它得更新那些已被移動得對象的所有引用后,才能讓一個線程運行。

            其次,若JVM沒找到足夠內(nèi)存來滿足某個內(nèi)存分配請求,它將啟動一個不會被占先的垃圾收集,在該操作完成之前,系統(tǒng)的其余部分被禁止。

            最后,一個應(yīng)用程序能通過調(diào)用Systev.gc()方法來啟動垃圾收集。所有,如果你知道系統(tǒng)暫時不會執(zhí)行任何時序上關(guān)鍵的任務(wù),你可以啟動垃圾收集,并希望避免稍后在更關(guān)鍵時段進行收集。

            C) JVM的系統(tǒng)開銷

            我們已經(jīng)論述了許多JVM的內(nèi)置特點,比如圖形和網(wǎng)絡(luò),它們使得你的Java程序更快上市。所有這些特點的負面是JVM的內(nèi)存開銷。因為JVM是一個整塊(要達到Java的可移植的目的,你必須完整的采納),JVM的內(nèi)存占用量不能減少?,F(xiàn)在的JVM最少需要2MB以上的內(nèi)存。

            但是如果你的Java程序也在使用一些消耗內(nèi)存的功能,由于一個JVM中有那么多的功能,各個Java應(yīng)用程序就能寫的小一點。如果你建立的是一個從網(wǎng)絡(luò)上動態(tài)下載并運行多個程序的系統(tǒng),那么這將是個很大的優(yōu)點。但Java仍然不具備可配置性和可伸縮性,而這些是嵌入操作系統(tǒng)一直以老字號自居的特點。

            D)硬件訪問

            Java實現(xiàn)可移植性的安全性的方法也意味著它缺乏直接同硬件接口的能力。JVM僅僅是一個虛擬的機器,一個對硬件的軟件抽象,該抽象僅僅使連接是直接的。虛擬機控制與實際硬件的接口,而我們只能和虛擬機打交道。

            但這并非無法逾越的限制,很多C程序使用內(nèi)嵌匯編來規(guī)避性能上的瓶頸,所以Java程序也能使用C來獲得對硬件的直接訪問。

            讓Java和C一起工作有兩種方式。第一、可以使用本地方式,它們是用C/C++或另一種語言寫的,但當(dāng)調(diào)用時,則裝入與JVM同樣的內(nèi)存空間,運行于同樣的環(huán)境。因為它們被編譯成機器碼,本地方式運行更快并能直接訪問硬件。本地過程與Java代碼之間通過套接來彼此交流,就像網(wǎng)絡(luò)中通信端點使用的套接一樣。在你選擇了混合語言方法后,Java的與平臺無關(guān)和安全特點就沒有了。

            可以考慮將前面提到的Java處理器作為軟件JVM的解釋器部分作為一種硬件實現(xiàn)方案。Java程序能在這些處理器上直接運行并操縱硬件,要注意Sun必需加一些特殊目的的指令給這種語言才能直接與這些處理器一起工作。

            E) 語言尚不夠成熟

            Java于1996年5月發(fā)布,幾個月就有了beta版。第一個主要修訂版,Java Development Kit(JDK)1.1在一年以后開發(fā)出來,以標(biāo)準(zhǔn)的程序設(shè)計語言角度來看,Java還很年輕,也很粗糙。實際上,所有通用語言,都要幾年時間才能夠成熟到能可靠的寫出作為產(chǎn)品的應(yīng)用程序的程度。

            在其進一步發(fā)展中,Sun公司分了三個步驟來促進Java成為一種通用語言和計算機平臺。首先,用Java編程實現(xiàn)現(xiàn)存的商業(yè)和企業(yè)的一些功能活動,諸如電子郵件、日歷和字處理程序。在這些方面,Java將與傳統(tǒng)的編程語言和傳統(tǒng)的編程方法競爭。其次,把Java提供給企業(yè),使他成為一種編寫內(nèi)部應(yīng)用程序的方法。信息科學(xué)部門常常要用一種必須編譯的(因而是針對具體平臺的)語言來產(chǎn)生客戶程序,因此由于平臺不同而編譯和維護不同的版本。如使用Java,信息科學(xué)部門只需編寫和維護一種版本。最后一步,是為傳統(tǒng)設(shè)備應(yīng)用,比如移動電話、機頂盒以及打印機定義Java API以及語言功能。

            Java開發(fā)的編程工具也仍在發(fā)展之中。有幾個廠家提供編譯器和開發(fā)工具,如Symantec、Microsoft以及Sun公司。Sun不再是JVM和JIT的僅有選擇,其他幾個供應(yīng)商的產(chǎn)品也很有競爭力,這些公司在開發(fā)檢測和調(diào)試工具上較慢。市場上有了一些初步的產(chǎn)品, Parasoft的Jtest軟件自動為Java模塊生成檢測案例,而Numega的Jcheck為JVM中的程序行為提供一定的可見性。

            目前仍然沒有完善的交叉調(diào)試,即那種傳統(tǒng)上被嵌入系統(tǒng)開發(fā)者用來處理目標(biāo)平臺上程序的方案,你很可能必須用C/C++來寫你的程序中針對硬件的部分。不管怎樣,你最好用一個C/C++交互調(diào)試器來調(diào)試那些代碼,并在你的目標(biāo)系統(tǒng)上用彈出對話框,保持記錄文件,或其他類技巧來調(diào)試你的Java。

            4、總結(jié)

            由上可見,Java的應(yīng)用是排在Sun公司日程的最后的,Sun在繼續(xù)為這些用途發(fā)展此語言,但對這方面的發(fā)展會次于桌面及企業(yè)用途。

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

          上一頁 1 2 3 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();