当前位置:Linux教程 - Linux - Java应用于嵌入式系统

Java应用于嵌入式系统



        
    Java程序语言在其产生之初,本身就是为机顶盒设备设计的。后来,由于它在互联网上的出色表现,使它赢得了巨大的声誉和财富。现在它又来了个浪子回头,回到自己原来的领地——嵌入式系统。

      不过,现在用Java来开发嵌入式系统,产生了许多新的复杂的问题:由于新的设备、新的技术的出现,使其在速度、内存、大小和时间定义等方面面临着一些以前从没有遇到过的问题。当然,由于继承了Internet的完整性,再加上开发者现有的知识,Java完全有能力解决这些困难。Java API的一个子集Java 2 Micro Edition (J2ME),是专为只有很小内存的嵌入式设备设计的。在其客户端,只包括了Java的一些非常重要的功能,J2ME用“配置文件”对两类设备进行设计:128K-512K内存和512K以上。基于不同的设备配置文件,将会有不同的用户界面和其它可用的程序包。

      需要引起注意的是,那些在Internet和桌面程序上优秀的特性在嵌入式系统里往往会导致一些错误。还有,由于运行在JVM(Java虚拟机)上和缺乏指针,所以Java要去控制硬件将非常困难。自动的碎片收集功能虽然使得编程变得很容易,但同时,也使得实时控制变得非常困难。此外,Java运行非常慢并且还携带着一个很大的脚本。当然,目前这其中的大部分问题都可以得到解决。所以说编制嵌入式系统程序时,有时Java不失为一个很好的选择。


      什么情况下选择Java?


      对于要处理中断信号并指导火星登陆者这样的微处理器来说,Java可能不是最好的选择。如果所要完成的任务是轻量级的,并且要求是高效的,有明确时间限制的应用(比如火箭制动、传感器通讯、太空船定位等),那么就应该用C或者汇编。而对于在船运上能跟踪包裹的把柄设备,Java将是一个非常好的选择。这种设备需要和其它的设备进行交流,或者需要继承很多Internet方面的功能。


      天赐良机


      Java流行的原因之一是WORA(平台无关性)。因为它是一种解释型语言,同样的Java代码可以在Mac、 PC、Solaris,甚至是大型机上运行。但这同时也使其运行效率大大降低,虽然目前由于实时编译器的出现,使得其耗费的时间大大缩短,但是我们仍然很难想像一个人要等Java分配内存,加载所需的类完成以后再打电话(这一过程最少需要八秒时间)。AOT(ahead-of-time)编译器可以先解释Java代码,将其优化并转换成相应平台的二进制代码。但是使用AOT,开发者就不能在一个中心服务器上管理并维护一个被编译过的代码。当然,这对于那些基于静态代码的使用环境来说(比如嵌入式系统),这应该不算是一个很大的损失。


      大小至关重要


      对于一个服务器来说,有几个G的内存应该不是什么新鲜事,但对于一个可运行Java的设备的来说,其内存可能小于512KB。所以在使用Java时最好使用核心类,去掉所有没用的代码、方法和类(在编译时AOT将优化这些问题)。有的商家有时也自己写核心Java类的专用平台。它们更简练、更高效,并且仍旧支持已公布的Java API。


      使用IDE


      据统计表明,C程序里80%的漏洞是由于指针引起的,所以Java自然就避免了这些错误的发生。Java的安全模式禁止直接寻址系统内存和硬件。当然,有时当你想直接、快捷地访问内存时,指针的确是一种很方便的方法。所以用Java写的嵌入式系统必需使用一个接口,通过该接口从Java里调用C代码,去实现一些对硬件的操作。这就意味着程序员必需具有处理多种语言代码的能力,也就是说一个程序员需要掌握一种额外的技能。对于一个公司来说,也就意味着需要额外的程序员,也就意味着额外的投入。所以,现在的问题是把如何把这些代码连接成一个模块,并且如果出错的话如何进行排错。

      IDE(整合开发环境)是一个功能强大、丰富的多语言开发环境。它使得程序员可以在同一个IDE和IBM的基于J2ME的VisualAge里用不同的语言来编写程序。当然,由于IDE本身在解决问题时就非常复杂,所以排除其错误也不是一件容易的事。


      内存回收


      在嵌入式系统里,通常我们不使用Java的理由是,它实时性太差,也就是说它很难在预定时间内执行完相应的程序。此外,Java使用自动垃圾回收技术来回收没有被使用的内存,所以开发者对内存的回收几乎没有什么控制权。为了解决这个问题,商家通常使用不同的途径或算法来回收内存。NewMonic的RTE( Real Time Executive)和 Windriver的 FastJ都可以使编程者获得绝对的时间控制权。Sun也有一种不同的解决方法,其目的仍然是保证其实时性。事实上,很多技术(比如目标重用)也可以减少这种内存回收方式带来的影响。


      重用依然重要


      虽然使用AOT编译器对于编程人员来说,其付出的代价是:其程序将不再放之四海而皆准,但由于Java代码便于携带,所以这应该不是什么大问题。当一商家推出一款新版硬件时,除了界面可以保留外,与界面交互的代码将不得不更改。这将大大增加工作量,所以使用面向对象的开发语言非常重要。也就是说,使用Java,使得程序各模块的重用性大大增强。


      在项目里使用Java


      在什么时候使用Java来开发,需要进行成本分析。众所周知,内存和处理器速度都比较便宜,并且会变得越来越便宜。虽然从感觉上来说,我们可能在服务器的内存上花了上百甚至上千美金,但我们在生产电话时的成本就会减少。如果我们在每部电话上因为少使用内存而节约了1美元,那么2千万部电话就将节约2000万美元。

      在所开发的嵌入式系统项目里使用Java,技术相对于组织等因素来说,应该说不是一个重要的问题。如果你恰好有一家公司,而公司里又有很多用Java从事Web开发的程序员,那么你肯定不愿意花时间和财力去把它们培养成ES程序员。所以一个很好的办法就是用Java来开发,当然,最好不要整个项目都用Java来开发。

      应该引起足够注意的是,从普通的、在JVM上运行J2ME字节码的环境上偏离得越远,所编的应用程序就越难于管理,所以除非有特殊的问题需要解决,一般不要这样做。

      不管怎么说,在Java回归之时,再选择使用它将是一个很有吸引力的选择。


    发布人:netbull 来自:嵌入式Linux