Chapter3 第3章
开源的嵌入式操作系统
今天开源软件正大行其道,从服务器、云计算、桌面到手机和嵌入式设备,到处都可以见到开源软件和开源的操作系统。本章介绍对嵌入式系统发展具有重要影响的几种开源的操作系统。
开源软件与嵌入式操作系统
Linux支持多种微处理器、总线架构和设备,半导体公司SoC芯片的驱动程序、应用相关的中间件、工具和应用程序都是先为Linux开发,后来才移植到其他OS平台。这些特性都非常适合于嵌入式系统应用。
在讨论开源的嵌入式操作系统(简称嵌入式OS)之前,我们先把开源软件搞清楚。“开源软件”目前并没有明确定义,也没有标准许可证。许多公司采用开放源代码一词,大概有这样两种情况:第一,开源软件的许可条款是一个组合条款,并不都是GPL。比如Android里面就有多种许可证(GPL、Apache和BSD)。我们知道Linux内核采用GPL,用户所做的任何修改都必须开源给社区。Android的许可可以让用户为自己的应用制作专用软件(遵循Apache和BSD许可)。第二,一些商业软件虽然也称自己是开源软件,其实它们只是开放源代码给用户或者大众,让大家免费评估和试用。如果用户需要真正将其使用在商业项目上,并需要技术服务的时候,收费就会随之而来。这里讲述的是第一种开源软件。
Linux
Linus Torvalds在1991年发表的Linux开放操作系统,是由在互联网上的志愿者们开发的,它吸引了许许多多忠实的追随者。自1999年稳定的2.2版本发布以来,Linux不仅早已经在服务器和台式机上取得了巨大的成功,也正在嵌入式系统中大放异彩。许多人认为,Linux之所以获得嵌入式市场的广泛认可,关键是得益于Linux极高的质量和极强的生命力。当然,能够给Linux开发人员提供充分的灵活性和开放源码的选择,不收取运行时的许可使用费也是开发者选择Linux的极好理由。与商业软件授权方式不同的是,开发者可以*地修改Linux,更能最大地满足他们的应用需要。在技术上,因为基于UNIX技术,Linux提供广泛的功能强大的操作系统功能,包括内存保护、进程和线程,以及丰富的网络协议。Linux与POSIX标准兼容,从而提高了应用的可移植性。Linux支持多种微处理器、总线架构和设备,通常情况下,芯片公司的驱动程序、应用相关的中间件、工具和应用程序都是先为Linux开发,后来才移植到其他OS平台的。这些特性都非常适合于嵌入式系统应用。
MontaVista Linux
谈到嵌入式Linux,MontaVista是一定要提到的,它对于Linux在嵌入式系统商业应用起到了重要的作用。MontaVista创始人和首席执行官正是第2章提到的Jim Ready,他是公认的商业操作系统的先驱,有超过25年在嵌入式软件行业的丰富经验。当他还在Ready System的时候,就已经开始关注Linux的发展,1993年他曾下载过0.98版本Linux并尝试运行起来。他预见到Linux必将会成为未来影响嵌入式市场的一个重要因素,并着手准备进入市场。1999年在Alloy创业投资公司的支持下,Jim建立了一个聚集着嵌入式Linux软件工程师的公司,目标是开发一个嵌入式Linux软件平台,也就是HardHat Linux。该公司戴帽子的企鹅的宣传画如图3-1所示。2001年,Hard Hat Linux 2.0版本发布之后,在Red Hat(红帽)公司一再要求下,也为了避免产品名字的雷同,Jim将产品更名为MontaVista Linux。之后陆续发布了2.1/3.0/3.1/4.0和后来的5.0版本。从技术上看,MontaVista Linux不只是一个通用的Linux发行版,它更是为嵌入式系统所需的可靠性和实时性(通过对2.4内核加入实时补丁)而精心设计的,支持高端嵌入式系统使用的处理器架构x86、ARM、PowerPC和MIPS,以及一系列的驱动程序和板级支持包。它有一整套的开发工具、闪存和固态存储文件系统,还有很容易监视系统完整性和性能的各种工具。
图3-1 HardHat Linux戴帽子企鹅的宣传画
MontaVista创建以后的10年间,借助开源软件的东风,公司迅速发展,并成功地将其MontaVista Linux应用在了通信基础设备、智能手机、数字电视机和机顶盒等各种嵌入式系统中。国际*的设备制造商纷纷采用它的技术和产品,比如NEC、Motorola和三星电子等。MontaVista Linux的出现对于传统的商业RTOS是很大的冲击,客户逐渐认识到开源软件的价值,纷纷转向开源,而在开源软件中,遵循开源规则的MontaVista肯定是最好的选择。虽然期间也曾经出现过几个竞争对手,比如1995年在匹斯堡成立的timesys,虽然也有着不错的产品,但是毕竟它远离硅谷又不熟悉嵌入式软件运作模式,所以并没有对MontaVista形成威胁。真正的威胁还是来自传统的RTOS巨头,比如风河。当这些巨头认识到开源软件潮流已经到来的时候,市场的竞争才会真正到来。可惜的是,虽然经历了数轮的风险投资,MontaVista并没有能够实现盈利预期,再经过2008年金融危机的冲击,2009年MontaVista被半导体公司Cavium收购。值得庆幸的是,MontaVista被保留了下来。
RedHad的eCos
eCos全称是Embedded Configurable Operating System,它诞生于1997年,可以说是嵌入式领域的一个后来者。相对其他的系统来说,它非常年轻,设计理念上也比较新颖。eCos绝大多数代码使用C++完成。eCos最早是Cygnus公司(该公司成立于1989年,大家一定知道Cygwin吧,就是他们开发的)开发的,1999年被RedHat收购。2002年,RedHat因为财务上的原因又放弃了eCos项目,并解雇了eCos的开发人员。2004年,在eCos开发者的强烈呼吁下,RedHat同意把eCos版权转给开源软件基金会。之后,eCos主要开发人员组建了一个新的eCosCentric公司,继续进行eCos的开发和技术支持。eCos的命运可谓一波三折,令人唏嘘。
eCos最大的特点是模块化,内核可配置。如果说嵌入式Linux太庞大了,那么eCos使用起来则会更加得心应手。它是一个针对16/32/64位处理器的可移植开放源代码的嵌入式RTOS。和Linux不同,它是由专门设计嵌入式系统的工程师设计的。eCos提供的Linux兼容的API能让开发人员轻松地将Linux应用移植到eCos。eCos的核心具备一般OS功能,如驱动和内存管理、异常和中断处理、线程的支持,还具备RTOS的特点,如可抢占、最小中断延迟、线程同步等。eCos支持大量外设、通信协议和中间件,比如以太网、USB、IPv4/IPv6、SNMP、HTTP等。
eCos的专利受eCos许可证所保护,这是一个GPL 许可证的修改版,准许开发者在其上开发的应用程序(即eCos以外自行撰写的部分)可以不用跟着GPL一起发布。应用程序开发者可免费取得其完整的源码,并针对其作任意的修改,并在其上开发自己的应用程序并发布。唯一的限制只是若有涉及修改eCos代码本身,则需将修改的源码汇报给eCos开发小组。当开发者将其作为产品时,也不需支付版税。
许多公司都在使用eCos,并先后成功地推出了使用eCos的嵌入式产品,比如Brother网络彩色激光打印机、DelphiCommuiport车载信息处理系统、IomegaHipZip数字音频播放器、Ikendi指纹识别系统、3Glab移动电话、GPS卫星地面设备等。
Android
Android是谷歌公司开发的针对高端智能手机的一个操作系统。其实Android不仅仅是一个OS,也是一个软件平台,可以应用在更加广泛的设备中。在实际应用中,Android是一个在Linux上的应用架构,优势是能够帮助开发者快速地布置应用软件。Android成功的关键是它的授权方式,它是一个开源软件,主要的源代码的授权方式是Apache。该授权允许使用者在Android源代码上增加自己的知识产权,而不一定要公开源代码。
直到今天,Android的开发主要还是集中在移动终端上,这是谷歌的主要目标市场。相关软件IP和开发工具也都是针对这个市场设计和配置的,在市场上Android已经成为智能手机市场占有率最大的OS。在其他的市场上Android也潜力巨大。一般来说,任何有复杂的软件需求的地方,一个封装好的有连接和用户界面的设备,比如车载信息系统(IVT)、智能电视等,Android都会有用武之地。消费电子、通信、汽车电子、医疗仪器和智能家居应用也都是Android潜在的应用目标。但是Android要从移动终端应用真正走入更广阔的市场,确实是个很大的挑战。目前我们已经看到在平板电脑和智能电视上Android有了不错的表现,基于Android的照相机、智能手表和电视盒也开始出现,而更多的应用正在紧锣密鼓的开发中,如图3-2所示。
图3-2 各种基于Android非手机产品
结语
除了上面介绍的Linux、MontaVista、eCos、Android这些开源OS已经在嵌入式系统中大量使用外,还有应用在军事工业和航空航天上的RTEM,以及来自日本基于ITRON技术规范的Toppers,二者都基于GPL许可证。Toppers还要求如果应用已经嵌入设备里,需要报告给Toppers协会。此外,目前我们还可以看到的商业嵌入式Linux还有Windriver Linux、Enea Linux等产品。开源嵌入式OS有一些开源社区和组织,他们对于开源软件在嵌入式系统的发展和应用起着至关重要的作用, 目前比较活跃的有Linaro。GENIVI等。前者是由ARM、飞思卡尔、三星等公司合资成立的,是致力于为ARM架构开发开源软件的非盈利性组织。GENIVI联盟在全球已经拥有170家成员,它通过提出一个基于开源 Linux平台,希望改变车载信息娱乐软件的开发和使用方式。关于GENIVI我们在后面有关汽车电子的嵌入式操作系统章节中还会介绍。
嵌入式系统开源软件的思考
本节是我代表嵌入式系统联谊会参加“2009年开源中国、开源世界”高峰论坛圆桌会议时的发言。文章回顾了嵌入式系统发展中开源软件的作用和发展趋势,指出了今天发展迅猛的移动互联网是开源软件的重要机缘,嵌入式系统对开源软件多样性需求,社区文化与嵌入式系统的差异,以及开发软件发展的局限性。
回顾过去30年间,嵌入式系统在国内各行各业蓬勃发展,其中有两项重要技术对嵌入式系统影响最大:一是ARM;二是开源软件,尤其是Linux和Linux相关的开源软件。对于ARM,今天业内热议的ARM上网本现在看只是ARM进军市场的一个桥头堡,前进一步ARM即可大举占领利润和产量丰厚的PC市场,退一步也可以保住自己的移动终端和已经牢牢把握的嵌入式市场。ARM要想成功必然要仰仗开源软件,指望微软是不行的,微软有太多历史的包袱和既得利益,它在Windows 7/XP是否支持ARM架构这件事情上一直摇摆不定。与此同时Linux在经历了漫长和痛苦的桌面市场的博弈之后,发现了移动计算这片蓝海,从开始的智能手机、MID,到现在的上网本(Netbook),还有未来的智能本(一种称为Smartbook,尺寸更小、更轻便的上网本)。开源软件也在慢慢向嵌入式系统靠拢。在国内,嵌入式系统行业已经形成了一个ARM+Linux的模式。
嵌入式系统的开源软件之势不减
有两件事情更加说明了嵌入式系统开源软件之势不减。第一件事是MIPS定制Android平台。谷歌的Android在手机上获得各个方面的广泛认可,HTC、摩托罗拉、三星和中国的联想等多款手机已经面世,中国移动也高调支持Android,更多的手机正在开发中。作为开源平台,Android不仅可以在手机上使用,日本公司还把它移植到DTV、数码相框、PMP等消费电子产品上。但是以谷歌一家之力无论如何也无法满足每个特定的嵌入式应用的个性化需求,于是以MIPS为主导的OESF(开放的嵌入式软件基金会)就应运而生,其目标是致力于推动Android平台在非手机领域的发展。看来这是一个众望所归的好事情,也说明嵌入式系统行业对于有影响力的开源平台的迫切需求。第二件事情是传统的嵌入式软件公司Mentor Graphic收购了Embedded Alley。Embedded Alley是一家以前MontaVista(著名的嵌入式Linux公司)雇员为核心的嵌入式Linux服务商。Mentor明确表示,收购的目的就是为了具有Android平台提供服务的能力,但我想背后原因有两个,一是因为Embedded Alley是OESF联盟中的重要合作伙伴,已经成功地为RMI的MIPS芯片提供了Android服务,继承了美国东部企业的务实特色,是一家实干的服务商。二是因为Mentor传统的私有RTOS- Nucleus是目前手机基带芯片的主要OS,但是在增长快速的智能手机上,Nucleus毫无建树,借助Android或许可以帮助Mentor重返手机OS的市场。嵌入式系统无论是芯片、软件和产品应用都在逐渐走向开源,开源之势汹涌澎湃不可阻挡。
移动互联是开源软件重要机遇
移动互联是开源软件在嵌入式系统发展的重要机遇,这一点不仅嵌入式行业看到了,IT产业也看到了。原ARM中国公司总裁谭军博士近期指出,开源软件是下一代差异化计算平台的理想选择,芯片之争、操作系统之争的实质是看谁的生态环境建得好,开源软件在移动互联网有着无比丰富的生态环境。Linux基金会执行总监Jim Zemlin先生在北京2009开源世界峰会上发言时指出,PC经济正在发生变化,而Linux是未来把握利润的“车票”。Jim解释这个原因是,以前单一的PC计算正在向以智能手机、MID、上网本和未来的各类云终端发展,而Linux是唯一开放的可嵌入其中的平台。这里再举一个例子,目前已经交由Linux基金会维护的英特尔Moblin社区非常活跃,它是专门针对MID的操作系统,最新推出的2.0版本有下面的特点和变化:第一,电源管理部分针对MID和Notebook做了优化,使电池续航能力得到延长;网络功能作了进一步扩展,针对MID、Notebook和车载移动设备所需求的网络连通性能进行了扩展,以求达到能够支持最新的3G/4G技术。第二,应用程序框架重新设计。Moblin 2.0核心模块放弃了前一版本所使用的Hildon应用程序框架,主屏幕设计和应用程序图形界面设计有了更大的灵活性,可以用Flash AIR平台为基础设计用户界面,还可以直接以HTML文件作为操作系统主屏幕或者应用程序图形界面,还可以采用GTK/Clutter这个支持2D/3D动画的UI库来设计应用程序的图形界面。第三,2.0版本开发工具更加便利。创建MID和Notebook等多种平台上的Moblin影像的工具MIC能够在USB驱动器、光盘等设备中创建一个带有平台特定的、完整的目标文件系统的影像,Moblin 2.0的架构如图3-3所示。
作为一家芯片公司的Intel,花了这样大的力量和金钱投资一个开放软件平台上,为了什么呢?就是为了掌握在未来移动互联网世界里面更多话语权,因为Wintel架构将不是这个世界上唯一的计算平台了。
注释
2009年4月,Intel将Moblin操作系统移交至Linux基金会,之后与Nokia维护的另外一个开源移动Linux操作系统Maemo合并,命名为MeeGo。2011年,Linux基金会宣传停止MeeGo项目,重新开始一个称为Tizen的Linux移动操作系统项目。后来,三星公司把Tizen应用到三星智能手机、手表和电视上,Tizen项目也主要由三星负责维护。MeeGo项目后来由一家芬兰的创业公司Julla继续开发维护,目前正在进行商业运作。Julla的创始人是来自Nokia前Maemo团队的员工。
图3-3 Moblin 2.0架构
中国嵌入式系统企业应融入开源文化
国际性的嵌入式系统企业对于开源的重视和贡献越来越大,比如,飞思卡尔半导体就把嵌入式Linux作为芯片基本OS重点支持和研发,在北京也成立专门的研发团队。包括飞思卡尔、MIPS、瑞萨、博通、ADI和英特尔这些嵌入式半导体公司,以及Montavista软件、思科通信设备公司对于Linux内核的贡献巨大。如图3-4所示是公司对于改进内核的贡献,图3-5是个人对于改进内核的贡献。这让我联想到国内的情况,一方面以嵌入式Linux为龙头的嵌入式教育和培训热火朝天,学员热情很高,说明企业有需求。另一方面,放眼国内,专业的嵌入式Linux公司越来越少,早在2000年初还有几家,如灵思、蓝点,现在除了中科红旗还有定制性的嵌入式Linux产品服务外,几乎没有一家专业的嵌入式Linux软件公司。
再有,国内大型的嵌入式设备商都有相当数量的Linux研发团队,但是纵观国际开源项目,很少看到他们的身影,甚至连华人个体的数量也很少。来自Linux社区的信息显示,从2.6.13版本开始华人个体参与到Kernel开发中的人数逐渐增加,参与的华人从2.6.13版本的10人增加到2.6.27版本的63人。华人贡献的patch,从2.6.13版本的108个增加到2.6.28版本的650个。但是总的来看,华人对Kernel的贡献所占比重还比较小,只有6%~8%,这里外企华人的贡献占了多数,本土企业的比重比较小。这不禁让人们联想起若干年前,国际Linux社区对于国内某些Linux公司只有索取没有奉献的开源之路的指责,如果中国大型企业不能像欧美日企业那样追随Linux开源文化的精神,我们的嵌入式系统开源之路将会非常漫长。
图3-4 公司对于改进内核的贡献(来自Linux基金会网站)
图3-5 个人对于改进内核的贡献(来自Linux基金会网站)
理解嵌入式系统对开源软件多样性需求
嵌入式系统多学科交叉的特点,决定了嵌入式系统对于嵌入式软件的认识和使用上的多元化现象。比如,计算机专业的人员偏于喜好开源的嵌入式Linux OS;电子和自动化专业更加偏于RTOS,如C/OS-II(开源,商业使用收费模式)和VxWorks(传统的商业嵌入式操作系统)。开源技术和思想对于嵌入式系统中非计算机科学学科的集成电路设计中的SoC技术已经产生重要影响。目前多数嵌入式系统半导体公司使用Linux作为基础的OS。另外,嵌入式系统是应用差异性很大的系统,比如通信行业的手机、智能手机、移动终端(智能本)、上网本、交换机、移动基站和交换机和电信服务器等不同的产品,它们虽然是同一个行业,但是它们各自的体系结构、需求和应用都不一样。更不要说不同的行业,比如消费电子、工业控制和航空航天产品之间的差异就更大了。嵌入式系统的计算平台的体系结构也比桌面和服务器更复杂,种类更多(比如ARM、PPC、MIPS、x86和许多8/16位MCU),这个特点决定了开源软件在嵌入式系统中一定是百花齐放的。今天各种开源软件,比如Ecos、RTEMS、TinyOS和RTLinux,以及RTAI等面向实时性、通用性Linux里面平台也很多,面向移动互联网的Moblin、Android和Ubuntu,像嵌入式系统的C/Linux,Debian,还有商用公司Montavista、Timesys、Windriver Linux的开源版本都在嵌入式系统中有自己的地位和应用。
注释
FreeRTOS是近年在嵌入式系统很流行的一个开源软件,它采用修改后的GPL授权方式,得到了嵌入式系统芯片公司和开发者的青睐,在物联网系统中应用广泛。FreeRTOS详细信息可参见本书相关章节。
正视开源软件在嵌入式系统中的局限性
虽然开源之风在嵌入式系统中越来越盛行,但是部分嵌入式软件平台对于开源软件仍持谨慎态度。部分企业经过实践体会到使用免费开源软件未必能够帮助企业节省成本,购买验证后的商业软件和知识产权却可以帮助企业做大做强。实际上应该纠正这种使用Linux就意味省钱的想法,免费开源软件并不一定比商业软件节省开发和运行成本。一般来讲,成熟的嵌入式软件需要经过至少5年的开发和验证时间,而且需要有一个开发和支持团队,这样的模式对于嵌入式软件平台的尤为重要,因此目前包括航空航天、工业控制系统、交通系统、汽车电子、医疗电子(除信息娱乐部分外)采用Linux和其他开源软件都比较少。开源软件在嵌入式系统的应用还应该注意避免走习惯性的单一化模式的思路,应该以应用为导向,以平台为依托,结合自身研发和维护团队的技术特点,联合芯片、合作伙伴和开源社区共同完成一个项目。
总结一下,嵌入式系统的多样性和广泛性决定了开源软件在其中巨大的生存和发展空间,开源软件的开放性、灵活性、低成本开发和维护模式可以帮助嵌入式产品解决产品正在面临的市场挑战和创新需求。开源技术和思想对于嵌入式系统中各个学科都将产生积极影响。
构建你自己的Linux
今天Linux越来越成熟,应用越来越多,但是自己构造,还是购买商业版本依然困扰开发者,这篇写在2007年的文章很好地回答了产业界长期的困惑—开源软件为何要付费,商业的嵌入式Linux的价值何在。
20世纪80年代初,商用实时操作系统(RTOS)提供商的出现,让人们开始了一场旷日持久的争论。争论的焦点是:到底应该购买商业的实时操作系统还是自己构建实时操作系统呢?经常为嵌入式设备开发软件的工程师们也卷入了这样的争论之中。如今,对于很多嵌入式设备来讲,Linux已经成为了更受欢迎的操作系统。但在这个崭新的Linux世界,有关购买还是自建的争论是不是依然存在呢?
要回答这个问题,必须理解以下两点:
1)让开发者选择Linux作为嵌入式操作系统,而不是其他传统实时操作系统的压力。
2)Linux与其他RTOS的一些细微差别,其开源和软件开发过程,深远地影响了实时操作系统开发和购买之间的平衡。
设备中的软件内容爆炸
在嵌入式系统世界中,以下两个方面的快速扩张是让开发者转向Linux的基础:
1)新的复杂的产品种类增多。
2)嵌入式设备本身系统软件需求的增加。
请试想一下,一个曾经只需要微控制器和小型控制程序(固件)的玩具制造厂,需要开发系列新产品,这些产品要基于完全开源环境,而且是多线程程序,有TCP/IP连接、蓝牙无线通信等。结果,这家跨国消费电子公司突然发现将不得不为自己的产品开发决定采用有上百万行的操作系统软件,因为现在每个产品都要求有多线程程序以及网络连接。内部成本的增加以及产品设计开发复杂度的提高,都使得贯穿整个产品的软件产生了风险。
可以这样概括现在的系统软件市场情形:
1)产品对复杂系统软件的需求日益增加,包括网络连接,使用最具竞争力的高端微处理器技术,支持快速扩展和极度复杂的I/O技术。
2)很多不同的产品小组和团队都对这类系统软件有旺盛的需求,连以前根本没有任何计算内容的产品也不例外。外围激烈的竞争形势根本不能忍受高成本的系统软件;现金预算约束也不支持以前维持的内部开发团队;一个公司的工程资源必须集中在能增值的技术上才能保持自己的竞争力。
3)现在的商业软件的版税部分成本是巨大的,严重地影响了公司的利润。
4)选择一个公共的策略性系统软件平台将使公司避免陷入多种解决方案中而难以决策的窘境,而且这些解决方案都是高成本架构的,没有一个方案具有完全的杠杆平衡力量。以往的工程经验显示,统一的平台可以降低成本并且加快产品开发周期。
这些因素结合起来就使得基于Linux的操作系统成为一个卓越的解决方案,以此来解决设备制造者面临的越来越多的软件内容危机。这一点有数以千万计的电子设备(如移动电话、机顶盒、高清晰电视等)采用了Linux为操作系统的实例为证。
具有讽刺意味的是,今天虽然很多公司依然要面对制造多功能高质量软件集成产品和强大的时间表压力,自己开发产品系统软件的诱惑依然存在。时至今日,30多年前在RTOS领域里,我们听到的争论依然存在,只不过,现在争论的焦点变成了Linux。
显性成本
在嵌入式Linux和Linux发行版中有很多过程和成本的支出,从下边7个方面的叙述中可见一斑:
1)嵌入式Linux或Linux发行版由超出3000万行源代码构成。
2)源代码一般包含19种或者更多的、不同步更新的、没有集成到主代码库里面的软件代码。
3)源代码常常每天改变。
4)很多大公司使用广泛的嵌入式处理架构,需要24个微处理器架构,并且其变量还有多于100个硬件平台的支持。
5)必须支持多种主计算环境(如Windows、Linux、Solaris,以及这些计算环境的各种版本等)。
6)构建、测试、发布一个最初发行版最起码需要30个开发人员(还不包括需要进行的维护、微小的改进或支持上的人力和时间成本),整个成本加起来很容易达到数百万美元。
7)正在进行的维护、增加的微小改进、支持,构造一个开发的环境同样是笔不小的开支。
隐性成本
对于一个成功软件开发的过程来说,很多工作是隐性的或经常被忽略的,包括以下几项:
1)开发一个可以全面测试和质量保证(QA)能力系统:测试套件是为操作系统本身开发的,支持大量的I/O设备,特别是为SoC设备定制的。一个典型的移动设备SoC内部有20~30个复杂的I/O设备,它们都需要测试。支持每一个架构参考板的物理底层,同样需要开发和布置。
2)创建一个有效构建计算环境,以便尽可能快地更改构建(以小时计,而不是天),否则构建过程本身在整个项目开发流中会成为一个瓶颈。
3)开发工具:交叉调试、内存泄漏检测工具、性能调整工具、内核识别的调试等。一般情况下,项目资金很少分配到工具的开发上,因为大部分钱必须投在内核本身的开发上。
4)发布培训课程和课程材料:Linux系统极其庞大而且功能繁多,开发人员需要在其编程模板、设备驱动架构和开发工具上训练,以便快速出成果。
这些隐性努力的成本加上前边讨论过的显性开发成本,对于正确构建和支持一个嵌入式Linux系统都是必需的。
开发过程,新的复杂度和成本
传统的内部开发过程,整个软件开发要很严格地遵守从头到尾的开发步骤。与此不同,Linux开发过程始于大量没有定制的过程,这就是开源开发进程。一个公司可能对一项特别的开源项目有重大贡献,但绝不可能控制整个进程;公司能做的仅仅是影响和参与。比如,Linux更新版本的速度可以不同。从微小bug的解决、适度新特性改进,到整个底层系统的改变,引进新功能、不稳定以及新的bug都可以影响Linux版本改变的频率。
为这些改变所做的整个支出大到让人沮丧的。让我们跟踪一个独立Linux CPU架构活动,以MIPS为例来说明这种情况:为保证跟踪每天发生的改变,开发人员需要监视11种不同的异步开源项目的Email通信,包括:kernel.org—Linux内核的核心、gcc,以及glibc projects(核心的工具链和库),还有至少9种其他的能组成可用Linux开发环境的因素。kernel.org本身每天可能有近5000条信息,其中1000多条需要反复评估,因为它们可能会应用到你们的Linux源代码部分。如果忽视了这些信息,认为自己现在的系统运行正常,这将后患无穷。比如,一个最新的13行代码的安全补丁能起到保护你的嵌入式Linux的作用,如果你忽略了这13行代码,那么补丁可能要用多于80万行的代码来补救。这是一个典型例子,你是现在付账还是以后付,当然后付的费用更多了。
所以,需要开发新的进程来适应开源进程的动态化开发过程,这个进程可能会与任何公司内部开发进程相交叉。将自己的内部软件开发进程和外部开源进程相结合是十分必要的。这种结合的实现方式可以作为企业竞争的优势,但是必须以知识财富的形式小心保护。
自己构建Linux项目很少考虑这种开源开发进程的成本。如果没有正确的Linux/开源意识的引导,开发进度表和产品质量都将遭受不可知的风险或彻底的失败。这些新开发进程成本应该和前边提到的显性及隐性成本一起包括在付出之中。
综观总成本
考虑以上所有的因素,可以认为:要开发一个商业可用嵌入式Linux发行版本,时间上和财力上的投资是不菲的,而通常企业在这两项上的投入又常常是非常有限的。
为整个开发进程设计一个成本模型是很重要的,成本要包括工具,对小、中、大型Linux的支持维护等。即使最简单的Linux系统开发,开发成本也动辄以百万美元计。系统越高级,成本也就越高。如果说数年前人们只是倾向于购买而不是自建RTOS,那么如今人们肯定更加愿意购买一个有更多功能、更加复杂的基于Linux的嵌入式操作环境了。
从Montavista看嵌入式Linux的发展
Linux作为开源的操作系统正在IT产业的方方面面发挥着举足轻重的作用,Linux是服务器的重要的操作系统。Linux是嵌入式系统关键部件,它已经嵌入电信交换设备、路由器、接入设备、网络存储设备和移动终端里,涵盖通信网络的各个层面。IT业界可能非常熟悉的是SUSE、RedHat、中标麒麟Linux操作系统以及在桌面系统中使用的Fedora、Debian和Ubuntu。而嵌入式Linux对许多人来讲还很陌生,这是因为嵌入式设备是以一个整体的形态展现在使用者面前的,所以操作系统虽然是非常重要的部件,但是不容易让大众所认识,比如我们日常看到的游戏机、GPS、电视和机顶盒等电子消费产品,其实它们里面都有一个操作系统在运行,行业内称为RTOS(实时多任务操作系统)或者EOS(嵌入式操作系统)。正如服务器和桌面系统一样,嵌入式系统设计者可以选择商业嵌入式Linux软件或者使用开源的Linux软件自己开发,也可以委托第三方开发。商业的Linux软件市场中与RedHat齐名的是Montavista软件公司。
Montavista Linux已经拥有超过2000多用户和数以千万计的产品在市场上销售,它们覆盖从智能手机、高清电视、机器人、无线网络设备到3G/4G电信服务器等各种嵌入式应用。Motorola使用了Montavista Linux的智能手机“明”(型号是A760/E680等)在中国的巨大成功,使得Montavista和它的Linux产品蜚声国内。
MontaVista Linux演进的历史
1999年,在美国硅谷的Sunnyvale小城,一个普通的办公室里面又多了一群不太年轻的创业者,这就是Montavista创始人Jim Ready和他的创业团队。20世纪80年代初,Jim也就是在同样的地方开始他第一家嵌入式操作系统公司的创业生涯。Jim创办的Ready System公司的VRTX是世界上第一个商业的RTOS,广泛应用于通信、控制和航空航天系统,是嵌入式操作系统的标志性和创造性产品,VRTX的思想为行业的后来者所追随和发展。经过数年观察和思考,Jim认识到Linux可以支持更广泛和更新的硬件、更多的I/O设备、更多和更加标准的应用,它可能是未来嵌入式操作系统的最适合的选择,Jim决定创办一家专业的嵌入式Linux公司,公司的定位是一个100%的Linux公司,它的嵌入式Linux产品可以替代传统的RTOS。
图3-6很清楚地展现出了MontaVista Linux产品发展的历程。
图3-6 MontaVista的发展历程
HardHat Linux
2002年以前,MontaVista的Linux产品名叫HardHat Linux(这个名字也最早在开源社区和大学里面流传),HardHat名字的由来也许是为了要区别于市场的名气已经非常大的RedHat,表示MontaVista的Linux是一个实时和嵌入式的Linux,如图3-7所示的著名的HardHad和MontaVista Linux的LOGO,企鹅头顶的工人帽表示是硬帽子。因为公司创建初期正值网络经济的热潮,MontaVista最初的商业模式和其他的开源软件一样,是一个免费的软件,但服务和升级需要收费。2002年以后,从MontaVista Linux 2.0开始就改为Linux行业里面广泛采用的订阅模式,即付费获得产品,在订阅期内得到支持、升级和补丁。
图3-7 著名的HardHad和MontaVista Linux的LOGO
MontaVista Linux的3个版本
MontaVista Linux有3个版本:
Professional edition,称为专业版本(简称Pro),主要是针对各种通用的嵌入式应用,它也是MontaVista Linux的核心产品,其他的版本也是由这个版本发展出来的。
Carried grade edition(简称CGE),也称为电信等级Linux版本,此版本是在专业版本的基础上增加了加固内核、事故处理、动态加载等高可能性的特点,符合OSDL电信Linux规范(也称为CGL规范,来自www.osdl.org,这个机构最近和Linux基金会合并),CGE支持先进的ATCA计算平台等硬件技术。
Mobilinux是MontaVista重要的旗舰产品之一,2003年MontaVista在专业版本上开发了一个称为消费电子(consumer electronic edition,CEE)的版本,CEE由于Motorola基于Linux操作系统的智能手机而闻名海外。2005年底,CEE再作重新开发并变名为Mobilinux,专门针对手机市场。比起以前的版本,Mobilinux增加了可以大大降低手持设备能源消耗的动态电源管理、Linux系统快速启动、尺寸优化技术和各种测量和分析工具。
在2001年以后的6年时间中,MontaVista Linux有两个重要的发展阶段:第一,内核的进化,4.0版本以前MontaVista Linux一直使用2.4版本的开源内核,如3.1版本使用的是2.4.20,4.0版本之后,MontaVista Linux使用了目前流行的2.6版本的内核技术。第二,工具的进化,HardHat Linux的工具是传统Linux命令行,3.0版本以后MontaVista Linux增加了集成的开发环境(IDE),使用的是KDE,3.1版本之后升级成Eclipse,这是目前功能最完善的集成开发环境。
MontaVista Linux实时性
MontaVista一直坚持在开放和兼容社区内核发展的前提下,发展和开发Linux的实时性技术,并把它应用在MontaVista Linux产品里面。比如MontaVista Linux 2.1版本已经实现了Preemptible kernel和Realtime scheduler,从而根本改变了传统Linux进程和线程不能被抢占,而且还是按照优先级调度的历史。发布3.1版本的时候,MontaVista把当时还在开发中的2.6内核当中的0(1)调度器和高分辨率定时器移植到2.4内核的MontaVista Linux 3.1的3个版本中,让使用Linux进行嵌入式软件开发的用户最早使用到最先进的Linux实时性技术,同时为今后升级到2.6内核做好了完全兼容的准备。2005年,MontaVista在开发2.6内核的4.0版本的初期,在开源社区创建了一个实时Linux项目,通过和社区协作开发MontaVista Linux,MontaVista在4.0产品里实现了Linux 2.6内核的RT-Path技术。MontaVista的技术专家来自传统的嵌入式领域,对实时技术和要求非常了解,MontaVista坚信基于开源Linux的实时性可以满足嵌入式系统的实时性需求,过去的实践也不断地证明了这一点。
MontaVista Linux professional 5.0
MontaVista Linux professional 5.0(简称Pro 5.0)是5.0家族的第一个产品,2007年2月开始有了Beta版本,4月陆续发布一部分嵌入式处理器参考平台的支持版本。Pro 5.0的发表标志着包含最新的Linux技术的新一代嵌入式软件平台的到来。Pro 5.0在目前Pro 4.0的基础上融合了先进Linux内核、应用和工具技术开发而成的。下面从4个方面分析一下Pro 5.0。
1. DevRocket 5
DevRocet 5是基于Eclipse的一个完整的嵌入式集成开发环境,它使用了最新的CDT扩展和管理技术,并有更加便捷的编辑-编译-远程调试的过程,更多的可插入的工具链。DevRocket 5还可以支持在没有目标硬件的情况下的虚拟开发环境。简单来讲,你可以把DevRocket理解为一个Eclipe框架下由一系列插件组成的软件工具,这个工具包括C/C++开发和远程调试(内核和用户态),应用和系统的跟踪,系统性能的分析,远程系统的管理,系统平台映像的管理,基于CVS的软件版本管理。区别于前面的版本,DevRocket 5以插件的形式增加了4个工具:检测内存泄漏工具;性能统计和分析工具;可以观测到整个系统内核和应用的存储器使用的工具;可视化的内核和用户态应用的跟踪工具。即通过Eclipe读取LLTng的trace文件图形化显示,区别于过去的DevRocket。新的版本可以让用户使用其他公司或者开源的Eclipe框架,把MontaVista的工具以插件形式安装上去,让用户可以体会到使用最新技术的快乐。原理上讲,在获得有效的授权之后,DevRocket 5 可以支持以前的4.0甚至3.1版本的MontaVista Linux的各个版本的产品。
2. 全新的内核和应用
Pro 5.0使用稳定和全新的2.6.18内核,LSB3.0兼容,安全特性,IPV6认证,内核和用户态的实时技术,包括支持Priority Queuing、Priority Inheritance、Robust Mutexs和新的HR Ktimers。I/O和网络方面支持更多设备驱动,如SDIO、USB OTG、Bluetooth(计划在Mobilinux 5.0里面)、802.11g WiFi,支持ARM Jazelle(ARM发布的Java硬件加速虚拟机优化技术,目的是为了提高Java应用的启动运行及反应速度)。Pro 5.0还包含了MontaVista以前在CEE3.1和Mobilinux 4里面使用的XIP技术,这是一个可以提高Linux系统引导速度的技术,也就是说Pro 5.0可以适合除手机外的所有消费电子的应用。
3. 减少尺寸的技术
在5.0版本里,MontaVista大大改进了尺寸优化技术,使用了先进的Linux Tiny,并可以支持NPTL、ARM EABI的Clibc,配合ARM Thumb mode使用ClibC后,应用尺寸可以减少近50%。这还只是应用部分,如果考虑到文件系统的优化,那就有可能减少70%~80%的尺寸。简单来讲,一个标准的Linux有大约14M,经过5.0版本(或者使用Mobilinux 4.1,它已经包含Clibc)完全优化后,可以到减至3M左右。
4. 完善的质量保证体系
目前Pro 5.0内核是在2.6.18 baseline上加了有大约1500个Patch(这个数量还在因为新的硬件的支持而不断增加),其中近30%~40%的Patch是有连带关系的,即如果你修改了一个Patch可能其他Patch也要修改。再细化一下,整个Pro 5.0的代码是由2.6.18内核代码、非主流内核代码(如ARM和MIPS分支代码)、RT patches、2.6.19对2.6.18的bug修正后向后移植(Backport)、MontaVista内部自身开发和修正的软件模块(一般每次发行要修改超过1000个bug)5个部分组成,然后每个build都要经过35 000个自动测试,很难想象这样一个巨大的软件工程竟然是靠几个Linux工程师就完成了。Pro 5.0这个大工程是在完善的质量保证体系下,集合了过去两年开发2.6内核和5年以上2.4内核的经验的结晶,更重要的是经过以千万计的、基于MontaVista Linux产品的验证,让Pro5.0产品有一个极好的质量基础。
嵌入式Linux技术的发展趋势
回顾了MontaVista Linux发展历程和分析了Pro 5.0的一些技术特点后,再综合目前市场上商业和开源的嵌入式Linux的现状,我们不难看出未来嵌入式Linux技术走向的轨迹。
1. Linux工具将大行其道
开源的Eclipes 框架已经成为事实上的企业软件和嵌入式软件开发标准,不仅得到了软件和系统厂商的推崇,而且也得到了设备厂商的支持和参与。最近Motorola宣布加入Eclipes基金会,参与一个设备软件开发平台(DSDP)项目,开发一个针对移动Linux的工具TmL,这也是Linux大行其道的一个很好的例证。基于Eclipes框架的嵌入式开发工具将是未来嵌入式Linux甚至其他嵌入式操作系统的主流和标准的开发平台,嵌入式Linux的工具目前和未来将主要针对Linux命令行工具进行改进和提升,开发新分析工具、配置工具、性能测试工具和调试工具。比如上面提到的MontaVista Devrocket5,支持和配合BDI2000的Linuxscope、Workbench和Timestorm。
另外,一个重要的促使Eclipe的Linux工具大行其道的非技术原因是,嵌入式软件比较其他行业的软件需要更好的工具去开发、调试和测试,而Eclipe的授权方式更加适合商业公司开发的工具以商业版税的方式进行销售和支持。
2. 嵌入式Linux软件平台走向应用
如同商业Linux服务器软件公司一样,嵌入式软件公司也已经意识到它们应该更多地在Linux内核上进行应用软件的开发,并在集成和测试上多下功夫,以满足用户对使用嵌入式Linux的产品尽快上市的要求。因此,对比微软Windows Mobile,嵌入式Linux具有竞争性优势,Linux软件中间件将越来越显现出不同公司产品的差异和价值。
MontaVista从4.0产品开始就已经有了一个非常清晰的中间层,即为应用软件提供接口,如图3-8所示。这个中间层包括了GTK/X11图形库,200多个用户态的应用模块,IPV6和IPsec/IKE,Web services networking utilities,WiFi的网络协议。在MontaVista面向应用的电信CGE和手机版本Mobilinux中已经涉及了应用的部分,比如Mobilinux 4.0里面的动态电源管理就增加了支持和方便应用的策略管理,DirectFB适合快速图形应用的图形库和上文提到的小尺寸应用库ClibC,Pro 5.0以及Mobilinux 5.0都将增加对WiFi安全和管理的支持,Mobilinux 5.0还计划支持完整的蓝牙协议和应用。虽然这些模块底层的驱动在内核中,但是已经有相当多的模块在应用层了。
图3-8 MontaVista Linux中的中间层
当然,无论是Pro、Mobilinux,还是CGE,都还不能称为一个完整的 Linux应用平台,虽然可以说它们比起SUSE和RedHat已经更接近普通的嵌入式和电信的嵌入式Linux应用,但是距离消费电子如手机应用,还有相当大的距离。目前,商业公司、开源社区和行业组织都一直在做更多的努力,比如Trolltech、Access和LiPs。今天在智能手机中占据领导地位的Android操作系统将是一个更加完整的、基于Linux的应用软件。
Android最初由Andy Rubin开发,起初主要支持手机。2005年,它被Google收购并注资,组建开放手机联盟,经过开发和改进,逐渐扩展到平板电脑及其他领域上。Android是开源系统,直到2009年才对外发布Android 1.5,代号Cupcake(纸杯蛋糕)。Android发展到2011年,历经6年,发展了近10个版本。
3. 嵌入式Linux向着靠近标准和开放的方向迈进
更多的信息表明,嵌入式Linux正在向一个标准的方向迈进,尤其是内核方面,比如Pro、CGE、Mobilinux 4.0使用标准2.6内核的RT-patch,实现了Linux宿主机的实时性要求,Pro 5.0支持LSB 3.0。在电信方面Linux有OSDL CGL标准,消费电子有CELF以及最近的LiMo,一个由Motorola创建的手机Linux 标准平台的组织创建的标准。MontaVista作为OSDL的创始成员,一直致力于跟踪和遵循CGL的规范,其产品也是唯一通过CGL认证的产品。在2007年的3GSM会议上,MontaVista也和LiMo保持密切的接触。更加重要的是嵌入式Linux开发不能也很难独立于Linux开源社区,只有积极参与社区项目,维护社区项目,创建好的适合嵌入式Linux社区项目才是正确的途径。比如MontaVista开发的Preemptable Kernel和Real-Time Schedule(Rober love)后来被移植和合并到2.6的(0)1 Schedule和Preemptable Kernel,成为2.6内核的标准。新的高分辨率的定时器(HRT)即Ktime项目,是由MontaVista维护的,也已经被2.6.18内核接受了,HRT将在Pro 5.0以后的各个产品里面包含并支持各种嵌入式处理器的硬件平台。
结语
Linux和嵌入式Linux软件在过去10多年中越来越普遍地被IT行业、半导体公司、嵌入式系统所认可,它已经成为一个可以替代微软的Windows和众多传统的RTOS的重要的操作系统。Linux内核和基本组件以及工具已经是成熟的软件,面向行业、应用和设备的嵌入式Linux工具软件和嵌入式Linux操作系统平台是未来发展的必然趋势。跟踪Linux社区的发展、符合标准、遵循开放是大势所趋、人心所向,嵌入式Linux也不例外。
Linux和Android:谁更适合你
我们前面深入讨论过Linux,现在越来越多的人在使用Android,Android的应用已经不仅仅出现在智能终端和电视上,它还扩大到整个嵌入式系统上了,Android方兴未艾。现在是否可以说传统的嵌入式Linux要退出市场了呢?本节给出了一个清晰的分析和结论。
如果你的下一个应用是部署在一个32位或64位处理器和TCP/IP网络的设备上,那么现在正是好时机,因为你一定已经在考虑选择Linux或者Android作为你的嵌入式操作系统。与原有实时操作系统和嵌入式内核相比较,无论是Android还是Linux都是成熟的企业/桌面/移动级操作系统。即使在专门的嵌入式和移动应用环境中,它们也都能运行现成的中间件和应用程序。虽然Android使用的是Linux 内核,但是这两个开源的操作系统从软件栈的底层到顶层的开发、集成和托管方式都不一样,而这些不同将决定如何以及在何处找到最好的部署方案。
本节整理出选择Android(小绿机器人,见图3-9)或Linux(矮胖企鹅见图3-10)时要考虑的决定因素。特别关注:为何在不同的使用场景下需要不同的开发方法?为何要选择使用这个操作系统而不是另外一个?为何有些应用程序只需使用一个操作系统,而有时候却同时需要这两个操作系统?
图3-9 小绿机器人(Android标识) 图3-10 矮胖企鹅(Linux标识)
开放还是封闭
绝大多数传统的嵌入式系统都是非常封闭的实体。即使选中的实时操作系统支持标准的API(典型的如POSIX线程和BSDlite网络的子集),但为这些嵌入式平台精心定制或托管在这些平台上的应用程序也都是高度定制的。相比之下,那些部署在智能手机、平板电脑和其他越来越多的现代智能设备上的软件已经更像桌面和服务器系统软件了。由于有了越来越多的现代智能设备,原始设备制造商(OEM)、运营商和终端用户已经可以在设备的整个使用过程中安装新应用程序包了。固件和系统软件也能在不依靠特殊的工作软件或工厂式翻修(RAN)程序的情况下完成升级。现在广泛流行的升级方式是OTA(空中下载技术)。
在创造一个智能手机操作系统时,谷歌将Android定位为一个开放的、现场可升级的应用程序平台,这个移动操作系统的核心思想是随时能够运行应用程序包。因此,为了创建、销售和部署打包应用程序,围绕着Android平台生态环境的优化首先是通过Google Play应用商店进行的。
嵌入式Linux系统也存在与Android应用程序平台同样的情况,但从实践的角度来看,它更适合一次性部署在封闭应用中。确实如此,Linux上的编程存在着更多被认可的编程方法,比如C、C++、Java、Ruby、Python和Lua等,但却不存在一个为构建、发布和安装应用程序的单一模型,也不存在一个跟Android一样的、支持互操作性的硬件抽象模型。相反,Linux存在着多种特定的方法(如包管理、apt-get等)和工作在不同内核体系架构树(Kernel Tree)中的最佳实践。
由于这些实际的原因,Linux更适合于封闭或半封闭的嵌入式应用程序。如果不需要广泛的互操作性,也不用考虑是否会破坏API和打包应用程序,原始设备制造商就可以从约束中解脱;这还能让他们从为设备的硬件和软件需求专门做定制和适配Linux的工作中解脱。若当一个生态系统围绕一个设备发生演变(比如发生在Raspberry Pi和Python上的故事),Linux也总能打破封闭的策略,就好像使用了Dalvik虚拟机一样,支持Java编程语言的Android更受到开发者欢迎。
有一点需要注意,不要把开放和封闭的问题与开源和不开源的问题混淆。Linux内核和GNU/Linux操作系统远比Android更开源。维护和升级Linux的社区是真正的精英管理的社区,它对各种来源的资源都开放。相比之下,Android是Google和它的*合作伙伴OHA可以发号施令和掌控平台发展路线图的私人俱乐部,它受到外界组织的影响最小。
你是想省点钱吗
与开放还是封闭有关的问题是资源丰富与否的问题。有一个极端资源不足的例子是只有一个网络接口的大块头的通信设备,而一个资源极度丰富的设计则需要一个显示器、键盘、定点设备或触摸屏、一个可靠的内存和存储器等部件。世界上最真实的设计则介于这两者之间。
鉴于Android在智能手机上积累的成功经验,Android适用于拥有丰富接口的消费电子类应用程序。在智能手机之外,Android协议栈支持手持和平板类型的配置,而且它正越来越多地被部署在DTV(数字电视)、机顶盒、IVI(车载信息娱乐)系统和其他用户界面密集型系统上。因此,没有很多令人信服的理由说服人们在无显示外设的系统上使用Android系统。
相反,Linux能够支持的硬件配置和外围设备范围非常广泛而且丰富,它还可以根据需要被裁剪为一个只拥有内存和Flash存储器的极度精简的系统。若没有几百MB甚至GB的DRAM或更多的Flash空间(对于操作系统和应用程序),就无法将Android部署在这样的系统之上的,但你可能只需要几十MB的存储空间就能部署一个简约型嵌入式Linux系统(天啊,我从未想到过我会认为Linux是那么的小!)。在为精简硬件配置挑选系统时,另一个不投票给Android的原因是:Android是CPU/GPU密集型的系统。
所以,如果你的设计是想通过部署一个低端CPU,不使用GPU,并且使用最小内存和存储器来达到降低成本的目的,那么Linux是一个最合适的选择。如果你有很多钱拿来“烧”—这些年,芯片的价格只要几美元了,但显示器和输入硬件则很可能需要数百和数千美元,那么这时候Android会更适合你。
本地显示还是远程显示
在考虑选择Android和Linux时,你的设备需要一个本地的还是远程的显示器是另一个决定因素。若你的设备需要一个近距离的、有人机交互的显示,那么拥有一个集成用户接口(UI)的Android是一个不错的选择。但如果用户主要是想在远程通过专用的智能手机和平板电脑浏览器或者应用程序(APP)来与设备交互,那么可以通过支持使用嵌入式Linux来托管Apache服务,或几个小Web服务器和服务器端的编程范例(PHP、Python等),以达到省掉Android系统的开销的目的。
当然,你可以根据需要同时配置Android和Linux来支持本地显示、网络接口或移动应用程序。这两个操作系统都支持丰富的用户接口,而且都很容易被部署为Web服务器。但现成的Android应用程序只能运行和显示在一个Android原生显示设备上,而使用GTK+或Qt创建的Linux原生应用则既支持一个本地显示器,也支持一个可用的远程服务器。
选择Java或C/C++,还是LAMP
Android或Linux,哪个是你熟悉的编程语言和框架呢?如果你的团队已经在一些其他环境中创建了Java应用程序,那么你很可能会希望可以利用这个专业知识去创造其他设备上的应用程序,Android就是合适的选择。但如果你的开发人员更熟悉C/C++、Lua、GTK+和QT类似的UI框架及无数的其他编程范式,那么强烈建议你选择Linux或LAMP(Linux+Apache/https+MySQL+PHP/Perl/Python)。
这个论点并非一成不变的,你也可以使用Android/Linux本地编程接口来创建你的嵌入式应用程序,但你可能会打破Android应用程序的互操作性和封装,并且不再拥有一个开放环境。还请记住,在选择某种语言和框架的同时往往还要考虑是本地显示还是远程显示。另外,也许更革命性的思想是当今开发人员能通晓多种编程语言,这样无论在Android还是在Linux上使用Java、C++或Web编程语言都会感到同样舒适。
考虑许可证问题
一系列非技术性,然而很复杂的许可证*,它们围绕着Linux和Android,以及为这两个操作系统而编写的应用程序和扩展系统而展开。许多原生设备制造商之所以采用Android是因为这个移动操作系统采用*许可条款:实际上Apache 2.0对于Android中间件及其应用程序的组件只是在底层Linux级别采用了通用公共许可证(GNU GPL),这个部分对原生设备制造商有披露代码的要求。Android中的*Apache许可证注明“OEM friendly”,除了内核部分, Android的协议栈使用了Apache和其他OSS许可证(见表3-1),这些许可证都不需要设备制造商披露修改和分发他们自己编写的硬件设备抽象层(HAL)的代码。实际情况稍微有些复杂,这在Black Duck的文章Android-Opportunity,Complexity and Abundance中有更详细的论述。
表3-1 各种Android和Linux栈层的许可证
Android Linux
内核(Linux for Both) GPL GPL
驱动程序 GPL GPL
HAL Apache N/A
C Library Berkeley软件发行 LGPL
中间件 Apache 各种OSS
应用程序 各种私有OSS 各种私有OSS
需要澄清的是,这个例子不是说Linux不好,这种组合许可证方式,可以很完美地在一台运行着Linux的设备上,隔离和保护用户开发专有代码。一些原生设备制造商不喜欢直接在任何GNU许可证(GPLv2/v3、LGPL等)下工作,这就导致他们选择了Android,而非Linux。当然,他们仍然需要部署Linux内核,但只运行其上的Android库和中间件,仅仅将它作为一个“缓冲器”,通常这样做会感到很舒服。
在这里,本文的目的只是为各种类型的智能设备提供选择Android还是Linux的一般指导方法。对于垂直应用程序(手机、医学和运输设备等)而言,这种分类本身并不能列出所有的可能性,本文仅仅能提供选择标准而已。
表3-2总结了本节表述的论点。它强调了选择不是绝对的:由于Android包含了一个Linux内核实例,Android系统理论上可以托管和运行与Linux一样的软件。Linux同样因为能托管和运行Java,以及一系列的用户接口(UI)框架,Linux也能被部署在有本地显示器的设备中,即使在与Android有密切关系的手机、平板电脑和其他设备上也可以运行Linux。
所以,你可以选择使用Android或Linux,或同时使用这两个操作系统。但需要先考虑以下5个问题:
1)在你的设备的整个寿命中,系统软件和应用程序是如何部署的?
2)你想将你的预算中的大部分花在哪些地方?
3)设备主要有哪些用户交互模式?
4)你的开发人员有哪些编程语言嗜好?
5)你选择的平台和许可证对你公司的知识产权(IP)组合有什么影响?
上述最后一个问题绝对是需要考虑的内容。然而,深度探讨知识产权和许可证已经超出了本节的范围了。
表3-2 Android和Linux的特点
Android Linux
打包好的App应用 ×
经常升级 ×
精益的物料清单 ×
高度定制 ×
本地显示 ×
远程显示 ×
Java ×
本地C/C++、Lua、Python等 ×
LAMP Stack ×
主流的、对OEM很友好的Apache 2.0授权 ×