早期的嵌入式系统很多都不用操作系统,它们都是为了实现某些特定功能,使用一个简单的循环控制对外界的控制请求进行处理,不具备现代操作系统的基本特征(如进程管理、存储管理、设备管理、网络通讯等)。但随着控制系统越来越复杂,应用范围越来越广泛的时候,缺少操作系统就造成了很大的限制。C语言的出现促进了操作系统的发展。20世纪80年代以来,出现了各种各样的商业用嵌入式操作系统。如QNX,VxWorks,RT-Linux以及Windows CE等。使得在嵌入式系统设计时有了很大的选择余地,但选择的操作系统是否恰当对整个系统的开发有着挚为关键的影响。总的来说,嵌入式操作系统的选择可以遵从一下几条主要原则:
l 实时性。嵌入式操作系统的实时性主要与系统的结构、任务调度策略、中断处理手段以及内存管理方法有关。
l 系统定制能力。工业控制产品不同于民用PC的WinTel(微软Windows+Intel处理器)结构,后者比较简单,前者需求则是千差万别的,因此硬件系统也都不一样,所以对系统的定制能力有较高的要求。
l 可移植性。当进行嵌入式软件开发时,可移植性是要重点考虑的问题。良好的软件移植性应该比较好,可以在不同平台、不同系统上运行,跟操作系统无关。
l 可利用资源。产品开发不同于学术课题研究,它以快速、低成本、高质量的推出适合用户需求的产品为目的。集中精力研发出产品的特色,其他功能尽量由操作系统附加或采用第三方产品,因此操作系统的可利用资源对于选型是一个重要参考条件。如果有大量的资源可以利用,无疑会极大的缩短开发周期降低成本。
l 网络能力。现在的工业控制系统对联网的要求越来越多,即使目前的产品不需要具有联网的能力,也应该为以后的升级留下余地。
l 图形界面开发能力。友好的图形界面对多数控制系统来说都是必不可少的,相应的开发工具是否功能强、使用简单对开发的影响很大。
l 中文内核支持。毕竟,作为国内的工业控制系统,如果不支持中文,怎么能不说是一个缺憾?
l 已有的条件。在满足可靠应用的条件下,降低开发成本是每个控制系统开发考虑最多的因素之一。能根据自己的实际情况,合理的利用已有的条件,将会对降低成本有很大的作用,也会缩小产品的上市时间。
下面就四种常见的嵌入式操作系统对实时性、网络能力、图形界面开发以及开放性等方面进行分析比较,并结合课题的实际情况,阐述了选择QNX作为本课题的嵌入式系统设计平台的理由。
1.1.1 系统结构
Windows CE可分为四个主要模块[10,11,12,24],如图2.1所示,它们分别是内核模块、对象存储/文件系统模块、网络与通讯模块、GWES模块(图形、窗口、事件子系统)。此外还有三个重要的组成部分:驱动程序、设备管理器、OAL(OEM适配层,OEM Adaptation Layer)。
图2.1 Windows CE体系结构图
Windows CE内核模块是coredll.dll表示,最小为200KB。它是Windows CE操作系统的核心,并为应用程序提供基本服务:进程管理、多任务多线程管理、内存和资源管理、中断处理、异常处理等。Windows CE的RAM存储内存空间又被称为“对象存储(Object Store)”。一般包括三种类型的数据:Windows CE文件系统(包括数据文件和程序)、系统注册表和Windows CE数据库(一种结构化存储方法,Pocket PC内置程序多使用它)。Windows CE提供了比桌面系统更丰富的通讯支持。GWES模块即图形、窗口、事件子系统,是用户、应用程序、操作系统之间的图形用户界面。而且Windows CE支持在没有图形界面的设备上使用诸如窗口、消息机制和电源管理的特性。
1.1.2 任务调度
Windows CE内核支持按优先级抢占的方式调度多任务。Windows CE最多支持32个进程,系统启动时至少创建4个进程:nk.exe(内核)、filesys.exe(文件系统)、gwes.exe(GUI支持)、device.exe(加载维护系统设备驱动程序)。大多数平台还有exeplorer.exe(外壳)等服务进程,用户实际可以使用的进程也只有20多个。进程有自己受保护的32MB虚拟地址空间,但没有优先级。Windows CE支持的优先级是线程的优先级。线程是操作系统调度和运行的基本单位。线程由进程创建,是进程的一个实体,总是隶属于进程,并共享进程的地址空间。线程总数只受物理内存的限制。Windows CE实现抢占式、基于优先级的线程调度,线程之间由8个优先级来竞争CPU时间片。线程间的“同步”由“等待函数”和“等待对象”实现:将等待对象作为参数传递给等待函数,等待函数直到满足条件才返回;如果不满足条件,那么调用线程一直处于等待状态。Windows CE支持的“等待对象”包括:临界区域对象、事件对象和互斥体对象。
1.1.3 中断处理
四种操作系统都采用同样的传统中断模式。用户往某一中断源挂接特定中断后,实时操作系统创建一条ISR(中断服务例程)。所有的ISR地址保存在中断向量表中,并被硬件直接调用。ISR先执行一些保护现场的操作,然后调用用户定义的中断响应函数。
Windows CE采用的是基于优先级的可嵌套中断机制。Windows CE的中断处理分为两部分:ISR和IST(中断服务线程)。ISR是核心代码部分,IST是用户代码部分。Windows CE可以将中断请求(ISR)映射为硬件中断,并且实现相应的ISR和IST。Windows CE的中断机制是:当ISR被触发时,ISR只负责启动IST,一旦IST启动后,ISR立即就返回,以便响应新的中断。IST负责处理实际的中断处理。ISR运行在特殊的上下文中。IST是一个普通的应用程序线程,具有它自己的上下文和堆栈。
1.1.4 内存管理
Windows CE实现了“分页虚拟内存管理系统”。实现虚拟内存机制需要设备中的CPU具有MMU(Memory Manager Unit)。Windows CE使用CPU的MMU来实时地将虚拟地址转换为物理地址。Windows CE为全部应用程序实现的虚拟地址空间为2GB,为每个应用程序实现的虚拟地址空间为32MB。虚拟页面可以处于三种状态:空闲、保留、提交(占用)。空闲页(free)是可以被保留或提交的可用页。保留页(reserved)是逻辑页已分配但没有分配物理存储的页。提交/占用页(committed)是物理存储已分配的页。
1.1.5 网络能力
Windows CE提供了丰富的通讯支持,主要有:串行通讯(支持PPP/SLIP协议实现的串行直接连接和拨号连接),TCP/IP、FTP、HTTP协议和Winsock1.1的一个子集合,红外通讯协议IrDA、IrSock和IrComm,通过网络驱动程序接口规范(NDIS)支持局域网,支持远程访问RAS、USB连接、蓝牙连接和无线局域网连接等,支持SSPI(“安全支持提供者接口”)、CAPI(密码API)、TAPI(电话API)等。
1.1.6 图形界面开发
Windows CE程序开发语言主要是eVB和eVC。程序开发工具重要由微软提供,主要产品有eMbedded Visual Tools和Windows CE Platform Builder。此外,也可使用Java语言开发Windows CE程序,相关工具由SUN公司提供,包括PC端的Java运行环境J2SDK for windows和Personal Java的仿真器PJEE(Personal Java Emulation Environment)。
1.1.7 开放性
这里所谓的开放性主要指的是与POSIX标准的符合程度。POSIX表示可移植操作系统接口(Portable Operating System Interface)。IEEE最初开发POSIX标准,是为了提高UNIX环境下应用程序的可移植性。然而,POSIX并不局限于UNIX。许多其它的操作系统,例如Microsoft Windows NT,都支持POSIX标准,尤其是 IEEE Std. 1003.1-1990(1995 年修订)或 POSIX.1,POSIX.1 提供了源代码级别的C语言应用编程接口(API)给操作系统的服务程序,例如读写文件。POSIX.1已经被国际标准化组织(International Standards Organization,ISO)所接受,被命名为ISO/IEC 9945-1:1990 标准。
Windows CE是直接从NT发展过来的,继承了1000多个Win32 API 函数。Win32是Widows NT和Windows 95的编程接口。Win32对于Windows就像POSIX对于Unix一样。
1.2.1 系统结构
RT-Linux从本质上讲是对通用操作系统的Linux的实时改造的变种[1,6,13,14,28,57]。
Linux作为一种通用操作系统,虽然由于其开放性近来在嵌入式设计中有了较广的应用,但由于其注重的是系统的平均性能,在很多方面使得Linux不适合实时应用。主要的几点包括:分时调度策略,较低的时钟分辨率,内核的非抢占式机制,过多的禁止中断操作,以及虚拟内存机制。这些对于通用操作系统来说非常出色的设计在实时系统中都变得不合时宜。
然而,RT-Linux把Linux作为新的实时内核调度下的最低优先级任务执行。其本身的实现只需要一个实时内核。设计中的巧妙之处是通过截获底层中断改造了Linux,取得CPU控制权执行实时任务。这样,只需对Linux进行较小的改动就可以实现实时功能,且能够使用Linux下提供的丰富开发工具和己有功能,如网络功能,图形接口等。更重要的是,RT-Linux还继承了Linux具备的开放性、标准化、技术支持丰富、便宜等特性。并且,Linux内核升级与RT-Linux升级保持了彼此独立,使得整个系统更容易维护。
RT-Linux实现了一个小的实时核心,仅支持底层任务创建、中断服务例程的装入、底层任务通信队列、中断服务例程(ISR)和Linux进程。原来的非实时Linux内核作为一个可抢占的任务运行于这个小内核之上,所有的任务都在内核地址空间运行。它不同于微内核和大型内核,是双内核体系结构。
与其他RTOS相比,RT-Linux进程间通信不够灵活。其实时任务之间,及实时任务与其他Linux任务之间的通信方式只有一种:RT-FIFO。RT-FIFO缓冲区分配在内核地址空间。对RT-FIFO的读写操作均为原子操作,不能够阻塞。
图2.2和图2.3分别示出了纯Linux体系结构和RT-Linux体系结构。
图2.2 纯Linux体系结构图
图2.3 RT-Linux体系结构图
1.2.2 任务调度
RT-Linux在操作系统之下实现了一个简单的实时内核,Linux本身作为一个可抢占的任务在核内运行,其优先级最低,随时会被高优先级的实时任务抢占。
RT-Linux是开放源码的操作系统。其开放性给用户带来了很大便利。在任务调度方面,用户可以自行编写调度程序,可实现为可加载的核心模块。目前在实时Linux上实现的调度算法有:抢占式优先级调度,最早期限优先调度(EDF)。RT-Linux允许的实时任务优先级范围从1(最高)到RT_LOWEST_PRIORITY。同样由于源码开放性,优先级数目也可以由用户在编译核心时,指定相应的RT_LOWEST_PRIORITY值确定,这有给了用户很多自由。
1.2.3 中断处理
对于RT-Linux,中断处理方式有着更重要的意义。那就是同时要保证作为实时系统一个任务的原有Linux内核仍正常运行。为此,RT-Linux在Linux内核与中断控制器硬件之间,加入了一层仿真软件。所有的硬件中断都被送往这层仿真软件先做处理。在Linux源码中,所有出现的cli,sti,iret指令,都被相应的仿真宏定义取代,这些宏是S_CLI,S_STI,S_IRET。
当Linux执行禁止中断指令时,仿真软件中的一个变量被重置。无论何时,当中断发生时,仿真软件都会检查此变量。如果变量被置位(Linux允许中断),则Linux中断处理函数被立即调用。如果变量没有被置位(Linux禁止中断),则中断处理函数不被调用。但是,此变量中相应的某个比特会被置位,以记录下有中断等待处理。当Linux重新使能中断后,所有等待处理中断的处理函数会依次执行。这种仿真中断的技术称为软中断。这样的结构下,Linux失去了对中断的直接控制,因此它不会影响那些不通过仿真软件的实时中断,保证了RT-Linux的实时性。
1.2.4 内存管理
Linux使用由Intel 80x86系列处理器提供的页面机制,为每一任务提供互相独立的内存空间,并有内存保护。在实时系统中,这样做带来的直接问题是任务切换时间过长。因此,后来的RT-Linux设计采用的方法是在同一个地址空间运行所有的实时任务。并且,使用的是内核地址空间。之所以使用内核地址空间,是为了把由内存保护级别变化所引起的额外开销消除。并且,Linux提供动态装载内核模块(ladable kernel modules)功能也可以用在实时系统中。方法是把实时任务作为可装载内核模块创建,运行,及删除。
RT-Linux使用内核地址空间运行的方案,与不使用内存保护的VxWorks一样,同样存在地址越界引起的危险。任何错误的实时任务都可能破坏整个系统。
1.2.5 网络能力
Linux系统的一个主要特点是他的网络功能非常强大。RT-Linux由于具有双内核,可以很好的利用linux的网络功能。
1.2.6 图形界面开发
嵌入式Linux的图形用户界面有很多选择,比如MicroWidows、紧缩的X Widow、tinyX等,国内做的比较出色的是miniGUI。miniGUI最初是为了满足一个工业控制系统(计算机数控系统)而设计和开发的,该系统就是采用RT-Linux作为实时操作系统。由于可以利用Linux自由开放的丰富资源,相应的开发工具也很丰富。
1.2.7 开放性
RTLinux是一个严格遵守POSIX 1003.13技术规范的硬实时操作系统,运行在Linux或者BSD Unix之上。RTLinux坚持分离实时和非实时代码,操作系统和应用软件中的关键实时组件将给予绝对的优先权,以避免非实时组件影响实时组件的响应时间。实时内核为需要微秒级中断延迟的软件提供了一个熟悉的POSIX线程和精确调度。
1.3.1 系统结构
VxWorks在体系结构上属子“客户机/服务器”结构。也有另一种观点认为它是统一模型结构[15,16,17,24,28,57]。与QNX相比,VxWorks的“客户机/服务器”概念要模糊一些。
VxWorks运行系统的核心是“wind”微内核。wind微内核支持全部的实时功能,包括多任务,任务调度,任务间同步/通信和内存管理四项主要功能。核心以外的其它功能都作为任务运行。比如文件系统,调试任务,TCP/IP协议模块等。
VxWorks缺少必要的存储保护机制。最高优先级的任务和用户定义的任务在同一个地址空间运行。这样做的好处是VxWorks任务切换时的时间非常短。缺点也是明显的,增加了系统的不稳定性。不过,VxWorks也提供了替代方案,另一个可选模块(VxVMI)为系统任务提供了保护。
VxWorks另一缺点是多CPU协同工作能力差。不同CPU上运行的任务间通信只能通过消息队列(message queue),并且这类消息队列必须在CPU之间有共享内存时才可用。支持共享内存的模块(VxMP)还必须另外购买。
当然,Socket机制可用于类似的应用中(VxWorks的网络功能很强)。但是,在可靠的连路上使用TCP/IP协议给系统增加了许多延时和额外处理开销。
图2.4 VxWorks系统结构图
1.3.2 任务调度
VxWorks中,所有的任务运行在同一内存空间,彼此间缺少保护。为用户提供的优先级数目256,能够满足较为复杂的实时应用需求。系统所能够创建的任务数目与VxWorks无关,只受制于内存大小。在任务调度方面,支持抢占式优先级调度策略。并且,可以选择使用Round-Robin调度。
VxWorks提供了完善的机制解决抢占式调度带来的优先级逆转(Priority Invert)问题。
1.3.3 中断处理
可嵌套、分优先级的中断方式。所有中断响应在特殊的中断上下文中执行,与任务上下文无关。所有中断使用同一中断栈。中断栈的大小必须考虑到所有的中断嵌套情况。
中断与任务间的通信有多种方式:共享内存,环形缓冲区,信号量,消息队列,管道。
1.3.4 内存管理
VxWorks缺少内存保护机制,导致了系统的不稳定性。
1.3.5 网络能力
VxWorks的网络系统基本上是移植了BSD4.4 Unix的TCP/IP协议族,仅在实时性上进行了较大的修改,如用Semaphores代替原TCP/IP实现中的Interrupt Lock和修改Socket代码中无Timeout的部分。这使得网络应用层的开发和移植都非常方便。VxWorks支持工业标准TCP/IP协议族,具体包括:
l IP、IGMP、CIDR、TCP、UDP、ARP、RARP、RIPV1/V2
l Standard Berkeley Sockets
l Z-bufs、NFS、RPC
l PPP、BOOTP、DNS、DHCP、TFTP、FTP
l RLOGIN、TELNET、RSH
VxWorks还支持可选的Windnet产品,包括SNMP、OSPF、STREAMS等。但是VxWorks的网络功能还有一定的缺陷,比如目前版本的PPP协议还有一定的局限性,最多只能支持16路链路。
1.3.6 图形界面开发
VxWorks的优势在于多任务和实时性,做图形界面不是很出色。目前VxWorks上的GUI主要有三种选择:windML、ZINC和Tilcon。
WindML即Wind Media Library(媒体库),是Wind River的专业图形化环境,它主要是为了满足较简单的单功能设备的图像要求用来提供基本的图形、视频和声频技术以及提供一个设计标准设备驱动程序框架。WindML API库提供了一个统一的图形硬件接口以及处理输入设备和输入设备事件的能力。WindML包括两个组件:软件开发包(SDK)和驱动程序开发包(DDK)。SDK组件用来开发应用程序,它提供了一个全面的API集,包括图形、输入处理、多媒体、字体和内存管理。DDK组件是用来实现驱动程序的,它提供了一个完整的驱动程序参考集,包括硬件配置和API集,以使得开发者能够迅速的引导和使用自己的驱动程序。
Zinc是一个面向对象和平台独立的GUI(图形化用户界面)设计框架。Wind River提供两个不同版本的Zinc,分别是运行于桌面系统(比如windows和UNIX系统)的版本和运行于嵌入式系统(比如Vxworks和pSOS)的版本。
Tilcon是一个实时操作系统图形开发工具。同步支持最新版本的Tornado/VxWorks以及WindML多媒体库。适用与VxWorks实时环境下构建虚拟仪表,实时控制,分布式控制等高级图形应用。Tilcon本身已经集成大量成熟控件,用户再无需调用低级的图形函数去画线填充,可以象Windows下VB可视化编程一样用拖动控件的方式构造自己的图形应用。Tilcon开发的图形界面同时支持本地和分布式显示。图形界面开发完成后就可以自动的显示在本地或通过TCP/IP网络显示到其他网络平台上。支持OPC,XML,SOAP等标准工业协议。
1.3.7 开放性
VxWorks支持POSIX 1003.1b的规定和1003.1中有关基本系统调用的规定,其中包括进程初始化、文件和目录、I/O初始化、语言服务、目录管理。而且VxWorks还支持POSIX1003.1b的实时扩展,包括异步I/O、计数型信号量、消息队列、信号、内存管理和调度控制等。
1.4.1 系统结构
ONX在体系结构上非常先进高效,采用的是“客户机/服务器”结构,具备微内核和许多可选服务器进程。微内核只实现实时操作系统应该具备的基本功能即:任务调度,进程间通信,中断处理,网络接口[18,19,20,21,22,24,25,26,27,28]。
其它的功能都以协作进程(Cooperative Processes)的方式实现,这些协作进程就是服务器进程,它们向客户进程(如用户应用进程)提供服务。在QNX中,服务器进程的例子很多,象文件管理器,进程管理器,网络管理器,图形界面管理器等等。微内核运行在优先级0,服务器进程和设备驱动程序运行在优先级1或2。应用进程运行在优先级3。QNX的优先级保护机制使得整个系统的稳定性比VxWorks有提高。
QNX是基于消息传递(Message Passing)的操作系统。消息传递是QNX的基本进程间通信机制(IPC)。其消息传递服务基于客户机/服务器模型:客户进程向服务进程发送消息,服务进程也用消息响应。许多QNX系统调用都是基于这样的机制。比如,如果用户进程想打开某个文件,这个系统调用就被转换为一条消息,发送给文件管理器。文件管理器收到消息,打开文件后,将文件句柄通过消息返回给调用者。
由于QNX的微内核结构中集成了消息机制和网络功能,因此,QNX的分布计算能力很强,适合于分布式应用。QNX的网络管理器对用户进程屏蔽了网络的存在,使得不同CPU上的用户进程间通信时仍能采用消息机制,消息使用方式与本地用户进程间通信完全一致。
图2.5 QNX微内核结构
图2.6 QNX系统结沟
1.4.2 任务调度
QNX使用进程/线程模型。QNX脱胎于UNIX操作系统,所以它具备进程(Process)的概念。在QNX中,每个进程都享有独立的虚拟存储空间,使系统更加稳定。而在VxWorks中,需要另外的模块才能提供类似的功能。
QNX是多进程系统。其进程可以创建线程(Thread)。QNX的线程与POSIX定义的线程概念还是有所区别的。在QNX中,线程与父进程享受同样的数据段和代码段,但是,有些操作系统对象,如时钟,文件句柄等,却不能共享。并且,在父进程被杀死后,派生的线程仍可以继续运行。
QNX提供的优先级数目64个,系统能够创建的进程数为4095个,每个进程能够创建32767个线程。任务调度方面,提供四种调度策略:基于优先级的FIFO调度(SCHED_FIFO),基于优先级的Round-Robin调度(SCHED_RR),Sporadic调度(SCHED_SPORADIC)以及其他调度策略(SCHED_OTHER)。其中SCHED_OTHER的调度策略和FIFO相同,但将来会改变,所以不推荐使用。
1.4.3 中断处理
QNX采用的也是嵌套,分优先级的中断方式。中断ISR在挂接它们的进程的上下文中执行。每个ISR具有它自己的堆栈。
QNX中断与进程通信的方式有信号(Signals)和脉冲(Pulses)。
1.4.4 内存管理
QNX的内存保护机制相当完善。每一个进程都在独立的虚拟空间运行,具有独立的数据段和代码段。虚拟内存由Intel处理器的分页功能提供。为了避兔内存碎片问题,QNX使用固定大小内存分段。
QNX提供的内存保护提高了系统稳定性,对于系统调试阶段也很有帮助。
1.4.5 网络能力
QNX有QNX机器之间专用网络,QNX机器自身之间通信使用的协议,将多台QNX物理机联成一体,在各物理机之间共享各种资源,使各物理机联结成为一台逻辑机。对于需要分布式并行计算的应用系统而言,QNX系统的这种特点无疑提供了极大的方便。对于处理量而分布式系统不能满足需求的应用系统而言,QNX更提供对称多处理器的方式的系统供用户选择。由于QNX微核及消息传递结构,通过QNX处理由许多具体计算机(节点)组成的网络系统就像一台单一的计算机。节点之间是平等的,每个节点都是网络根目录下的一个子目录,每个节点都可以把其它节点当作一个图表来操作,不需要专门的远程操作命令。网络允许任何进程使用网络中任何计算机的任何资源。无盘节点能由网络自举,使用网络中处于任何地方的任何资源。对于一些关键性的应用,QNX可以通过利用分布式网络信息实现热备份。QNX网络具有透明的分布处理能力,容错网络功能,均衡负荷功能,可扩充的结构。网络节点之间多重冗余连结保证了某一局部网络发生故障时系统能正常工作。
QNX节点也能通过约定的网络协议(TCP/IP,SL/IP,RPC,NFS,FTP,Telnet,DOSLAN协议等)与非QNX系统通讯。
1.4.6 图形界面开发
QNX是少数支持图形用户界面的实时操作系统之一。不同于一些实时操作系统,QNX对图形用户界面的支持不是通过用户可以使用的C/C++图形函数库的方式提供给用户自己编写图形界面,而是“立即”提供的。图形用户界面以一组运行模块的方式,用户只要运行这些模块,就“立即”获得了图形用户界面,本身不需编写一条程序。具体优势将会在下文讨论。
QNX的Photon microGUI窗口系统,参照在QNX微内核体系中为实现嵌入式系统的POSIX OS环境所成功采用的方法,遵循类似的原则建立起了具有自己独特风格的窗口体系,即Photon微内核机制。Photon微内核本身是一个小进程(有45KB代码)。概括说来,Photon为建立GUI提供了一种新方法――使用微内核和一组共同操作的进程来实现图形用户界面。其特有的能力有:
l 支持低内存要求,允许Photon为那些因内存容量的限制只能支持一个图形库的环境提供高级的窗口功能。
l 提供了非常灵活的、用户可以扩展的体系结构,这种体系结构允许开发者按照自己的需要扩充GUI。
l 由于能够实现跨平台的灵活连接,事实上人们可以从任何被连接的桌面环境中调用任何平台中的Photon窗口应用。
PhAB(Photon Application Builder)是QNX下的一个可视化图形界面程序开发工具,包括丰富的易于定制的用户控件和语言编辑器。利用PhAB开发应用程序的一般过程如图2.7:
图2.7 PhAB应用程序开发过程图
1.4.7 开放性
QNX也是一个遵循POSIX 1003.1标准及POSIX实时标准的实时操作系统。但在系统实现上与UNIX不同,因此,QNX虽然在外观上很像UNIX,但并不属于类UNIX操作系统。
VxWorks程序可以移植到QNX,为QNX的开发带来了很大的方便。
作为对上面的详细分析的一个总结,做了一个简单的比较表格,见表2.1:
表2.1 四种实时操作系统比较表 |
||||
|
Windows CE |
RT-Linux |
VxWorks |
QNX |
体系结构 |
coredll.dll内核 |
双内核 |
不严格的客户机/服务器 |
微内核,客户机/服务器 |
可定制性 |
有 |
有 |
有 |
强 |
调度算法 |
抢占式、基于优先级的线程调度 |
抢占式优先级调度,最早期限优先调度(EDF) |
抢占式优先级调度,Round-Robin |
FIFO,Roud-robin,Adaptive,Sporadic |
最大任务数 |
32个进程每个进程的线程数受内存的限制 |
―― |
受内存大小的限制 |
4095个进程,每个进程可以有32767个线程 |
优先级数 |
64 |
1~RT_LOWEST_PRIORITY,可编程控制 |
256 |
64 |
中断处理 |
基于优先级的可嵌套中断机制 |
软中断 |
可嵌套、分优先级的中断方式 |
可嵌套、分优先级的中断方式 |
内存管理 |
分页虚拟内存管理 |
在同一个地址空间运行所有的实时任务,使用的是内核地址空间。存在地址越界危险。 |
缺少内存保护机制 |
具有独立的虚拟空间 |
网络能力 |
有 |
有 |
有 |
有,且有自己特有的网络文件系统 |
GUI开发 |
eVB、eVC和J2SDK、PJEE |
有很多选择,比如国内的miniGUI |
windML、ZINC和Tilcon |
Photon微内核机制,PhAB |
开放性 |
Win32 |
POSIX |
POSIX |
POSIX |
选择QNX作为项目的嵌入式开发平台主要基于以下几条理由:
1)实时性。QNX提供用户可控制的、优先级驱动、抢占式的调度方式,特殊的内核机制保证了其实时性非常强。上下文切换和中断延时是操作系统实时性的两个主要指标,QNX的时间指标都在微秒一级,如表2-1和表2-2所示[29]:
表2.2 典型中断延迟时间 |
|
表2.3 典型上下文切换时间 |
||
处 理 器 |
中断延时 |
|
处 理 器 |
上下文切换 |
166MHz Pentium |
3.3 us |
7400G 4 PowerPC 460MHz |
0.6 us |
|
100MHz Pentium |
4.4 us |
|
R527X MIPS 166MHz |
2.3 us |
100MHz 486DX4 |
5.6 us |
|
SH-4 200MHz |
1.9 us |
33MHz 386EX |
22.5 us |
|
SA-1110 StrongARM 207MHz |
1.8 us |
2)模块化。QNX是一个模块化、可裁剪的实时操作系统。它由微内核和一组协同工作的进程构成,具有高度的可伸缩性。这个灵活的结构可以使用户根据实际的需求,将系统配置成微小的(小至32K存储空间)嵌入式操作系统或是包括几百个处理器的超级(大至 4G 存储空间)虚拟机操作系统。
3)稳定性。QNX建立在完全地址空间保护基础之上的实时操作系统,具有很强的稳定性。
4)网络能力。QNX是一个分布式操作系统。从用户角度来看,运行QNX的局域网就像一台集中式的多用户计算机。除了其自身的网络外,还支持与异型机器之间网络通信的协议,如TCP/IP族的各种协议。
5)开放性。QNX实时操作系统还是一个开放的系统,其应用程序接口符合POSIX标准。使Linux/UNIX程序能够方便地移植到QNX系统上来,极大地扩展了QNX系统的可用资源。而且VxWorks上的程序也可以移植到QNX。因此,对于熟悉UNIX/LINUX或者VxWorks程序设计的人,更为方便从事QNX开发。
6)功能强大的IDE。QNX Memontics新动力开发系统集成环境提供了各种方便的工具链、各种板级支持包、库函数、源代码开发工具等。QNX还提供了多种宿主操作系统上Memontics集成开发环境,如MS Windows,Linux,Solaris,QNX NEUTRINO等。
7)方便的GUI开发。QNX提供了非常强大易用的Photon图形用户程序开发工PhAB,采用所见即所得的方式,非常容易就可以开发出灵活复杂优美的用户界面程序。对汉字编码的支持也很完美。
8)非常广泛的硬件支持。从PC/104到CompactPCI的最新的PC硬件,实际上QNX比其它操作系统支持更多的PC硬件,包括多达数百种的外围器件。与美国AMD公司,英特尔和国家半导体公司的同盟关系确保芯片和参考平台兼容性。仅CPU就支持x86、PowerPC、MIPS、ARM等。
9)丰富的网络资源。目前基于QNX的开发应用很广泛,国内外形成了很多比较好的技术交流网站,QNX公司本身的技术支持网站内容也非常丰富。QNX系统的提供的帮助体系也很全面,搜索功能比较强。