Java自从推出以来一直备受关注,不过在嵌入式系统设计师看来,其性能并不能令人满意。运行Java虚拟机(JVM)解释Java字节码,这种方式对大多数嵌入式应用来说占用空间过多,运行速度过慢。不过Sun的Java 2 Micro Edition(J2ME)改变了这种状况。
对嵌入式系统设计师来说,Java有许多优点。作为一门编程语言,Java允许面向对象编程,又没有C中存在的严重问题。Java运行时环境还提供了有用属性。Java提供的内存管理功能使得编程人员不必分配及释放内存。运行时环境甚至可以通过整合核心类库来简化程序分配。 但大多数嵌入式应用面临Java没有处理好的两大约束:没有足够的空间和时间。
那么,Java作为一种在C++基础上改进了的面向对象的语言,在嵌入式应用开发方面能挑大梁吗?能否为它自己撑起一片蔚蓝的天空呢?
一、为什么会是Java?
对于嵌入式系统来说,Java技术比C语言和汇编语言具有很明显的优越性。显着的特点是减少了系统的开发和维护,增强了代码的重利用能力,提高了Java代码与系统原有代码的可整合性。
提高开发效率和可维护性
在项目的整个生命周期中,Java环境大大的简化了开发和维护。由于目标环境是建立在一个虚拟机上,代码可以很容易的编写、调试、分析、更改、维护。加上将来要连接的外接设备,未来的系统可能比目前的嵌入式系统复杂很多。升级手册也许不会在整个项目的生命周期中都能起到作用。取而代之的是,硬件设备的可连接性使得能够远程管理模块,这样就保证了开发人员能在产品上增加新的性能,同时解决了在产品生产后软件升级和维护的问题。
重复利用代码
由于嵌入式系统有特殊的需求,以及不同的专门硬件要协同工作,嵌入式软件开发者通常使用非常原始的方法来开发,有时每一个新的项目都要从头再来一遍。现在,随着嵌入式技术的成熟以及系统本身变得更大更优化,很多人开始对于把一个产品的模块甚至是全部的应用程序用到另一个产品感兴趣。这种可重新利用性使得"一次开发,多次利用"成为了可能。
环境使得一个模块可以只要做很少的工作就可以适应多个项目和平台。甚至包括有时客户需要一个新的目标板,或者采用新的硬件(CPU或外设)和软件,或者使用不同的Linux都可以进行移植。
集成Java代码和源代码
使用源代码明显是指应用程序的多可用性以及代码的重利用能力。在Java应用中,一个设计很好的界面,或者虚拟机,或者是底层的硬件都可以很好的兼容到嵌入式系统中。尽管无法移植,对于很多功能和硬件界面来说,在本地环境下开发的代码也许仍然是的解决方案。在C、C++或者汇编语言中,加入标准的通信、接口模块、用户界面、安全特性会花费很多时间与金钱。与之相比较,Java的基本库本身就提供了这些东西甚至还更多,这样就可以加速开发。
二、Java碎片真的会有影响吗?
在使用JavaME CLDC进行移动电话开发时,人们经常会碰到碎片这个词。Java强调“一次开发,多次利用”,但碎片出现,却打破了这种传奇。于是,这就导致应用开发人员不得不在许多不同的设备进行应用程序的测试,甚至于不得不在应用程序中对某些特殊的设备进行一步客户化的工作。
对程序开发人员来说,碎片真是个恶梦,因为碎片平白无故的增添了代码量和测试工作量。当然,对移动电话持有者来说也不是什么好事,因为碎片消耗了设备的空间。不管怎么说,碎片对每个人来说都是件很讨厌的事情。
但对于嵌入开发者而,碎片又意味着什么呢?
首先来看看碎片产生的根源。移动电话行业标准本来给不同的产品预留了一定的自由空间,这初衷是好的。但事实上,这种预留的空间,却导致了不同产品之间的冲突,不能进行很好的兼容。这就是碎片产生的根本原因。于是这种不兼容性进而升级到了Java实现的程序里。这正是Java想花大力气创建一个统一Java实现的原因所在,如JSR248,MSA(Mobile Service Architecture)的建立。
从嵌入式开发人员的角度来看,也许并没有这么糟糕。其实碎片并不会影响到嵌入式开发人员,因为已经可以确定设备之间的硬件是完全兼容的。如果使用的是原始语言像C/C++的话,嵌入式开发人员可以在任何地方来编写代码,并在不同的设备上进行代码的重用。
三、 Java平台的测试
如果采用Java来实现嵌入式设备开发,会不会碰到C/C++经常碰到的测试成本太高的难题呢?
当然,采用Java来开发的话,可以对软件进行多次的重复测试,尽管这不一定是必需的。而完全需要进行重复测试的只是那些新加的Java实现。如果是Java平台的合法用户的话,还可以使用Sun提供的TCK来进行程序兼容性的检测。如果付费的话,还有很多压力测试可供选择。只要能保证Java平台的正常运行并按Java的测试通过了的话,那么所开发的程序其可移植性是完全可以保证的。
当然,在此有必须有提醒一下只测试Java实现端口的开发人员。因为有一些端口的实现有可能是采用C/C++来编写的,这些必须测试。可以使用全新设备来对整个程序进行测试以达到这一目的。
测试工具包
通过采用Java来进行编程,可以确保平台的APIs是否正确的工作。如果采用C/C++或直接对操作系统编程,则使用全新的设备时,无法保证APIs的正常性。由于这些问题取决于所采用的测试包的全面性和可靠性,因此,在开发阶段有可能发现不了它们,而在部署的阶段发现了它们时,问题已经扩散得超出控制范围了。而对于Java平台的测试,一般比较全面。所以,C/C++或直接对操作系统编程的问题能比较早的被发现并解决。
因此,采用Java平台时,其测试时间有可能跟使用C/C++来开发整个程序的时间差不多。但结果大大不同,使用Java平台时,其差的测试效果往往可以与C/C++环境下的测试效果媲美。就测试的选择而言,采用Java平台时,可以使用Sun的TCK来确保程序对新设备的适用性,同时,还可以得到Java的其它测试包,不过是收费的。然而使用C/C++时,则只能依靠开发人员自己来保证程序对新设备的适应性了。
端口兼容性
那么如何知道设备所依赖的操作系统端口是兼容的呢?没法知道,因为操作系统供应商通过没有测试它。除非所使用的设备是标准的硬件,没有进行任何的客户化工作,或是可以让操作系统提供商对这特殊的端口进行单独的测试。相样,采用Java平台时,这又是怎么的结果呢?可喜的是,由于Java平台的TCK已经做了这样的工作,因此,这可以更好的提高其兼容性。
总之,采用Java平台所需的测试,差的情况也就跟采用原始语言(C/C++)一样,但大部分情况下,都优于后者。而且,更具有兼容性的保证。
语言初的设计企图是想用于控制消费性电子产品,本为嵌入式设备而设计,但随着因特网的兴起,Java在台式机和服务器端的应用开发中取得了巨大的成功。Java在应用中充分展示其通用性与完全性等优势,而这在嵌入式设备的应用开发中是至关重要的,这使得Java重返嵌入式应用开发领域成为必然。STK Java卡和J2ME的成功应用昭示着Java在嵌入式系统应用开发中的美好前景。
手机程序Java能扮演嵌入式应用开发的主角吗?
更新时间: 2012-08-22 14:02:10来源: 粤嵌教育浏览量:1566