电子说
本文原作者写于5年前,期间可能有些技术的小变化,但作为对嵌入式Linux和QNX的入门了解还是不错的。
介绍
上个世纪90年代末期,Web设备被吹捧为下一个划时代的“大事件”,一种新型设备会产生一个新兴市场从而会产生下一代消费IT巨头。在拉斯维加斯的消费电子展上和QNX 2000国际技术会议上,大大小小的生产商展示了许多对未来的构想。
英特尔基于Linux构建了Web设备,微软的合作方基于一个阉割版的Windows CE开发Web设备。其他公司,比如3Com和Netpliance iOpener则是基于QNX。当时Web设备看起来很大可能是消费电子的未来。相比个人电脑,他们提供更少的功能。那个时候, Ken Kalinoski(Netpliance的发展副总裁)能想到的最好的方式是一个富客户端连接到一个专门的服务器上。百思买和沃尔玛货架上后面Web设备的减少说明消费者并不买账。他们不想要一个设备只能浏览网页和处理简单的邮件,但是不能处理文本或存储数据。并且,消费者也不喜欢被指定的服务供应商绑定。
Linux和QNX因为作为Web设备上的操作系统和巨大的平台开发能力声名鹊起。Linux过去作为服务器操作系统使用最多,而QNX主要用于工业级的嵌入式实时操作系统。为了挖掘新的市场,许多开发者开始开发Linux和QNX在更小,更便携式设备上的能力。
事后看来,Web设备是一个技术超前的想法。即使有软件和工程天才们生产这些设备,但是硬件和基础设施的局限性不能让Web设备满足一个电子必需品的功能,比如多功能性和便携性。移动电话和PDA技术的提高,数码摄像机的进步,更低电量的需求,内存的增长,嵌入式或移动CPU速度的巨大提升,以及802.11b和802.11g WIFI无线网络协议,这些所有的因素促使Web设备成为一个多功能设备。这个设备集合了电脑,办公软件,手机,摄像机(包括电影),传呼机,音乐播放器,当然也包括Web 浏览和邮件系统。这些所有的功能集成在一个可以放进口袋的无线设备上。
四年之后,我们处在一个新的“下一个大事件”的边缘。在已经具有庞大的PDA和Internet功能的手机市场上,硬件以及就地无线和服务基础设施的进步,对能够提供更多功能,更紧凑且电池寿命更长的设备产生了巨大的需求。这个重新激发了人们对嵌入式开发平台的兴趣,保证将来能在数十亿美元的市场中竞争。
设计相似之处就在这里结束。Linus Torvalds 使用宏内核架构设计了Linux作为一个通用的操作系统运行在个人电脑上。内核几乎包含了操作系统需要的所有功能。相反,QNX的设计则更加模块化和可扩展。QNX是一个基于微内核的实时操作系统,能足够小的嵌入到芯片提供运行工作站或大型网络服务器的能力。
Linux的嵌入式发展
由于Linux自身的健壮性,相对紧凑,通用,低成本和开源的license模式这些优点,嵌入式系统的设计者很长时间都在使用Linux。Linux可以让设计软件充分利用大量的开发人员,永远丰富的代码遗产和行业标准的便携式操作系统接口(POSIX)API。
标准的Linux内核没有嵌入式系统要求的实时能力(可预测的应答时间和毫秒级的延迟通常被认为是确定的事件)例如电传操纵,ABS制动系统,连续介质和医疗设备。但是,Linux可以直接用于不受确定性问题影响的消费类设备中。为了满足当前正在开发的嵌入式设备的需求,出现了几种Linux产品,可以满足更加可预测的速度和定时行为。
嵌入式系统中使用Linux
尽管一开始Linux设计是为了个人电脑使用,但是Linux也可以成为一个可靠的嵌入式操作系统。一个具有所有功能的Linux内核的缩小的Linux包,仅占用约1M的内存。纯的Linux内核(虚拟内存和所有核心操作系统功能)仅占用大约100K。加上网络栈和基本的使用,一个完整的Linux运行时大约占用500K内存。所需要的总的内存由运行的应用程序来运行,但是Linux系统仅需要256K ROM和512K RAM就可以工作。这对嵌入式市场来说是一个轻量级的操作系统。
使用开源的Linux系统另一个好处是,相比较传统的实时操作系统,Linux开发社区会更快的支持新的协议以及比实时操作系统供应商支持更多的设备驱动。
Linux操作系统的核心是一个相对简单的微内核架构。网络和文件系统以模块化的方式位于宏内核之上。驱动和其他功能可以编译进内核,也可以在运行时加载。这提供了一种高度模块化的构建块方法来构建定制的嵌入式系统,该方法通常使用定制驱动程序和应用程序的组合来提供附加功能。
为了避免重新发明轮子,嵌入式系统通常需要使用现成的程序和驱动程序构建通用功能。许多程序和驱动程序用于外围设备和应用程序。Linux可运行在大多数需要有大量外设的微处理器上,并且有大量的现场的应用。
Linux能够很好的适配嵌入式网络设备,因为它支持多处理器系统,拥有扩展性。这让设计者多了一个选项,可以在双处理器系统上运行一个实时的应用程序,从而提高总的处理能力。所以你可以在一个处理器上运行Linux,而同时在另一个处理器上运行GUI。
在嵌入式系统上运行Linux的一个缺陷是,Linux架构不能以一个标准的形式提供实时能力。比如标准的Linux是根据公平算法来进行任务调度,也就是给每个任务相同的处理器时间。解决方案是通过额外的实时变化修改Linux让它以确定的方式运行。
第一个解决方案是在内核空间增加额外的软件模块。加在操作系统实现调度策略,硬件中断和程序执行的部分。由于这些实时的软件模块运行在内核空间,操作系统由于代码错误崩溃会影响整个操作系统的可靠性。
第二个解决方案,如图1所示,以双内核的方式为实时任务提供实时环境。这种方式需要开发者开发新的驱动和系统服务,尽管对等的服务已经在标准的Linux内核中存在了。这种实时操作系统方案会延长加载时间并且增加操作系统占用的空间。
第三种方案是其他Linux生厂商重写部分代码来实现实时功能,比如调度来保证行为确定。
图1:拥有双标准和实时操作系统内核的Linux
嵌入式Linux的标准化
Linux有超过200多个的发行版本和很多嵌入式版本。由于嵌入式Linux要没有存在的标准,一个统一的平台规范让Linux的使用具有一个更经济,专注的环境,Linux几乎就是无用的。
为了保证嵌入式Linux版本的兼容性,嵌入式Linux联盟(ELC)成立了。ELC是一个非盈利性行业协会,致力于在整个嵌入式计算市场中改进,促进和标准化Linux。成员们为了享受标准化带来的好处,要参与管理、促进,实现和平台规范工作组。
ELC的使命是:“…..让Linux成为嵌入式系统开发者的首选“。Inder Singh博士,ELC的主席和Lynuxworks的CEO评价说:“Linux已经开算成长为消费类电子产品的操作系统的主要选择之一,越来越多的嵌入式软件使用Linux”。
Karen Chupka,消费电子协会活动和会议副总裁表明,“操作系统软件是消费类电子产品快速增长列表中一个关键的考虑点,Linux有望在2004年增长……”
现在超过75家公司加入了由索尼和松下成立的消费电子Linuxwilliam hill官网 ,来促进基于Linux的数字消费电子产品。2003年6月,一些其他的消费电子产品公司也加入了该william hill官网 。这些公司是EC, Hitachi, Royal Philips, Samsung, Sharp and Toshiba.
三个嵌入式Linux 版本
松下消费电子版本3.0
松下为它的消费电子设备引入了嵌入式Linux。松下“消费电子版本3.0”(CEE)是嵌入式操作系统。它的目标是手机,数字电视,机顶盒和汽车远程信息处理的应用程序。CEE设计用于高度受限的移动设备,这些设备的特点是低功耗,内存大小受限以及启动和恢复时间端。 据称它是第一个专门为消费电子市场设计的商业嵌入式Linux发行版。
CEE支持动态电量管理功能,文件系统加强和测量性能,系统时间,内存大小的工具,文件支持流媒体优化。
CEE的功能包括:
免税版的嵌入式Linux OS和开发环境
消费级别的可靠性
抢占式内核技术和实时调度
动态电源管理优化了电量使用,延长了电池寿命
内核快速启动时间
文件系统加强,包括对流媒体支持的优化
eXecute In Place(XIP)提供快速启动,待机和恢复功能
可扩展的内存占用空间可容纳各种消费类产品
“金标准”网络可实现高性能的互联应用
图形化的MontaVista系统测量工具可促进消费者级的性能调整
预集成Java*和图形开发以及运行时产品,可选
支持各种商业和开源应用程序和中间件
LynxOS
嵌入式软件公司LynuxWorks构建了两个嵌入式Linux版本。如图2所示,LynxOS是一个硬实时嵌入式系统。LynxOS是一个Linux实时操作系统,前融Linus ABI和POSIX。由于是微内核设计,内核占用非常小,仅有28KB大小。
图2
小型内核提供包括调度,终端分配和同步等必要的服务。其他服务由内核轻量级服务模块提供。这些模块被称为内核插件(Kernel Plug-Ins, KPIs)。新的KPIs可以被加到内核中用来支持I/O, 文件系统,TCP/IP,流和Socket。KPIs是多线程的,意味着每个KPI可以根据要求创建多个线程。
向KPI发送消息时没有上下文切换。比如当给文件系统KPI发送服务请求消息(RFS)时,不需要上下文切换从而减少运行时的开销。KPI之间的通信只依靠很少的指令,因而开销很低。
应用程序通过系统调用向I/O系统发出I/O请求。内核将I/O请求定向到设备驱动程序。 每个设备驱动程序都有一个中断处理程序和内核线程。 中断处理程序执行中断处理的第一步。 如果未完成处理,则会设置为内核异步陷阱。稍后,当内核可以响应软件中断时,它会调度内核线程的实例完成中断处理。
蓝猫
蓝猫是LynuxWorks公司构建的第一个Linux版本。蓝猫不是一个实时操作系统,但是与LynxOS二进制兼容,因此嵌入式应用程序可以轻松地移植到RTOS。蓝猫主要是为了对实时性没要求的嵌入式系统。
QNX
QNX是一个基于POSIX为嵌入式系统特别设计的实时操作系统。它不仅能够让Linux开发者保持他们的编程习惯,而且还保留了Linux开源模型的关键特性。带来的好处是,这种方式能够让嵌入式开发者无论是在标准的Linux还是实时的扩展Linux都可以享受OS的服务。图3说明了QNX的架构。
图3:QNX架构
QNX是QNX Software Systems Ltd. (www.qnx.com*), Kanata, Ont.公司的商用产品。和Linux一样,QNX也是基于1970由贝尔实验室开发的UNIX。QNX和Linux都遵循LINUX POSIX标准。
QNX Neutrino微内核为实时和非实时的应用提供了一个统一的环境。QNX基于实时,微内核的架构(见图3)提供POSIX兼容的API。Neutrino微内核只包含最基础的操作系统服务。所有其他的服务都可以通过可选的,内存保护的进程来提供,可以动态的启动和停止。为了实现模块化,QNX Neutrino使用消息传递作为整个系统IPC最基本的方式。
和Linux不同,QNX没有把POSIX作为附加层来实现。QNX微内核从一开始设计时就支持POSIX实时性,包括线程。ELC规范是基于现存的POSIX 1003.1标准。这个标准QNX也支持。因此,QNX能够天然支持嵌入式Linux应用。
QNX,和Linux一样,提供开源模式的好处。通过代码,开发者能够分析操作系统的架构以便更好地集成他们的代码,适配操作系统组件来满足应用特定的需求,并节省问题定位的思考时间。QNX通过两种方式来提供上面的好处。
通过使用高度扩展的微内核架构
给客户提供驱动,库和BSP(Board support package)的源码,包括为各种标准设备提供驱动开发套件
作为微内核操作系统,QNX Neutrino从根本上对定制开发。这是因为大部分操作系统层面的服务驱动,文件系统和协议栈存在于内核外的用户空间,只有少量的核心服务(比如调度,定时器,中断处理)存在内核中。因此,开发自定义驱动程序和应用程序特定的OS扩展不需要特殊的内核调试器或内核专家。事实上,作为用户空间的程序,开发OS扩展和开发标准的应用程序一样简单,因为它们可以用大家熟识的标准的源码级别的工具调试。
QNX Neutrino允许应用程序通过称之为同步消息传递这种统一的IPC方式来访问所有的驱动程序和操作系统服务。这种方式有几个好处。比如,由于QNX的消息传递是同步的,从而能够自动协调通信程序的执行,因此无需在每个进程中手动编码和调试复杂的同步服务(见图3)。消息传递本质上简化了复杂操作系统,将其划分为明确定义的可以单独开发,测试和维护的基础构建模块。通过任何提供服务的程序在路径名空间注册路径名将其广而告之给其他程序来实现。任何程序都能够通过在路径名上调用比如open(), read(), write(), 或者lseek()来访问其他服务。
举个例子。QNX串口驱动通常注册路径名/dev/ser1表示第一个串口。任何想访问这个端口的应用程序可以通过调用在/dev/se1上的open()函数来实现。对于应用程序而言,open()函数和标准的POSIX接口一样。
Neutrino C函数库将这个调用转成io_open消息并把这个消息转发给串口驱动。如果应用程序接下来要想串口写一个字符,调用序列如下:客户端调用write()函数,C函数库会构建一个io_write消息。这个消息会被转发给驱动。
这样带来的另一个好处是只要该服务支持某特定的功能,确切的消息就可以从任何客户端发送给任何服务。比如,向一个串口或磁盘文件写一个字符串,应用程序在这两种情况可以调用相同的write()函数,唯一的区别是消息要发送的地方。这意味着应用程序和它依赖的服务是解耦的。这种解耦可以使开发简单化,因为应用程序和系统服务之间所有的交互可以用一个简单的基于POSIX的编程模型来实现。
这样简化了代码移植到其他平台因为应用程序不包含任何硬件或协议特定的代码。
通过给客户提供比如库,驱动和BSP的源码,QNX Neutrino进一步简化了问题定位和OS的定制化开发。开发者可以免费下载设备驱动包(Device Drive Kits, DDKs)。DDKs包含文档和一个软件框架。这个软件框架实现了库中更高级别的独立设备的代码。
在涵盖大多数Linux源代码的GPL中未提供QNX源代码。然而,QNX软件系统基于它们自己的License协议提供源码。不像GPL,可以让开发人员自由创作衍生作品,而不必放弃知识产权(IP)。
作为宏操作系统,Linux将大部分的驱动,文件系统和协议中都绑进了内核中。因此这些模块中任何一个单一的编程错误就有可能导致致命的内核错误。在QNX Neutrino中,这些模块都运行在独立的、内存保护的地址空间中,内核崩溃很难发生。因此QNX Neutrino为实时应用程序提供了一个比Linux更健壮的环境。并且也肯定比双内核方法中使用的不受保护的实时内核强得多。
QNX附加值:
QNX Neutrino提供了QNX微网络服务,允许消息在处理器边界之间透明地流动。这意味着任何进程都可以访问任何资源任何网络节点就好像它们在本地一样。如果驱动的路径名在本地,QNX微内核可以直接路由这个消息。如果这个驱动在远程节点上,QNX微网络会透明的将这个消息转发给对应节点。
网络流量可以在所有可用链路上实现负载均衡,从而提高吞吐量。该服务是内置的,应用程序不需要任何特殊的网络代码。
QNX微内核体系结构的细粒度可扩展性使得运行时环境比Linux小得多。
Photon microGUI也使用微内核的架构。因此,设计人员可以轻松地“拔出”内存受限设备不需要的GUI服务。
QNX支持TCP/IP, NFS和Linux文件系统。因此使用QNX和Linux混合工作站的开发商店可以在这两种环境中分享资源。简而言之,Linux和QNX Neutrino不仅可以共存,还可以做更多的事情。相反,跟其他实时或通用的操作系统相比,它们为开发人员提供了更广泛的在应用程序中使用相同的API,源代码和技能点的机会。
QNX 支持 MIPS, PowerPC, SH4, StrongArm, xScale, and x86硬件架构。它可以从受约束的嵌入式平台扩展到多处理器平台。该体系结构提供多任务处理,优先级驱动的抢先式调度,同步和TCP/IP协议。同时还提供了包括PPP,DHCP,NFS,RPC和SNMP的实用程序。
QNX具有称为Qnet的基于消息的本机网络。
Photon microGUI桌面系统是一个内存占用很小的GUI。
对于GUI应用程序,QNX有一个叫Photon Application Builder(PhAB)的集成开发环境。不像Visual Basic,它没有拖拽控制。
自我托管功能简化了开发
QNX使用GNU GCC编译器
QNX RTP支持GCC-2.95 C和C++。而且QCC作为一个GCC前端的抽象层屏蔽了不同编译器(GNU GCC, Watcom和Metrowerks)之间的差异。还有一个CC端用来屏蔽可用编译器之间的差异。该前端还可以基于文件扩展名调用对应的编译器(C或C ++)。目前它调用GCC/G++。对于项目代码管理,QNX的发行版本中包含了make, CVS和RCS这些工具。
支持GCC编译器的交叉编译版本,允许开发者在Windows平台上开发Neutrino应用程序。
结论
在QNX中,实时和非实时环境是一样的。实时应用程序可以充分使用POSIX API和访问系统服务。POSIX/Linux应用程序可以立刻获得确定的行为。由于实时和非实时应用程序运行在相同的基于消息的环境中,进程之间的通信就非常简单了。减少重复工作。像之前讨论的,双内核方式会逼迫开发者使用不熟悉的API开发定制驱动。在大部分的操作系统环境中,开发这些驱动要求内核调试工具(非常难用),内核重新编译(非常耗时)和内核编程(成本高)。QNX Neutrino通过几种方式解决了这个问题。首先,像任何已具有大量用户群的OS一样,QNX支持各种用于标准硬件的现成驱动程序。并且,就像我们看到的,QNX在用户空间运行驱动,因此可以使用标准的代码级别的工具和技术。QNX DDKs让开发变得更简单了。DDK提供文档,库文件,头文件和可定制的各种驱动程序源。除了微内核的功能,由于微内核实时操作系统的设计是为了满足嵌入式系统的要求,QNX Neutrino还为Linux开发人员提供标准Linux或实时Linux扩展均不具备的功能。
与QNX相比,Linux有更大的开发人员社区,软件社区和真正的开源代码,以及更大的平台社区。ELC和CELF正在使嵌入式Linux标准化。 嵌入式Linux的最新版本要求具有完全POSIX兼容性的硬RTOS。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !