Chapter1 第1章
认识嵌入式操作系统
操作系统和物联网是今天大众熟悉的二个专业技术词汇。人们拿起智能手机就想到绿色小机器人—谷歌的Android操作系统;使用电脑的时候就想到了Windows操作系统;当人们驾驶汽车时,使用ETC可以自动交费通过高速路的收费站;人们使用小米手环每天记录自己的运动步数,到了晚上,微信运动应用会自动将这些数据同步到云端,运动爱好者们在那里一决胜负。这些都是物联网应用。但是对于嵌入式系统和嵌入式操作系统的认识,人们的观点是不一致的。
什么是嵌入式系统
到底什么是嵌入式系统?什么又是嵌入式操作系统?这些概念不为大众所深入了解。既使我们这些专业人士对于嵌入式系统定义的理解也不尽相同,但概括起来,嵌入式系统的定义应该是这样两种:第一,嵌入式系统是专用的计算机系统,比如有这样的定义,以应用为中心,以计算机技术为基础,软件硬件可裁剪,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统;第二,嵌入式系统是软件和硬件的综合体,最经典的解释出自美国CMP Books出版的Embedded Systems Dictionary的中译本的定义,嵌入式系统是一种计算机硬件和软件的组合,也许还有机械装置或其他部件,用于实现一个特定功能。在某些情况下,嵌入式系统是一个大系统或产品的一部分,例如汽车中的防抱死制动系统。简练一点的定义还有IEEE的定义:嵌入式系统是软件和硬件的综合体,可以涵盖机电等附属装置。从以上的定义我们不难看出,嵌入式系统具备两个最显著的特点:一个是软硬结合;一个是计算功能。因此最近Intel和微软公司也把嵌入式系统称为智能系统,这样的说法也有其道理。
今天,嵌入式系统无处不在,从厨房里的电饭煲、冰箱,到我们每天使用的智能手机、智能手环和手表,它们都是嵌入式系统。还有我们驾驶的汽车和乘坐的高铁、飞机,里面含有许多嵌入式处理器和系统设备;保证我们互联网通信的网络中也有许多路由器、交换机和网关,它们都是嵌入式系统设备。
什么是嵌入式操作系统
每一个嵌入式系统至少有一个嵌入式微处理器(或微控制器和DSP),运行在这些嵌入式微处理器中的软件就称为嵌入式软件,也称为固件(firmware)。初期这些软件都不是很复杂。随着嵌入式微处理器和微控制器从8位发展到16位和32位,整个嵌入式计算机系统也变得越来越庞大和复杂,这就需要有一个操作系统对微处理器进行管理和提供应用编程接口(API)。于是,实时多任务内核(real-time kernel)在20世纪70年代末应运而生。进入20世纪80年代,嵌入式系统应用开始变得更加复杂,仅仅只有实时多任务内核的嵌入式操作系统已无法满足以通信设备为代表的嵌入式开发需求。最初的实时多任务内核开始发展成一个包括网络、文件、开发和调试环境的完整的实时多任务操作系统(称为RTOS)。到了20世纪90年代,嵌入式微处理器技术已经成熟,除了传统的x86处理器,以ARM7/9为代表的嵌入式处理器开始流行起来,这也让以Linux为代表的通用操作系统进入了嵌入式系统应用这个领域,一些针对资源受限硬件的Linux发行版本开始出现,也就是我们所说的嵌入式Linux。进入2000年以后,Android开始被广泛地应用在具有人机界面的嵌入式设备中。近来,物联网操作系统又以崭新的面貌进入了人们的视野。
所有可用于嵌入式系统的操作系统都可以称为嵌入式操作系统(国外称为Embedded Operating System或者Embedded OS,中文简称为嵌入式OS)。既然它是一个操作系统,那就必须具备操作系统的功能—任务(进程)、通信、调度和内存管理等内核功能,还需要具备内核之外的文件、网络、设备等服务能力。为了适应技术发展,嵌入式操作系统还应具备多核、虚拟化和安全的机制,以及完善的开发环境和生态系统。嵌入式OS必须能支持嵌入式系统特殊性的需求,如实时性、可靠性、可裁剪和固化(嵌入)等特点。这里不一一细说。
Labrosse和Noergaard在《Embedded Software》中的“Embedded Operating System”一章中对嵌入式操作系统有这样的描述:每一种嵌入式操作系统所包含的组件可能有所不同,但至少都要有一个内核,这个内核应具备操作系统的基本功能。嵌入式操作系统可以运行在任何移植好的CPU上,可以在设备驱动程序之上运行,也可以通过BSP(板支持软件包)来支持操作系统运行。
20世纪70年代末,嵌入式操作系统的商业产品开始在北美出现。进入20世纪90年代,嵌入式操作系统的数量呈井喷式增加,最鼎盛的时候有数百种之多,经过30多年的市场发展和淘汰,如今依然有数十种。但是,真正在市场上具有影响力并有一定的客户数量和成功的应用产品的嵌入式操作系统并不多,常见的有:eCos、C/OS-II和III、VxWorks、pSOS、Nucleus、ThreadX、Rtems、QNX、INTEGRITY、OSE、C Executive、CMX、SMX、emOS、Chrous、VRTX、RTX、FreeRTOS、LynxOS、ITRON、Symbian、RT-thread,以及Linux家族的各种版本,比如Clinux、Android和Meego等,还有微软家族的WinCE、Windows Embedded、Windows Mobile等。其中有些产品已经因为公司被收购而消失,比如pSOS、VRTX和Chrous等;还有的开源嵌入式操作系统因为缺少维护而逐渐被放弃,比如eCos和Meego等。关于这些操作系统的情况,本书后面的章节将会有更多的介绍。
嵌入式操作系统分类
通用的操作系统按照应用可分成桌面和服务器两种版本,近年随着智能终端(手机和平板电脑)的兴起,又增加了一个移动版本,而服务器版本随着云计算的发展,又出现了云操作系统这一“新贵”。但是,嵌入式操作系统分类却是一件很困难的事情。原因是什么呢?因为嵌入式系统没有一个标准的平台。从实时性角度看,嵌入式操作系统可分为硬实时和软实时,RTOS是硬实时操作系统,而Linux是软实时的操作系统;从商业模式看可分为开源和闭源(私有);从应用角度看可分为通用的嵌入式操作系统和专用的嵌入式操作系统。比如,VxWorks就是硬实时、私有和专用的操作系统,而嵌入式Linux就是软实时、开源和通用的嵌入式操作系统。Android是一个有趣的例子,它主要应用在智能手机和平板电脑中,不是一个典型的嵌入式操作系统。但是最近几年,它也开始广泛应用在消费电子产品中,比如智能电视、智能手表,甚至是工业电子应用中,这说明它正在逐渐变成为一个嵌入式操作系统。
从内核技术看,嵌入式操作系统有3种架构:单片(monolithic)、分层(layer)和微内核(microkernel)。单片架构是将设备驱动、中间件和内核功能模块集成在一起。单片架构的操作系统因为结构上很难裁剪和调试,后期发展成模块化单片架构,典型的单片架构的操作系统有C/OS-II和Linux等。分层架构是指操作系统分成不同级别的层,上层的功能依赖底层提供的服务。这种架构的好处是易于开发和维护,但是每层都有自己的API,所带来的附加开销会使操作系统的尺寸增加和性能降低,VRTX32是一个典型分层架构的嵌入式操作系统。模块化的进一步发展,最小内核功能压缩成只有存储和进程管理,设备驱动变成一个更小内核模块的操作系统,称为微内核操作系统。这个操作系统的附件模块因为可以动态地加载,使得系统的可伸缩和可调试性更强,独立的内存空间又使得系统的安全性更好,模块化的架构更容易移植到不同的处理器上。比较前面两种架构,微内核的操作系统的整体开销更大,性能和效率要低。目前商业的嵌入式操作系统多数都是微内核架构,比如CMX-RTX、VxWorks、Nucleus plus、QNX和VRTXsa。
嵌入式操作系统的应用
可以说,哪里有嵌入式的应用,哪里就有嵌入式操作系统的身影。今天的嵌入式应用已经无处不在,嵌入式操作系统更是随处可见。但是必须强调,嵌入式操作系统对于系统的处理器和其他资源均有一定要求和占用,商业嵌入式操作系统要收取一定的开发和使用费用,即使是开源的嵌入式操作系统,你在开发中也或许要向商业公司购买技术服务。这些都将是最终的电子产品的成本因素,如果你想降低成本,对于那些开发者不多且易于维护的简单应用,就可以选择不使用操作系统。哪些应用适合而且必须使用嵌入式操作系统呢?笔者根据自己20多年的实践经验,认为下面所列出的各项是市场上嵌入式操作系统应用的热点。
无线通信产品:比如手机、基站和无线交换机等无线通信设备大量使用嵌入式操作系统和中间件(通信协议等)。
网络产品:比如路由器、交换机、接入设备和信息安全产品等大量使用RTOS和开源的Linux。
智能家电:比如智能电视、IP机顶盒、智能冰箱等产品大量使用包括Android在内的嵌入式操作系统。
航空航天和军事装备:包括飞机、宇航器、舰船和武器装备等在内,都在使用经过认证的RTOS,这个领域也是嵌入式操作系统最早开发的市场之一。
汽车电子:现代汽车和运输工具大量使用嵌入式处理器技术,正在从采用私有的RTOS转向采用标准和开放的RTOS和通用的嵌入式操作系统技术。随着智能交通和车联网的发展,汽车电子将给嵌入式操作系统发展带来一个新的春天。
物联网应用:物联网和云计算是IT产业技术发展的两大推手,其中物联网的发展对嵌入式操作系统的需要和影响更大。物联网应用需要嵌入式操作系统来支持低功耗无线网络技术、物联网网关、物联网安全,以及动态的升级和维护功能。
第2章 Chapter2
嵌入式操作系统的历史
20世纪70年代末,嵌入式操作系统商业产品开始在北美出现,20世纪90年代末嵌入式OS的数量呈井喷式增加,最鼎盛的时候有数百种之多,即使经过30多年的发展和淘汰,现在嵌入式OS依然有数十种之多。最早的嵌入式操作系统是实时多任务操作系统(RTOS)内核,支持8位和16位微处理器,它初期使用汇编和PLM语言编程,后来支持C和Ada。本章讲述了RTOS发展历史中几个重要产品背后的故事。
VRTX:嵌入式操作系统的开拓者
最早出现的商业嵌入式操作系统当属VRTX,因其技术上的创新性,VRTX很快就得到了用户和嵌入式系统公司的广泛支持。VRTX可称为商业嵌入式操作系统的开拓者和领导者。
VRTX的历史
起初VRTX是Hunter & Ready公司的产品,该公司是由James(Jim)Ready和Colin Hunter在1980年创立的。VRTX是英文Versatile Real-Time Executive的缩写。VRTX最初支持Z8002、8086、8088和68000这些16位微处理器,原理上讲,VRTX可以运行在任何微处理器芯片上。VRTX并不要求客户一定购买源代码,使用C语言作为内核API接口,这在当时是颇具远见的。Jim提供给我的资料显示,Hunter & Ready最初的大客户是AMD公司和AMD生产的AMZ8000/8002(Zilog Z8000/8002)。VRTX/8002是一个多任务实时内核,使用事件驱动的调动方式,代码尺寸很小,而且可以扩展,这些特征奠定了之后很长一段时间实时多任务操作系统的技术基础。有关VRTX/8002,海外媒体在1981年12月21日以“基于PROM的OS为Z8002微处理器带来了实时控制功能”为题撰写了专文,详见“延伸阅读”。
Hunter & Ready后来更名为Ready Systems。在历史上VRTX有这样一些重要的贡献:在1987年成为最先实现了具有确定性内核机制的RTOS;在1989年发表了第一个RTOS仿真器VRTXdesigner;在1990年应用VRTX的MD-11 Honeywell飞行控制系统通过了美国联邦航空航天局的FAA认证。
1991年,Ready System开发了VRTX Velocity产品,它将VRTX与UNIX OS开发环境完美地整合在一起。VRTX Velocity支持以太网下载和调试,Velocity Rtscope支持VRTX内核交互调用的源代码调试器,Velocity支持UNIX标准的I/O和网络。UNIX OS在20世纪80~90年代是使用最广泛和最标准的通用操作系统。
1993年,Ready System与硅谷著名的嵌入式软件公司Microtec Research合并,在已经是工业界广泛认可的RTOS标准-VRTX32基础上开发了VRTXmc和VRTXsa两个新的RTOS内核,并结合Microtec著名的调试软件XRAY,开发了VRTX集成开发环境Spectra。1995年,EDA公司Mentor Graphic收购了Microtec Research,在收购之后的7、8年间,VRTX得到了持续发展,比如前面提到的借助Menotor在EDA方面的优势,VRTX支持SoC芯片的集成和软硬件协调开发,这在当时是颇具前瞻性的投资。2002年,Mentor Graphic 收购了另外一个嵌入式OS公司(Accelerated Technology)之后,转向开放源代码的嵌入式OS(Nucleus),VRTX就逐渐被放弃了。因为不断被收购,VRTX市场在20世纪90年代末被pSOS和VxWorks等产品替代。VRTX的创始人Jim Ready也在1999年离开Mentor Graphic,创立了专注于嵌入式Linux的MontaVista Software公司,这在后面有关开源嵌入式OS的章节中会有更多叙述。
VRTX的产品家族
VRTX 1.0版本是在1981年发布的,经历2.0、3.0版本之后,于1987年发表了世界上首个具有确定性调度机制的RTOS—VRTX32。VRTX32最初是针对68K和80x86 CPU设计的,这也是工业界RTOS之中最早应用在机载电子设备中,并通过FAA认证的产品。它是错误报告最少、应用最广泛的RTOS内核之一。1992年新产品Spectra集成开发环境和VRTXsa 问世,VRTXsa是基于超微内核(Nanokernal)的新一代RTOS,sa意味着具备可以伸缩的RTOS架构,可以支持更大规模的嵌入式系统应用。1994年VRTXmc发布,mc是Micro-Controller(微控制器)的缩写,也有支持SoC芯片的含义,它占用最少的RAM和ROM空间。VRTXmc除了继续支持68K 系列CPU外,还支持Motorola M "CORE和ARM SoC。不同于VRTX32和VRTXsa,VRTXmc采用按产品系列一次性授权的模式,更加适合产量大的消费电子产品使用。
VRTX的应用
作为最早的商业嵌入式OS,VRTX有大量引以为傲的成功应用,比如F14、MD-11、A320、A330、A340飞机、法国TGV火车、Motorola手机、三星通信交换设备、医疗生命保障系统、心脏监视系统、机顶盒等。据1999年的资料记载,当时已经有超过5万用户在使用VRTX相关产品。
VRTX在中国
VRTX于1993年前后进入中国,与竞争对手相比起步是比较早的。之后Integrated Systems(产品是pSOS和pSOS+)和Windriver(风河公司,产品是VxWorks)分别在1997年和1998年通过代理商进入中国市场。VRTX对中国高校的嵌入式OS研究和教学发展有一定的贡献,1996年与成都电子科大合作建立嵌入式软件设计中心(CESD),为中国用户提供学习课程和培训。为此Microtec免费提供了可以支持4种嵌入式微处理器的嵌入式OS开发工具,Intel公司也为实验室提供了嵌入式386EX开发系统。Microtec之后还在清华大学与Motorola合作建立了嵌入式软件设计中心。VRTX在航空和工业控制领域凭借国外的市场优势及产品技术优势,较早得到了中国用户的认可,其用户有华为技术(通信电源)、三菱电梯、南瑞、许继、华控等公司。成都、上海、西安等地的航空电子设备研究所都使用过VRTX。在通信领域,VRTX与pSOS竞争激烈,但VRTX还是获得了包括上海贝尔(现在的上海阿尔卡特)、华光科技、巨龙、金鹏、大唐、重庆邮电设备厂和北邮泰康等著名的通信公司的青睐,它们使用VRTX开发了数字程控交换机、SDH传输设备和新一代宽带接入等通信产品。2013年我在深圳遇到过长园深瑞(原深圳南瑞)的罗工程师,与他交流都江堰嵌入式OS的时候,他还回忆起当年在华为技术使用VRTX开发通信电源产品的情景,可见VRTX对中国老一代工程师的巨大影响力。如今VRTX作为RTOS开发平台已经消失,但它或许还会长期嵌入在某些电子设备之中。所幸,它的技术和思想已经深深影响了一批嵌入式软件开发者,比如国外的VxWorks和国内由成都电子科大参与开发的Delta OS。
延伸阅读
VRTX/8002操作系统为Z8002 16位微处理器带来了完整的多任务和实时控制功能,通过将“内核”功能转移到芯片上,操作系统可以在不损失可定制性的基础上简化嵌入式微处理器的开发,这是嵌入式实时操作系统最初的形态。
VRTX/8002嵌入式微处理器多任务实时执行系统
VRTX/8002(Versatile Real-Time Executive of Embedded Microprocessor,嵌入式微处理器多任务实时执行系统)由专注于8/16位微处理器软件开发的Hunter and Ready公司提供,其硬件固化在一对型号为2716的EPROM中。当时的Hunter and Ready公司市场营销副总裁Jim Ready解释说,和一般的用户端可编程计算机不同,嵌入式计算机在接受大量任务时需要同时满足实时响应和并行处理两种需求。
VRTX将这些机制整合到了芯片上,让开发者不必在新的计算机设计上重新实现和修改这些机制。
VRTX只使用一个组件
VRTX相当于用一个简单的组件代替了软件的随机逻辑单元,就像用微处理器取代了随机逻辑硬件一样。VRTX位于系统内存空间中。
接下来,RAM或者PROM中会加入一个配置表,将VRTX和除CPU、内存以外的系统硬件连接起来。然后用户就可以使用VRTX的系统调用编写任务了。
设计者可以专注于为应用程序添加价值,而不是和系统软件打交道,这样费时费力,而且有风险。“VRTX只是系统的一个组件。”
双芯片设计提供基于中断的任务调度、任务间通信和同步、动态内存分配、实时时钟支持、字符I/O和快速响应。如此广泛的基础机制只需要一个CPU和内存的最小配置即可使用。
控制最多256个任务
尽管VRTX可以控制最多256个任务,支持至多256个优先级,但它是独立于开发系统和配置语言的,不需要时钟,而且不对中断的结构做出任何假设。
VRTX通过用户提供的配置表(ROM或者PROM中14个两字节内存字)和环境相连接。因为操作系统并不是一个需要系统生成软件或者配置语言的模块的集合,Ready认为用户在配置表中完全可以指定需要的全部参数。
当设计者增加系统调用时,可能会需要更多内存字。VRTX中一个新的程序状态区域为增加中断处理程序提供了方法。
VRTX/8002只需要任意4KB内存,它的重要功能如下(见图2-1):
1)提供任务通信和同步机制,不需要邮箱、信号量、信息头和交换。
2)支持256个任务和优先级。
3)基于优先级的调度,可以支持在同一个优先级下,按时间片进行调度。
4)128个用户定义的系统调用。
5)提供逻辑上高于中断–服务例程的位置服务。
6)支持实时时钟和至少一个基于字符的I/O设备。
7)同时支持静态和动态内存块分块。
8)支持将内存分为最多4个65KB的地址空间,或者完全不进行地址空间分割。
图2-1 基于PROM的VRTX
Hunter和Ready同时提供C语言编写的库与VRTX进行交互,以及Z8002芯片级别的支持软件包。VRTX/8002价格是200美元(100个级别批量购买)和2000美元(非批量购买),以上包括授权和支持。
嵌入式操作系统的“摩托”系
摩托罗拉在嵌入式系统的地位举足轻重,其微处理器、单片机和计算机系统是当时行业的标准,很多开发嵌入式操作系统的公司都是借助摩托罗拉的市场而起家的。
这里说的“摩托”是指摩托罗拉公司(Motorola),它是美国著名的通信和芯片设计制造公司,成立于1928年。作为一家老牌通信巨头,摩托罗拉在通信业的地位毋庸置疑。从摩托罗拉发明第一款手机开始,摩托罗拉见证了迄今为止整个手机的发展史。许多人很熟悉摩托罗拉手机,但对于摩托罗拉公司芯片和计算机部(简称MCG)的业务了解不多。2003年,摩托罗拉将半导体业务分离出来成立了飞思卡尔(Freescale)公司,并独立上市,继续摩托罗拉以前的通信、汽车电子和通用嵌入式处理器和MCU芯片设计业务。2007年,摩托罗拉的另外一部分与嵌入式相关的业务—MCG则以3.5亿美元出售给艾默生公司。2011年,摩托罗拉自己的核心业务—手机也被互联网巨头谷歌公司以125亿美元收购。2015年3月2日,恩智浦(NXP)半导体斥资112亿美元收购了飞思卡尔,继承了摩托罗拉半导体技术和产品的飞思卡尔公司在2015年12月完全与NXP 合并了,飞思卡尔公司的名字从此消失。这里将讲述与摩托罗拉嵌入式芯片和计算机密切相关的嵌入式操作系统发展中的一些有趣的事情。
靠摩托罗拉起家的OS-9
摩托罗拉自1974年发布第一款MC6800–8位微处理器到1979年发布MC68000(简称68K)16/32位CPU之后,其芯片因为既可以使用在计算机系统中,也可以使用在嵌入式系统中,很快成为当时行业的标准。最早开发嵌入式OS的公司,许多都是借助摩托罗拉的市场起家的,比如VRTX(Reday System公司的产品,后被Microtec Research公司收购)、pSOS(ISI公司产品,后被Windriver公司收购)、LynxOS等。其中OS-9(Microware公司的产品)的经历值得特别说一说。
OS-9是一个实时的、基于进程的、多任务和多用户的操作系统,它很像UNIX的一个实时版本(使用类似技术的嵌入式OS还有LynxOS和QNX等)。OS-9的开发始于20世纪80年代初,最初是支持MC6809微处理器一个称为BASIC09的项目,后来随着MC6809支持64KB存储器扩展到2MB,OS-9组件逐渐丰富起来,比如GUI,这使得它不仅可以使用在摩托罗拉的寻呼机上(见图2-2),还可以应用在早期的个人电脑上,比如TRS-80 Color Computer(俗称CoCo),如图2-3所示。这样的OS和图形技术在当时还是非常领先的。
图2-2 摩托罗拉寻呼机 图2-3 CoCo计算机
OS-9在20世纪80年代初开始支持68K,20世纪80年代后期重新改写成方便移植的内核(基于C代码),该内核可以广泛支持x86、PPC、68K、MIPS和ARM。
OS-9内核在结构上很有特色,非常类似微内核模式,但效率却很高,也不是单片结构,架构更加安全可靠。OS-9的内核、文件、驱动和应用都是一个单独的逻辑存储模块。每个模块有自己单独的头、数据/代码和CRC。这样,这些逻辑模块很容易在保证高可靠性基础上动态地创建和维护。
OS-9支持POSIX的线程和API,因为具备实时性和UNIX应用兼容性这两个特点,OS-9在支持摩托罗拉VME和CPCI总线的工业计算机方面更具有特色。
2001年,北美的一家工业计算机公司Radisys 收购了Microware,Radisys希望提供一站式的解决方案,比如提供与Intel合作的网络处理器IXP1200的解决方案等。但是因为没有长期的发展策略和资金支持,OS-9的发展和技术服务在后期基本处于停滞状态。2013年,3家Microware经销商从Radisys手里购买了OS-9的资产,成立了Microware LP,继续为OS-9用户提供技术支持和服务。
提供完整方案的飞思卡尔
2003年,飞思卡尔从摩托罗拉独立出来之后,一直致力于提供一站式解决方案。飞思卡尔不仅继续加大力量与著名的嵌入式OS公司合作,比如MontaVista的嵌入式Linux和风河公司的VxWorks RTOS,还自己投入人力、物力成立软件研发中心,专门负责开源Linux在PowerPC芯片上的移植和优化工作。2004年,飞思卡尔在通信基站上大量使用的StarCore DSP芯片上推出了免费SmartDSP OS软件套件,套件内包含了CodeWarrior IDE(该工具产品在若干年后也被飞思卡尔收购)。今天,许多用户都会在使用飞思卡尔MCU的时候,看到或者用到一个MQX的RTOS,它原来是Precise软件技术公司1989年开发的一款RTOS。与OS-9的技术路线不同,它是一款微内核的RTOS,具备多任务可抢占特性,经过裁剪可配置为低至6KB的ROM,除了内核外还有文件、TCP/IP和USB模块等组件,支持68K、Coldfire、PPC、ARM等CPU。MQX以率先采用开放源代码和免版税商业模式在业内著名。2000年,MQX被ARC公司收购(ARC是一家销售可配置处理器核的公司)。2009年,飞思卡尔收购了MQX,并在官方网站上提供、开放了其源代码,使其成为开源RTOS,允许用户可以在基于飞思卡尔的芯片上免费使用这个软件。MQX的应用主要是面向智能电子系统。今天,用户在购买飞思卡尔半导体的MCU开发板的时候,将可以免费获得包括已经优化好的MQX RTOS和CodeWorrios的IDE开发工具。这不仅有助于降低研发和生产的成本,还加快了产品上市的时间,对用户来说是极大的福音。
C/OS的故事
μC/OS也叫MicroC/OS,它是在国内外具有广泛影响力的RTOS之一,这主要得益于作者Jean Labrosse 的几本介绍μC/OS原理和使用的中文版图书在国内广为流传。与其他商业RTOS不同的是,μC/OS内核的源代码是开源的,对于非商业客户(比如大学老师和学生)也是免费的。至今已有数十本以μC/OS命名的中文版图书出版,数百所学校院系和专业开设的嵌入式系统相关课程使用μC/OS作为嵌入式OS 案例,数千篇研究μC/OS相关技术的论文发表。
C/OS的故事起始于1989年。那时,Jean Labrosse先生加入了位于美国佛罗里达州劳德代尔堡市的Dynalco控制公司,并开始为大型工业往复式发动机设计全新的、基于微控制器的点火控制系统。由于有实时内核的使用经验,Jean相信使用操作系统可以强力地推动该项目以及Dynalco公司其他在研项目的进展。对于该点火控制系统而言,进入市场的时间至关重要,并且,实时内核的使用能够帮助Jean实现既定目标。Jean也知道,将来还要为这款产品增加一些新的功能,而使用可抢占式的操作系统将允许在不破坏系统响应特性的情况下进行这些升级。最初Jean考虑使用的内核是一个过去用过且很熟悉的内核。不过,该内核非常昂贵,而经费却不是很充足。备选的是一个过去没有用过的内核,其价格只有最初选择内核的1/5。最终,考虑节省经费的因素,Jean选择使用他不熟悉的那个操作系统。然而,他很快意识到他需要为这个看起来更便宜的操作系统付出更多的时间。在拿到内核后的两个月,Jean不停地联系对方的技术支持人员,徒劳无益地做各种尝试,想知道为什么连一个最简单的应用程序都运行不起来。这个操作系统说是用C语言写的,却要求用汇编语言初始化所有的内核变量。后来发现,Jean是最先购买这个操作系统的那批用户,在不知情的情况下充当了这个操作系统的试用版测试员。
实在是受够了。Jean转而使用最初放弃的那个较昂贵的操作系统。眼看项目要延期,钱就不再是问题了。不到两天,简单的应用程序就运行起来了,这在之前那个便宜的操作系统上好像是不可能做到的事。内核相关的问题似乎解决了。然而,很快Jean发现自己又进入了另外一个僵局。有一天,一个工程师向他汇报这个新的操作系统好像有毛病(bug),从此,一系列的问题就开始了。Jean很快把这个工程师发现的问题转发给软件厂商,暗想他们会对此感兴趣。但是,没有收到他们修正bug的保证,取而代之的是,Jean接到通知说:90天的担保期已过,除非支付给他们一笔维护费,否则,他们不会修正这个bug。对Jean来说这种要求简直是不可理喻。按照软件厂商的要求支付了这笔维护费用。想不到的是,软件厂商竟然花6个月才去掉了这个bug。最终,在拿到第二个操作系统的一年以后,才利用该操作系统完成了项目的点火控制系统。很明显,项目需要一个更好的解决方案。
经历两次失望之后,Jean开始开发自己的内核。起初他想得很简单,认为一个内核真正需要做的事情就是保存和恢复CPU寄存器,写一个内核应当不是一件很有挑战性的事情。大约花了一年时间,果真写完了第一个操作系统C/OS。也正是由于有了新操作系统在手,开发多任务应用程序就如鱼得水了。该操作系统主要由一个C文件构成,一个应用中允许创建多达64个任务。每个任务有独一无二的优先级。每次调用任务调度器时,CPU总是运行处于就绪态的优先级最高的任务。C/OS是可抢占内核,在任意时刻都可以发生任务调度。高效的任务调度实际上只是C/OS提供的众多服务之一。此外,该操作系统还会提供任务间通信(通过消息队列和邮箱)及任务间同步(通过信号量)相关的服务。C/OS所有元素的设计都考虑了高可靠性和简便易用。
在Jean Labrosse的职业生涯中,他自始自终都很注重代码的一致性和文档说明。从1984年开始,他就使用规范的代码标准,C/OS代码的一致性可以很好地证明这一点。在Dynalco工作时,Jean创造并推广了一套严格的代码编写规范,C/OS就是根据这套规范设计的。C/OS源代码的特点包括:大量的空行、字斟句酌的注释和统一的命名。C/OS内核还具有极好的可移植性,这也进一步证实了这种严谨的代码编写规范的优势所在。虽然C/OS跟它的先驱者一样也有少量与处理器相关的函数,但是,这些函数代码与操作系统中的其他代码很清楚地分开了。工程师们能够非常简单地把C/OS移植到一个新的CPU架构上。
为了把新软件介绍给其他人,Jean写了一篇很长的文章,详细解释了C/OS的内部工作原理。因为有太多内容要介绍,最终文章长达70页。Jean把文章投给《C语言用户日记》(C User抯 Journal),被拒了,原因有二:一是文章太长;二是文章主题不够新。该杂志已经出版了多篇关于内核的文章,而这只是又一篇关于实时内核的文章。但Jean坚信文章是独一无二的,他又把它投给《嵌入式系统编程》(Embedded Systems Programming)。该杂志编辑的答复和《C语言用户日记》一样,《嵌入式系统编程》分两部分连载了经过删减的Jean的文章。发表的两部分文章反响强烈,工程师们非常高兴地看到,高质量内核的内部工作原理被揭露出来了,他们争相下载C/OS的源代码。另一方面,内核厂商则对该文章的发表非常不安。实际上,那个廉价内核厂商尤其不安,竟声称Jean抄袭了他们的工作。试想一下,Jean怎么可能基于一个不能运行的软件来开发C/OS呢!
很快,令RTOS厂商更加不安的事情出现了。Jean的文章被《嵌入式系统编程》杂志刊登后不久,《C语言用户日记》的出版商R&D出版社主动联系Jean,表示想出版一本关于C/OS的图书。起初,这本书只是计划把Jean最早提交给《C语言用户日记》的材料打印出来。如果采用这种思路,这本书也就80页左右。为了充分利用这次机会,Jean计划写一本深入介绍C/OS的书籍。经R&D出版社同意,在接下来的几个月,Jean开始写作。到1992年的下半年,Jean Labrosse的第一本书《C/OS:The Real-Time Kernel》出版了(见图2-4)。最开始,这本书的售出速度并不令人满意,但R&D出版社每个月都会在《C语言用户日记》上给这本书做广告。与此同时,Jean Labrosse渐渐被大家认可,成为一个内核专家。1993年的春天,他接受邀请,参加了在乔治亚州亚特兰大市举办的嵌入式系统会议(ESC),为超过70位嵌入式爱好者讲述了操作系统的基本原理。在接下来的几年中,他一直参加ESC年会,每次都会给几百个工程师讲述MC/OS内核。逐渐大家对书的兴趣也提高了。过了最初缓慢发售阶段,《C/OS:The Real-Time Kernel》最终销量超过15 000本。
图2-4 《C/OS:The Real-Time Kernel》和书后附的1.1版软件
由于《C/OS:The Real-Time Kernel》写得很成功,在20世纪90年代,使用C/OS的工程师越来越多。开发者很容易就可以把操作系统移植到新的硬件平台上,开发无数基于C/OS的应用。虽然有少数C/OS用户只是在业余时间对C/OS修修改改,但更多工程师真正把该操作系统用在了复杂的和要求苛刻的商业项目上。而来自C/OS用户的评论和建议也帮助Jean不断完善着该操作系统。在最初几年内,他仅仅对C/OS做过一些很微小的改动。然而,当R&D出版社要求写C/OS的第二个版本时,他决定对操作系统和书做一次大的改进。升级后的操作系统就是C/OS-II。
如果快速浏览C/OS-II源文件,你可以发现该操作系统与C/OS不同。在C/OS中,所有与处理器无关的代码都包含在一个C文件中,而C/OS-II把它分成多个文件,每个文件对应操作系统中的一种服务。C/OS-II还提供了其前一版中没有的许多功能,包括栈检测功能、介入函数和安全的存储器动态分配法。为了将这个全新的操作系统的新功能交代清楚,书的页数几乎增加了一倍。正如新操作系统要有一个新的名字一样,这本新书也有一个新名字《MicroC/OS-II:The Real-Time Kernel》。(在新的书名中,用“Micro”替代了“”,这是因为书名中的这个希腊字符给很多零售商带来了麻烦。)《MicroC/OS-II:The Real-Time Kernel》一书于1998年出版。在这本新书中配有C/OS-II源代码。这一次,很快有数千名开发人员测试了这个新的内核,并反馈了很多宝贵意见。此外,对于那些不太熟悉内核的人来说,这本书全面并通俗易懂地讲述了操作系统的基本原理。很多大学教授开始意识到这本书对想学习内核的新手来说有着很大的吸引力,于是,他们开始围绕C/OS-II设计整套教学课程。很快,学习过C/OS-II内核的大学毕业生开始参加工作,并在他们的工作中继续使用C/OS-II。
当很多学生因为他写的书和很容易拿到的源代码而开始学习C/OS-II时,大量的工程师则是由于其可靠性而选择使用C/OS-II。2000年7月,一款嵌入C/OS-II的航空电子产品得到了DO-178B A级认证,这意味着这个操作系统的可靠性得到了权威认证。该认证受航空电子联合组织(FAA)认可,也只有那些被认为是足够安全、可用于航空器的软件才能得到该认证。直到今天,也只有很少几个操作系统成功地通过了该软件认证必须经历的苛刻测试。DO-178B认证只是C/OS-II取得的众多认证书中的一个,其他的认证书包括美国食品和药品管理局的上市前通知书(pre-market notification,510(k))、医疗设备的上市前许可证(pre-market approval)和针对工业控制的IEC-61508。符合这些标准对C/OS-II在工业领域中的应用是至关重要的。不过,这些认证对其他行业的工程师也有重要意义,因为这些认证表明C/OS-II具有可靠性高、文档完备和可缩短产品上市时间等优点,这对任何设计都是很有益的。
一直到20世纪90年代末,Jean Labrosse仍然全职在Dynalco公司工作,那时他仅用工作以外的时间做与C/OS-II有关的工作,但这很难跟上操作系统的发展要求。Jean认为回答每一个C/OS-II用户的问题是他的责任,但流入邮箱的信件却源源不断。既然已经不能再把操作系统作为一个业余项目来做,Jean决定创建自己的软件公司。1999年秋,Jean Labrosse的公司Micriμm正式成立。Micrim由两个词构成,即“Micro”(意思为微处理器或微控制器)和“ium”(意思为世界),因此,Micriμm的意思是(从软件的眼中看)微处理器世界。在成立Micrim公司前不久,Jean开始编写C/OS-II一书的第2版,该书于1999年11月出版,并配有新版本的内核。该操作系统增加了两个主要的功能:事件标志组和互斥型信号量。书中详细描述的这些新功能深受C/OS-II用户的欢迎。同样,这本书本身也非常受欢迎,《MicroC/OS-II:The Real-Time Kernel》的第2版很快就出现在众多嵌入式软件开发者的书架上。实际上,这本书是在嵌入式系统方面最畅销的一本书。
进入2000年以后,Micrim公司扩张了,一些工程师加入Micriμm公司。他们不仅把C/OS-II移植到一些新的硬件平台上,而且开发了大量的范例工程,写了很多应用笔记。2002年,Jean的一个老朋友Christian Legare加入Micrim公司,并成为公司副总裁。他有着丰富的管理和技术经验,这进一步促进了公司的快速发展。自从Christian加入Micrim公司后,公司就从一个只有一个产品的公司发展成一个有15个组合产品的公司。与此同时,为了满足C/OS-II用户不断发展的需求,C/OS-II还增加了一些新的功能,包括给操作系统增加各种各样新的API函数,以及把内核支持的最大任务数从64个扩展到255个。作为公司的总裁,Jean仍然专注于编写一流的内核代码,最近完成的是C/OS-III。经过无数小时小心翼翼地编程和测试才完成的C/OS-III是一个鲁棒性很好的操作系统,虽然它的根基是C/OS-II,但却是一个全新的内核。根据用户的反馈和长时间的经验积累,C/OS-III增加了几个重要的功能。
编写新软件的时候,Jean Labrosse对那些流行的、没有经过验证的技术的使用持高度谨慎的态度。虽然他喜欢跟踪高科技领域内的最新发展,但他认为,把关注点放在解决工程师的实际问题和提供一个可靠的、完整的内核,要比放在如何尽早跟上那些刚出现的发展趋势更加重要。这种哲学思想已经在C/OS发展中获得了相当大的成功。到今天,Micrim公司已经成为一个高度知名的嵌入式软件提供商。工业界调查报告一致显示,该操作系统是嵌入式领域中最为流行的操作系统之一。Jean的目标过去是、将来还会继续是为他在Dynalco公司时所面临的、现在数以百万计的嵌入式系统开发者还在继续面临的那一类问题提供有效的解决方案。
后记
我于2016年2月24日在纽伦堡嵌入式世界展与Jean Labrosse(图2-5左1)和Christian Legare(图2-5左3)见面和交流,Jean介绍了他们最新的C/OS for Maker计划,该计划允许年销售额少于10万美元或者投资额少于100万美元的商业公司可以免费使用包括C/OS-III Kernel、TCP/IP、USB device和Host,以及Modbus和文件在内的系统软件,据悉已经有几家中国企业开始签约该计划,祝愿他们的创业项目取得成功!
图2-5 2016年纽伦堡嵌入式世界展
风河—嵌入式操作系统的常青树
过去30年间,风河的VxWorks在嵌入式操作系统领域一直处于领先地位,在航空航天、通信、工业控制等行业有着广泛的应用,风河在业内被称为嵌入式操作系统的常青树。
风河公司(Wind River System)是一家专门从事嵌入式操作系统、软件开发工具、解决方案平台和服务的软件公司,由Jerry Fiddle和David Wilner于1981年在美国加州创立。VxWorks是风河公司推出的实时多任务操作系统。
VxWorks的历史
VxWorks最初的版本并不是一个全新的产品,而是在VRTS内核上增加了一些功能之后的一个产品。VRTX原本是Ready System公司的产品,它缺少一个简单的实时操作系统的文件系统模块和集成开发环境。VxWorks的创建帮助VRTX内核形成了一个完整的嵌入式操作系统及开发环境。风河的创始人David Wilner认为VxWorks的名称“VRTX Works”是一个双关语。之前,风河已经和Ready System公司达成协议,风河拥有销售VRTX的授权。但到了1987年,风河预感到VRTX的销售合同可能会终止,于是转去开发了自己的Wind内核。这个Wind内核是由当时只有17岁的加州大学伯克利分校的学生John Fogelin编写的,目标是替换VxWorks中的VRTX。20世纪80年代初的各种RTOS是用汇编语言书写的,而Wind内核是用C代码书写的,因为Wilner坚持认为微处理器性能会按照摩尔定律发展,C语言在性能上不会输给汇编语言。事实证明这个决策是正确的,C语言带给Wind内核很好的可移植性、标准的C库和兼容的API。1989年,风河正式发布了自己的嵌入式OS-VxWorks。
风河产品的特点
现在风河产品包含两个嵌入式OS平台:Linux和VxWorks;基于Eclips支持这两个平台的开发工具Workbench、On-Chip Debugging工具产品(即JTAG仿真器,该工具在2015年年初已经停止开发和销售了)、测试管理工具和工程服务。
VxWorks是由支持多核、32/64位嵌入式处理器、内存包含和内存管理的VxWorks 5.0和VxWorks 6.0、Workbench开发工具(包括多种C/C++编译器和调试器)、连接组件(USB、IPv4/v6、多种文件系统等)、先进的网络协议和图像多媒体等模块组成。除了通用平台外,VxWorks还包括支持工业、网络、医疗和消费电子等的特定平台产品。风河网络设备平台是其中最受欢迎的产品之一。如图2-6所示。
1995年,VxWorks 5.0 发布,风河推出一套称为Tornado的嵌入式OS开发环境,如图2-7所示。在多数用户眼里Tornado就是VxWorks,因为工程师每天的开发工作都是在Tornado上完成的(就像今天MCU开发中使用的Keil或者IAR EW开发工具一样),多数用户使用以太网作为连接开发主机和目标机(比如PowerPC、MIPS、ARM和x86)的通信方式,这非常方便且高效,类似今天的嵌入式Linux开发方式,当时Tornado是嵌入式OS领域最有影响力的开发环境。2004年,支持内存保护机制VxWorks 6.0发布之后,Workbench逐渐代替Tornada,成为可以支持WindRiver Linux、VxWorks和On-Chip Debugging的开发环境。
图2-6 风河网络设备平台
图2-7 风河Tornado开发环境和VxWorks
VxWorks的应用
风河公司的VxWorks以其高可靠性和优异的实时性被广泛应用在通信、军事、航空航天、工业控制等领域,比如在美国的F-16、FA-18战斗机、B-2 隐形轰炸机和爱国者导弹上都使用着VxWorks,最为著名的是1997年4月在火星表面登陆的火星探测器、2008年5月登陆的凤凰号,以及2012年8月登陆火星的好奇号火星车,如图2-8所示。
图2-8 2012年8月登陆火星的好奇号
风河的重要并购活动
在嵌入式软件行业,风河是一家历史悠久、产品线完整、资源充分的公司。风河公司在2009年被Intel收购之前已经在美国纳斯达克独立上市。根据风河的财报,2008年财年风河公司的销售额已经达到3.286亿美元,比2007年增加了15%。风河公司之所以能够在竞争激烈的嵌入式软件市场脱颖而出,除了其卓越的技术、产品和服务外,并购也起到了重要的作用。根据风河公司的官方资料,在2000年~2008年期间,风河共进行了10次并购活动。笔者观察到,其中技术和产品互补型的收购占大多数,比如2000年3月收购EST公司。EST(Embedded Support Tools)是美国马萨诸塞州的一家嵌入式开发工具公司,以提供Vision Probe/ICE JTAG仿真器和PowerPC开发板而著名,支持VxWorks和Tornado开发环境。此次收购让风河增加了硬件的低层开发能力和新的产品线,EST产品线目前已经整合到风河四大产品线之一的On-Chip Debugger产品线之中。2008年10月,风河收购MIZI Research是为了在嵌入式Linux智能手机OS上积累技术并提升在亚洲市场的服务能力。MIZI公司成立于1999年,是韩国一家专注于移动应用领域的嵌入式Linux企业,在智能手机、车载汽车信息系统和视频电话等方面有超过20个成功应用案例。而2000年风河收购美国ISI(Integrated System)公司却不是单纯技术和产品的互补了,市场因素才应该是这次并购的更重要原因。ISI也是一家老牌的嵌入式OS企业,它们的嵌入式OS-pSOS在行业中有着很高的知名度,市场占有率很大。风河的VxWorks在市场上与pSOS竞争非常激烈,这次收购帮助风河成为嵌入式OS名副其实的嵌入式软件巨头。对于这次收购的目的,当时有媒体直言不讳地提出质疑,质疑风河未来很有可能因为产品政策调整的原因,而让ISI的pSOS操作系统半途而废。事实上,在收购ISI公司5个月之后的芝加哥嵌入式系统会议上,风河的董事长Jerry Fiddler就上述质疑果真给出了明确表示:“在(收购)那一天结束的时候,你拥有的平台就只能是一个,否则你无法正常运行公司。”就这样,曾经声名显赫的pSOS从此消失不见了。
结语
2009年,Intel收购了风河,这让风河再一次走到了风口浪尖上。现在,风河是Intel全资拥有的子公司,这极大地改变了市场的结构。虽然这两家公司都宣布,“风河公司将继续开发支持多种硬件体系的创新商业级软件平台,以满足众多嵌入式系统用户和移动用户的需求。”然而,对这一点不少人心存疑虑。很多人担心风河的嵌入式OS针对ARM、MIPS或者Power PC等非Intel芯片,将来可能会被降低为二级版本。但是几年过去了,回头再看,这些曾经的顾虑显然都是多余的。收购风河给Intel在嵌入式市场带来了一些有利的资源,比如获得了一支极富经验的嵌入式OS研发和服务团队。虽然其他大的利好目前还不很明显,但风河在嵌入式OS道路上将继续稳定发展,这一点已毋庸置疑。
风河对于市场的把握有自己的独到之处,每次进入市场都是在最恰当的时间点。风河公司虽然进入开源的Linux市场较晚,但发展迅猛并最终击败竞争对手成为市场老大。在物联网操作系统领域,风河也不是物联网市场的领路者,在微软和ARM推出物联网操作系统产品之后,风河才开始逐渐调整自己的产品策略。2015年10月,风河发布了自己的物联网操作系统软件—Wind River Rocket,与ARM mbed一样,Wind River Rocket是一个免费的、支持MCU的实时操作系统,Wind River Rocket包括风河Helix App Cloud,形成了一整套解决方案。我们期待,作为嵌入式操作系统的常青树的风河公司,在新一波物联网大潮中能够再放异彩,续写辉煌。
嵌入式操作系统的红花绿叶
在众多嵌入式操作系统公司中有人尽皆知的著名企业,比如微软和风河,而更多的则是映衬在这些“大红花”周围的“绿叶公司”。其中许多都是小公司,甚至只是个人,他们大多都辛勤地默默耕耘着,为嵌入式操作系统的发展奉献自己的才能和智慧。
20世纪70年代末,嵌入式操作系统商业产品在美国和加拿大等国家出现,20世纪90年代末嵌入式OS的数量呈现井喷式增加,最鼎盛的时候有数百种之多,即使经过30多年的发展和淘汰,现在依然有数十种之多。
最早的RTOS公司不在硅谷
广为人知的嵌入式实时多任务操作系统公司比如风河(VxWorks)、ISI(pSOS)和Ready System(VRTX)都是从硅谷起家的。2015年5月底,我在纽约见到一位嵌入式系统的老前辈Bernard Mushinsky,如图2-9所示。通过他我才了解到,美国最早的RTOS公司不在硅谷。
图2-9 作者与Bernard Mushinsky 2015年在纽约的合影
Bernard创建的公司Industrial Programming Inc(IPI)成立于1969年,位于美国纽约。1976年开发出世界上第一个来自第三方独立软件公司的RTOS,产品是MTOS-68和MTOS-80。第二代产品是在1979年和1981年先后发布的MTOS-68K和MTOS-86。Bernard说,这些产品至今在某些设备中仍然还在使用。20世纪80年代中期之后的10年,MTOS升级支持Intel 32位的处理器,包括386/860。MTOS应用覆盖计算机外设、通信和工业控制等许多领域,有1000多个客户使用了MTOS产品,这在当时可谓是一件很了不起的事情。
即使在今天来看,MTOS的技术还是有独到之处的。第一代MTOS产品率先实现了同构多处理器的多任务、内存池的I/O驱动、邮箱中的事件标准和可协调(异步)的中断机制。
这里详细讨论一下MTOS处理器的技术。MTOS支持的是对称多处理架构(Symmetrical),没有主从(Master/Slave)之分,MTOS的任务不需要知道它(该任务)运行在哪个CPU上,开发者看到是一个虚拟的单CPU。30年前,半导体技术没有今天这样先进,还没有多核CPU。多CPU系统一般是一块单板计算机上有多个CPU,或者多块单板计算机通过总线构成一个多CPU的系统,典型的是Motorola公司的VME总线计算机系统。在外设支持方面,MTOS可以做到支持另外一个CPU板上的I/O设备,而且可以支持最多16个CPU。MTOS的任务可定义为本地任务(运行在一个CPU上)和全局任务(运行在所有的CPU上),MTOS还有一个Invariant Execution技术,它支持应用程序选择以同样的方式在一个CPU上或多个CPU上执行。MTOS多处理器技术与今天Linux对称多处理器(SMP)思想非常接近,可见其技术的先进性。
2015年5月我与Bernard是第一次见面,当他了解到我的经历,以及我与Jim Ready在20世纪90年代初就已经相识,并在之后15年间一起工作时,我们彼此之间的距离就拉近了许多。Bernard对Jim和他的VRTX非常尊敬,一再真诚地说VRTX市场做得好,非常成功,前一年硅谷的嵌入式系统大会上他还与Jim见面并进行交流。当听说我离开纽约后将到硅谷见到Jim时,他让我带去他的问候。
当我表示希望更多地了解MTOS技术时,Bernard非常高兴,他写了邮件向我推荐他们早期出版的一本图书《An Implementation Guide to Real-Time Programming (Yourdon Press computing series)》。Bernard还给了这本书在美国亚马逊网站上的链接,告诉我能买到旧书,如果不方便他可以帮我购买。我已经购买了一本,可惜的是邮寄的时间太久,没能在离开美国的时候带走,直到2015年9月下旬我才收到这本书。
Bernard已经年逾古稀,依然坚持工作,他当时在HCC工作,和夫人长期居住在纽约。HCC公司成立于2000年,由戴夫·休斯创立,总部在波兰的布达佩斯。HCC以提供世界上第一个经过认证的、便携式医疗应用的嵌入式DICOM协议栈而著名,主要产品是安全的文件系统软件和USB协议栈。临别前,我和Bernard约好,下次我再来纽约我们去一家中餐馆品尝地道的中国菜。遗憾的是,2015年8月中,也就是我回到北京两个月后,传来了Bernard去世的消息。我们痛失了一位优秀的老前辈,我和他的中餐之约再也无法实现了。
嵌入式OS的前辈—SMX
Micro digital公司创立于1997年,其产品SMX(simple multitasking executive)是一个嵌入式OS,也是一个RTOS。公司最初只是在嵌入式系统领域做工程应用和服务。SMX开发始于1987年,1989年第一版SMX发布,之后近20年,SMX逐渐丰富和完善,形成了包括内核、文件、网络、图形、USB和WiFi模块在内的一个比较完整的嵌入式OS。
Micro digital的创始人Ralph Moore是这个行业的前辈,他早期从事大型计算机的研究,后来自学编程成为微处理器的程序员,经过多年研究成功地开发出SMX。之后Ralph转入公司业务开发和销售,最近几年他潜心于v4版本的SMX多任务内核的设计和开发,最新版本的SMX内核已经在2014年1月正式发布。
我在2000年1月曾经访问过Micro digital,它位于美国南加州Costa Mesa,距离著名的Orange Country(橘郡)不远,旁边就是UC Irvine大学。我去的时候,见到了Ralph和他的儿子David,还有一个行政助理Betty。与Ralph的见面促成了我们之后的合作。昆明一家公司购买了SMX RTOS,运行在工业PC上,用于生产线自动化控制系统。除了这个客户之外,SMX这个产品没有找到更多机会在国内推广,但是SMX代理的GUI模块—PEG,我们在国内找到了一些用户。PEG既可以支持SMX,也可以独立运行,甚至可以在其他的RTOS上运行。我们把PEG移植到VRTX和PPC823平台上,还开发了中文字库,这样市场就容易推广了。
SMX有20多年的历史,上百个成功应用,最新版本SMX 4.2在内核性能提高、减少存储器使用、提高安全和可靠性、增加新的特性等方面有了很大的改变。SMX不是很有名气的RTOS,既无法与功能完整的QNX和微软Windows CE相比,也无法与小巧灵活的C/OS并论。SMX介于二者之间,既保持着嵌入式OS的实时性,又尽可能地放入更多的功能,以满足高性能嵌入式系统的需求。最难能可贵的是,SMX团队在嵌入式OS上坚持不懈的精神。
埋头苦干的ThreadX
ThreadX创始人Edward L. Lamie博士曾经是美国加州大学斯坦尼斯分校计算机科学系教授,从事计算机科学的教学和科研工作多年,有多本专著出版。其中《Real-Time Embedded Multithreading: Using ThreadX and ARM》已经被翻译成多种文字出版。Lamie的其他著作还包括《Pascal Programming》和《PL/1 Programming:a Structured,Disciplined Approach》。
讲到ThreadX和Lamie博士,还有一段小故事。据业界人士介绍,Lamie也是Nucleus RTOS(Accelerated Technology公司)的创始人。Nucleus从1.0版本发展到1.3版本后被Mentor收购,Mentor将Nucleus的版本修改为1.11后继续发展,而Lamie另立公司Express Logic,重新开发了一个ThreadX,最初版本是3.0,现在已经发展到了5.X。ThreadX和Nucleus虽然大体结构及大部分机制相似,但是Lamie 博士还是做了很多变化。据最新的报道,ThreadX已经嵌入超过15亿个设备中,其中包括大量的消费电子产品,比如HP打印机、多种3G手机芯片,以及近年来日趋增加的物联网设备。
ThreadX是提供源代码、一次性授权的嵌入式OS,与小型RTOS一样,ThreadX在技术上并无特别的新意。除了内核以外,ThreadX可以提供基本的嵌入式OS的中间件,包括FILEX、GUIX、NETX、USBX等,提供两种内核开发工具:TraceX和StackX,其他工具则要借助第三方,比如IAR和ARM KEIL了。Express Logical在市场上非常低调,如果注意一下ThreadX的公司网站和宣传资料可以发现,他们总是强调有多少设备使用了ThreadX,2007年的数字是4.5亿,到现在已经是15亿了,这与学者出身的Lamie博士严谨务实的作风不无关系。Express Logical位于加州San Diego,这里汇集了美国无线通信和医疗领域的高科技公司,著名的高通(Qualcom)公司总部就在San Diego,德州仪器、三星、Intel、摩托罗拉、松下等全球主流的高科技企业均在此地设有专门的无线通信研发机构,这使得ThreadX在无线通信领域有大量的应用。我在参观美国CES2014展览的时候,看到一款高通公司开发的智能手表Toq,据现场的人员介绍,它就是使用了ThreadX嵌入式OS,如图2-10所示。
图2-10 高通的智能手表Toq
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授权 ×