嵌入式Linux和Java 技术——天生的合作者


(来源:转载自http://www.pocketix.com)

作者:Michael Mathews,MontaVista软件公司产品经理
Marc R.Erickson,IBM技术公司项目经理

摘要:
  嵌入式Linux和Java技术非常适于协同工作,他们的结合预示着下一代嵌入式系统已经开始出现。同时这种组合使开发技术进入一个新的层次,也提供了一个新的配置的选择。在嵌入式Linux操作系统和Java技术相结合的开发环境中工作的开发者发现这种组合是非常有吸引力的。今天,越来越多的嵌入式开发者选择了这种组合,因为它具有更强的伸缩性,能将产品更快的推向市场的,具有更高的生产力。
本文讨论了Linux操作系统和Java技术的结合在嵌入式程序设计中的应用,我们会更多的关注组合后对各自性能的强化,而不是着重于探讨相互间配合的好处。本文从软件栈、开发平台、处理器覆盖面、开发工具、执行引擎、优化工具、和配置模式全面的讨论Java技术。

为什么是Linux?

  在今天快速改变的市场需求中开发嵌入式应用程序,一个好的决择是通向成功项目的关键。这些决定包括选择处理器和平台、软件栈、开发工具,以及决定产品的特性、功能、生命周期。一但产品进入开发,改变以上任何一个都会导致时间和金钱的浪费,所以在项目开始阶段做正确的选择能够最大限度的提高成功的概率。
嵌入式应用程序所使用的处理器和平台的选择通常是由应用程序的设计目标所决定的。幸运的是我们有大量的处理器和平台可供选择,包括很多通用的解决方案以及由业内领先的芯片商和主板商提供的客户化解决方案。尽管处理器的选择是基础,但是通常开发平台的选择拥有更多的挑战。在很多项目中是根据标准的主板进行配置,但是大多数会使用自己的主板以适应所需要的功能。这通常意味着应用程序是在一个开发板上开发,但是要能支持用户板上预期的特性。寻找一块能够满足设计需求的标准板不是一个微不足道的小事,这些目标中的一个就是要有一个好的软件平台的支持。

   一但硬件平台被选定,就需要找到一个软件支持平台。在这其中,第一个难点就是寻找一个可靠的、稳定的、支持这个硬件的操作系统。它需要能够提供这个项目所需要的支持和工具,同时要有足够的机动性能满足任何专门的需求。但是,由于处理器的选择范围很广,找到一个能支持所选处理器的操作系统非常困难。其中的原因主要是,大多数提供解决方案的操作系统供应商无法跟上大量的芯片体系和主板的快速增长,所以他们必须选择支持有限的几种硬件,以最大化他们投资的回报。

  开放源代码从某种程度上减少了这种问题,但是大多数的提供解决方案的开发商仅仅当他们自己的系统无法满足需求才会给出源代码。这种处于第二位的选择通常受到开发商投入的限制。在很多情况下,项目所选择的主板是没有软件包的支持(BSP或LSP)的,必须要开发一个新的软件包,而且还要开发商有能力而且愿意为此工作。

  当然,你可以通过大量的开放的源代码来建立自己的操作系统,甚至这个操作系统也许会包括很多商业实时操作系统的一些特性。但是对于多数的公司这种方法是不可行的,因为要建立软件环境必然要利用研发产品的技术力量。所以,一个有吸引力的选择是采用一个基于嵌入式Linux的软件环境来开发和管理项目。一旦针对嵌入式做了相应的调整,Linux就会给整个项目的开发和管理提供一个很好的环境,更利于嵌入式解决方案的开发。

  得益于很多人在Linux上的开发及对其进行功能扩展,近几年Linux环境越来越流行。为了适应新的需求,Linux核心技术不断发展,底层的程序也不断的增加以支持大量新的外设、技术、协议和服务。移植Linux到不同的平台的工作大部分是由专业的嵌入式Linux公司来完成的。因为如果要完全支持主板的特性和性能,必需要进行专门的驱动程序开发和系统整合,他们的工作正满足了这种的需要。尽管大多数的嵌入式Linux系统提供商是在开放源代码的基础上进行工作的,实际上他们中很少会完全的公开他们产品的源代码。

   完全开放源代码的一个例子是MontaVista Linux,一个面向嵌入式应用的专业的开发和配置平台。嵌入式Linux系统同时也具有了桌面和服务器上使用的Linux的大多数特性,如可靠性、开放性、高性能。MontaVista公司针对嵌入式系统,在标准的Linux上增加了很多的新特性。尽管他们为此作了很多的工作,但是他们把研究成果完全提供给开放源代码组织,以完整相应的Linux源代码,对Linux的发展作了贡献。以下是他们工作中的几个重要部分:

  • 提供不需要控制的系统引导和程序执行
  • 可从FlashRom进行引导和无硬盘操作
  • 包括Rom引导程序的可裁减Linux内核,最小可到500k.
  • 可支持CompactPCI体系和I/O主板
  • 可支持CompactPCI背板的的网络设备(MontaVista Net)
  • 支持客户化的设计和嵌入式产品制造
  • 压缩的Flash引导支持
  • 支持PCI接口的热插拔

  MontaVista支持了几个处理器体系中的很多处理器和主板:因特尔的奔腾系列,奔腾2/3及兼容设备;386/486级兼容设备;StrongARM 110,1100,1110,Xscale;Motorola PowerPC 603/604,740/750/7400, PowerQUICC 823/860/8260;IBM PowerPC 405;MIPS 4K,5K,7K;Super Hitachi(SH)3,4.

  当然在选择操作系统之上是选择项目的软件环境。在今天激烈的市场中,开发人员需要优秀并且完备的开发工具来提高生产力,它需要支持几个小组甚至是几个地点的合作开发。很多程序需要对于底层模块的控制,特别是在C、C++、汇编语言中。这就需要标准的工具如gcc,kgdb,gdb,ddd等。增加这些工具可以帮助目标程序进行配置、测试、调制以优化。

  我们还需要从传统的实时操作系统到现在的系统进行移植应用程序的工具,以便于代码的重利用。以上所有的这些的开发工具都是必需的,但是要完全的实现嵌入式环境的潜在能力,则需要有一个强大的适应性强的中间环境。在混合的环境中很多的项目也有可能完成,这就包括了以前的程序代码,或者一些专门的高效模式(如声音/图像操作或语言翻译),能够灵活的并且很容易的配置Java程序代码。我们应该感谢Java的虚拟平台,所有在传统的实时操作系统中Java程序实现的功能的都可以用到Linux下的项目中。

为什么是Java技术?

  对于嵌入式系统来说,Java技术比C语言和汇编语言具有很明显的优越性。最显著的特点是减少了系统的开发和维护、代码的重利用能力、以及Java代码与系统原有代码的可整合性。

减少开发和维护

   在项目的整个生命周期中,Java环境大大的简化了开发和维护。由于目标环境是建立在一个虚拟机上,代码可以很容易的编写、调试、分析、更改、维护。加上将来要连接的外接设备,未来的系统可能比目前的嵌入式系统复杂很多。升级手册也许不会在整个项目的生命周期中都能起到作用。取而代之的是,硬件设备的可连接性使得能够远程管理模块,这样就保证了开发人员能在产品上增加新的性能,同时解决了在产品生产后软件升级和维护的问题。

  Java技术使真正的交互开发成为了可能。程序的功能模块是在很多的工作站上开发的,然后进行测试和准备整合。这样,就算没有硬件原型,技术人员也能够进行功能模块的开发。在完成硬件原型后,技术人员通过网络连接到共同使用的硬件设备上,在一个公司甚至几个合作的公司中建立一个可供项目小组共同使用的虚拟平台。

   Java程序的执行环境同时也减低了内存管理的要求,"空间收集"技术能够在内存段释放后自动的收集内存空间。

重利用代码

   由于嵌入式系统有特殊的需求,以及不同的专门硬件要协同工作,嵌入式软件开发者通常使用非常原始的方法来开发,有时每一个新的项目都要从头再来一遍。现在,随着嵌入式技术的成熟以及系统本身变得更大更优化,很多人开始对于把一个产品的模块甚至是全部的应用程序用到另一个产品感兴趣。这种可重新利用性使得"一次开发,多次利用"成为了可能。
Java环境使得一个模块可以只要做很少的工作就可以适应多个项目和平台。甚至包括有时客户需要一个新的目标板,或者采用新的硬件(CPU或外设)和软件,或者使用不同的Linux都可以进行移植。

集成Java代码和源代码

  使用源代码明显是指应用程序的多可用性以及代码的重利用能力。在Java应用中,一个设计很好的界面,或者虚拟机,或者是底层的硬件都可以很好的兼容到嵌入式系统中。尽管无法移植,对于很多功能和硬件界面来说,在本地环境下开发的代码也许仍然是最好的解决方案。在C、C++或者汇编语言中,加入标准的通信、接口模块、用户界面、安全特性会花费很多时间与金钱。与之相比较,Java的基本库本身就提供了这些东西甚至还更多,这样就可以加速开发。

开发者的兴趣和技术

  很多程序员现在被培养来做Java应用开发。举个例子,IBM有几千个做Java程序的程序员。随着大部份培训机构开设了这种流行的语言和相应的开发环境的课程,大量的Java开发人员成长起来。

  下一代的嵌入式项目开发人员需要有效的配置复杂的、功能强大的、连接在网络上的设备。既然Linux和Java技术都能满足TCP/IP协议栈,支持通信所需要的大部分工作就已完成了,而且还是根据标准极好的完成的。

挑选平台-中间层的选择

  对于中间层有大量的选择,大多数都可作为一个独立的模块获得,比如协议栈,图形开发工具,管理工具,特殊的操作系统功能如高可用性和实时性等。单独的使用其中的任何一种都不太难,但是随着中间层数量以及相异性的增加,不可避免的会对开发者的工作产生影响,也会由于增加了栈的复杂度而延迟整合、测试、调试的进度。

  虽然Java最初的设计是为了满足桌面和服务器市场,随后它却发现了在嵌入式项目中作为应用环境有更广泛的认同度。Java技术的开发者早就整合了一些标准的功能,包括通讯、安全、模块管理。这种基于面向对象的Java程序的设计,使这些完全不同的中间服务能够有效的合作,同时可以很好的管理。其余的中间环境用同样的方式提供底层的执行,但是目前如果没有主板的支持,我们无法享受到Java技术带来的好处。

  最后,可以扩展Linux以提供了开发者所必需的控制,以用来保证实时程序执行和工作的正确性。有几种方式可以达到这个目的。MontaVista公司对标准的Linux平台进行了扩展,而不是对其进行规范。举个例子,为了支持实时程序的执行,MontaVista Linux使用了新的APIs来控制存储管理、线程执行表以及进程执行。

有效的应用程序的执行

  我们应该感谢标准的Java类库结构的建立,它使管理应用程序的大小成为了可能。实际上,研究表明超过500KB大小的应用程序采用Java编码的话会更复杂。这是因为字节编码比大多数硬件结构的设置都要复杂。著名的路由程序如果以类库的方式编写,并以字符代码编译,则比建立在真实的机器并规范了存储路径的程序要易于重复利用。

  IBM采用了唯一的方式来完成嵌入式Java技术,实际上是从一个唯一的根类来创造了J9的所有不同目标板的版本以及所有的Java的类库。IBM的J9和Java类库的源代码描述了如何构建这些模块。一个独立的移植层被用来描述唯一的目标处理器的特征以及实时操作系统接口。可以采用不同的技术来设计独立的功能模块,然后用嵌入式Linux实时操作系统商所提供的工具来编译。

  使用即时编译技术和采用充足的高速缓存,程序能够以接近使用本地机器语言编译的程序的速度执行。其实真正重要的是程序运行的要足够快。对于很多应用程序(包括用来作为产品传感器和控制器的服务管理的深层嵌入式设备,以及有用户界面的设备)高速的执行不是其目的。使用者对于图形界面速度的需求远远低于今天嵌入式处理器上Java编译器的编译速度。

Java 开发工具

  很多的开发者和工程师发现,对于Java应用程序的开发者来说一个完整的工具包能够提供非常大的帮助。这些开发人员中很多都是从企业项目的开发转移到嵌入式项目的开发中来的,其中的很多都是从现在的在线服务扩展产生的。这些开发人员希望找到有效的开发工具。他们原来普遍使用集成开发环境,完善的调式工具,有帮助功能的Java语言帮助工具,以及语言分析成型工具。大部份还有集成版本控制以及发行管理功能。
很多开发Linux下Java应用程序的程序员也希望使用Linux作为开发平台,以便于创造一个统一的有效的开发过程,避免从Windows开发环境到Linux环境的转换。IBM公司和MontaVista公司提供了一个基于Red Hat操作系统的名为"VisualAge Micro Edition"的Java集成开发环境及相应的工具。它为工程师和开发人员提供了一个完全的嵌入式交叉开发环境。

   通常,在个人的电脑上开发程序,然后通过远程调试的方法在一个共用的实验室中的设备上运行是一个较为有效的开发方法。"VisualAge Micro Edition"提供了远程调试和程序分析工具,以及在开发主机和目标机同时使用相同的文件的技术。基于共享技术的NFS和LAN使得Java程序能够即刻直接装载到远程设备上。
一旦虚拟机上的代码发生了改变,程序的变化能够立刻并且毫无改变的反映到开发主机的调式界面上来。这种紧密的联系使嵌入式开发者大大增加了效率。既然Java技术是基于虚拟机的技术,代码的变换都可以用到相连的嵌入式设备上。这就为嵌入式项目的设计者提供了更多的伸缩性和便利性。特别的,这就使得在这些使用了OSGi管理技术上进行功能扩展和改变特性成为了可能。

Java技术和Linux操作系统的结合


  
一个完全的嵌入式实时操作系统必须是以嵌入式Linux或Java平台为核心。嵌入式设备受到了操作系统、驱动程序和其它的功能模块的限制和约束。使用一个与嵌入式目标平台相统一的Linux版本是非常重要的,并不是所有的Linux都能用。

  嵌入式设备资源如RAM、ROM、Flash相对缺乏,需要特别的注意对其管理。同时处理器的性能也相对有缺少(如浮点加速器),这就需要对不同的设备提供有针对性的不同的执行程序。

  既然嵌入式Linux必须适应目标设备的特定的环境,快速有效的重组建立Linux操作系统的镜像就是非常重要的。这样一旦虚拟机及Java应用程序需要,就能够让开发人员增加、移除、修改Linux特性。在嵌入式开发中,设备和应用程序的每一方面都必须被考虑到,以便在大小、速度、资源中进行权衡。

  嵌入式平台完全不像标准的个人计算机或是工作站。尤其是必须要做一些工作来使嵌入式目标板上的设备运行。交互端口、Flash存储、播放设备和声音界面的协同使用需要设定才能完成。我们要感谢在传统的嵌入式操作系统中广泛的开发经验也可以用到嵌入式Linux开发中,一些基于嵌入式的标准也用到这些设备中。这些标准包括以下:

  • 低成本设备管理
      这种嵌入式Linux操作系统和Java技术的统一展开了一个新的世界,在液晶屏和触摸屏上的图性用户界面能够更有效的构建。这些设备是低功耗、紧凑的、通常是彩色的,这对于消费者和产品生产者来说都是非常有吸引力的。很多底层的设计能使得用户界面使用到手持设备或机顶盒中,这样就可以控制和显示大量嵌入式设备如车载、通讯设备的底层嵌入式操作系统。

      图形用户界面同时被使用到粗糙的位图界面和窗口界面中。基于Linux的服务器和工作站配置"x-Window"用户界面以及一种可选的窗口管理器.与之不同,嵌入式Linux提供一种更有效的直接的方式。举例来说,MontaVista的Linux操作系统就配置了一个开放源代码的"MicroWindows"图形界面包,它可以被移植运行到很多处理器平台。它运行在Linux堆栈的顶部,提供了一个接近硬件设备的底层接口。它是为在嵌入式处理器中获得高性能而特别设计的,能够用来创建一个高响应速度的界面。

      MontaVista的MicroWindows采用了IBM的J9和它的Java类库。这样,一些嵌入式目标设备能够获得统一的图形界面的支持。IBM提供了两个基本的图形类库:简单图形工具("SWT")和"MicroView"。AWT是为了个人Java平台特别设计的,它运行在SWT图形层之上,作为一些浏览器及相连的XML翻译工具。SWT能够用复杂的窗口控制创建用户界面层。简化的MicroView结构用来创建在低性能的嵌入式设备上较为粗糙的用户界面。

  • 通讯接口
      几乎每一个开发平台和嵌入式处理器都包括了通讯接口。在Linux移植中,如果主板上有RS-232串口和以太网口,那么最基本的任务是写这两种设备的驱动。
     
      通讯是同时建立在TCP/IP协议和简单串口之上的,其中TCP/IP协议栈是由Linux提供。TCP/IP协议栈提供了连接互联网的权限,同时也提供了程序与程序之间基于对话通讯的socket界面。
     
      Java类库的衍生库能够直接操纵通过特殊通讯总线和设备相连的串行设备。这些设备中就包括符
    合"CAN","MOST",或IEEE J-1850标准的自控总线设备。
     
      在开发中,一些设备可以直接通过串行连接直接被访问到。包括电话、车载收音机以及GPS单元(卫星定位系统)。这些设备能够通过在串行连接上传输的专门协议被控制。但是在产品中,这些设备实际上被连接到自动通讯总线上。所以,为了控制这些设备,需要一个承接层。IBM设计了一个提供硬件模拟的软件包,它能够选择传输技术,这样在开发平台上的程序可以直接被移植到最终的产品中。

多变性

  使用Java技术和嵌入式Linux操作系统的结合现在应用到大量的嵌入式目标板上。开发者可以根据项目的需求配置和添加虚拟机以及Java类库的成分,就像Linux的裁减一样。设备驱动可以根据需要选择,同时也可以保留应用程序对于很多相关设备开发和配置的权限。这种方法可以通过用户界面以对大量设备程序重新使用其代码。Linux操作系统和Java可以根据硬件设备从最小的到最大的进行升级。

技术支持

  一个项目的大部分的花费是用在开发完成、产品上市之后。这种支持的花费与产品的用户在很多方面相关。
当考虑到嵌入式Java代码,开发者与Linux和Java供应商的技术支持的联系是关键。举一个典型的例子,Java本身的开发工程师在做最初的虚拟机端口和用于嵌入式Linux目标平台的Java库时,他们是和Linux的供应商一起工作的。Linux和Java供应商的共同发展的关系是最需要被考虑的。特别是在Linux开放源代码的环境下
,能够控制Java库的源代码也同样是非常重要的,这样就可以根据一个项目的具体情况进行不同的配置。


结论

  嵌入式Linux操作系统和Java的结合为工程师和开发者对于不同的项目进行配置提供了新的选择。我们要感谢专业的Linux技术支持公司的出现,他们解决了嵌入式开发者遇到的很多问题。大量的连接设备的平台能够支持Java应用程序的执行。

  最初,考虑得最多的也许是可以获得源代码以及没有传统的版权费。因为传统的实时操作系统的商业模式是建立在订购技术支持和服务的基础之上的,这样嵌入式平台相对来说就较为便宜。

  在Linux平台上进行工具的改进,主要考虑的是在嵌入式设备中,工作是在资源紧缺的环境下进行的。随着IBM的"VisualAge Micro Edition"的出现,Java应用程序的开发人员能够获得丰富的交互开发工具的完全支持。

  由于以前很长一段时间内Linux都运行在服务器上,这就使得Linux的内核以及相关的功能在鲁棒性上都得到提高。嵌入式Linux也同样得到了这种性能的提升。今天,Linux被证明是一种非常健壮的环境,同时它也随着时间和经验的增加不断的得到提高。

  今天,对嵌入式Linux所做的工作主要是提供配置性更强的、更小的系统成分,这样就可以加速系统的初始化速度,同时提升资源的利用。当与Java强大的可变的环境相配合的时候,项目的管理者和开发者可以利用这种结合使他们成功的设计和开发下一代应用程序,而且是具有高可信赖性和高可利用性的程序。


译者:陈玮
职位:博利思软件有限公司技术支持工程师

本文曾刊登在《共创软件》第3期