计算机系统由硬件和软件组成,在发展初期没有操作系统这个概念,用户使用监控程序来使用计算机。随着计算机技术的发展,计算机系统的硬件、软件资源也越来越丰富,监控程序已不能适应计算机应用的要求。于是在20世纪年代中期监控程序又进一步发展形成了操作系统(Operating System)。发展到现在,广泛使用的有三种操作系统即多道批处理操作系统、分时操作系统,以及实时操作系统,如图1.5所示。
图1.5 操作系统类别
提到桌面型计算机的操作系统,全世界超过九成的PC使用的是微软(Microsoft)公司的Windows操作系统,其他也有一些颇具知名度的操作系统,如苹果(Apple)公司的Ma-cOS,工作站级计算机常用的Sun公司的Solaris,还有Linux或者FreeBSD等免费的操作系统,但是提到嵌入式系统中所使用的操作系统,一般用户就很少了解了。由于大型嵌入式系统需要完成复杂的功能,所以需要操作系统来完成各任务之间的调度。由于桌面型操作系统的体积,以及实时性等特性不能满足嵌入式系统的要求,从而促进了嵌入式操作系统的发展。
操作系统(Operating System,OS)的基本思想是隐藏底层不同硬件的差异,向在其上运行的应用程序提供一个统一的调用接口。应用程序通过这一接口实现对硬件的使用和控制,不必考虑不同硬件操作方式的差异。操作系统示意图如图1.6所示。
图1.6 操作系统示意图
很多产品厂商选择购买操作系统,在此基础上开发自己的应用程序,形成产品。事实上,因为嵌入式系统是将所有程序,包括操作系统、驱动程序、应用程序的程序代码全部烧写进ROM里执行,所以操作系统在这里的角色更像一套函数库(Library)。
操作系统主要完成三项任务:内存管理、多任务管理和外围设备管理。
操作系统是计算机中最基本的程序。操作系统负责计算机系统中全部软、硬件资源的分配与回收、控制与协调等并发的活动;操作系统提供用户接口,使用户获得良好的工作环境;操作系统为用户扩展新的系统功能提供软件平台。
嵌入式操作系统(Embedded Operating System):负责嵌入式系统的全部软、硬件资源的分配、调度、控制、协调;它必须体现其所在系统的特征,能够通过加载/卸载某些模块来达到系统所要求的功能。
嵌入式系统的操作系统核心通常要求体积要很小,因为硬件ROM的容量有限,除了应用程序之外,不希望操作系统占用太大的存储空间。事实上,嵌入式操作系统可以很小,只提供基本的管理功能和调度功能,缩小到10~20KB的嵌入式操作系统比比皆是,相信习惯微软的Windows系统的用户,可能会觉得不可思议。
不同的应用场合会产生不同特点的嵌入式操作系统,但都会有一个核心(Kernel)和一些系统服务(System Service)。操作系统必须提供一些系统服务供应用程序调用,包括文件系统、内存分配、I/O存取服务、中断服务、任务(Task)服务、时间(Timer)服务等,设备驱动程序(Device Driver)则是要建立在I/O存取和中断服务上的。有些嵌入式操作系统也会提供多种通信协议,以及用户接口函数库等。嵌入式操作系统的性能通常取决于核心程序,而核心的工作主要在任务管理(Task Management)、任务调度(Task Scheduling)、进程间的通信(IPC)、内存管理(Memory Management)。
实时操作系统是一段在嵌入式系统启动后首先执行的背景程序,用户的应用程序是运行于RTOS之上的各个任务,RTOS根据各个任务的要求,进行资源(包括存储器、外设等)管理、消息管理、任务调度、异常处理等工作。在RTOS支持的系统中,每个任务均有一个优先级,RTOS根据各个任务的优先级,动态地切换各个任务,保证对实时性的要求。
实时操作系统(Real-Time Operating System,RTOS)是指操作系统本身要能在一个固定时限内对程序调用(或外部事件)做出正确的反应,也即对时序与稳定性的要求十分严格。目前国际较为知名的实时操作系统有WindRiver的“VxWorks”、QNX的“NeutrinoR-TOS”、Accelerated Technology的“Nucleus Plus”、Radisys的“OS/9”、Mentor Graphic的“VRTX”、LynuxWorks的“LynuxOS”,以及Embedded Linux厂商所提供的Embedded Linux版本,如Lynux Works的“BlueCat RT”等。其产品主要应用于航空航天、国防、医疗、工业控制等领域,这些领域的设备需要高度精确的实时操作系统,以确保系统任务的执行不会发生难以弥补的意外。
IEEE的实时UNIX分委会认为实时操作系统应具备以下几点:
● 异步的事件响应;
● 切换时间和中断延迟时间确定;
● 优先级中断和调度;
● 抢占式调度;
● 内存锁定;
● 连续文件;
● 同步。
总地来说,实时操作系统是事件驱动的,能对来自外界的作用和信号在限定的时间范围内做出响应。它强调的是实时性、可靠性和灵活性,与实时应用软件相结合成为有机的整体起着核心作用,由它来管理和协调各项工作,为应用软件提供良好的运行软件环境及开发环境。从实时系统的应用特点来看实时操作系统可以分为两种:一般实时操作系统和嵌入式实时操作系统。一般实时操作系统应用于实时处理系统的上位机和实时查询系统等实时性较弱的系统,并且提供了开发、调试、运用一致的环境。
嵌入式实时操作系统应用于实时性要求高的控制系统,而且应用程序的开发过程是通过交叉开发来完成的,即开发环境与运行环境不一致。嵌入式实时操作系统具有规模小(一般在几至几十K)、可固化使用实时性强(在毫秒或微秒数量级上)的特点。
嵌入式实时操作系统在目前的嵌入式应用中用得越来越广泛,尤其在功能复杂、系统庞大的应用中显得越来越重要。在嵌入式应用中,只有把CPU嵌入到系统中,同时又把操作系统嵌入进去,才是真正的计算机嵌入式应用。使用实时操作系统主要有以下几个因素:
● 嵌入式实时操作系统提高了系统的可靠性;
● 提高了开发效率,缩短了开发周期;
● 嵌入式实时操作系统充分发挥了32位CPU的多任务潜力。
优点:在嵌入式实时操作系统环境下开发实时应用程序使程序的设计和扩展变得容易,不需要大的改动就可以增加新的功能。通过将应用程序分割成若干独立的任务模块,使应用程序的设计过程大为简化;而且对实时性要求苛刻的事件都得到了快速、可靠的处理。通过有效的系统服务,嵌入式实时操作系统使得系统资源得到更好的利用。
缺点:但是,使用嵌入式实时操作系统还需要额外的ROM/RAM开销,2%~5%的CPU额外负荷,以及内核的费用。
通用型操作系统的执行性能与反应速度比起实时操作系统,相对没有那么严格。目前较知名的有Microsoft的“Windows CE”、Palm source的“Palm OS”、Symbian的“Symbian OS”,以及Embedded Linux厂商所提供的各式Embedded Linux版本,如Metrowerks的“Em-bedix”、TimeSys的“TimeSys Linux/GPL”、LynuxWorks的“BlueCat Linux”、PalmPalm的“Tynux”等,其产品主要应用于手持式设备、各式联网家电、网络设备等领域。
对基于芯片的开发来说,应用程序一般是一个无限的循环,可称为前、后台系统或超循环系统。很多基于微处理器的产品采用前后台系统设计,如微波炉、电话、玩具等。在另外一些基于微处理器应用中,从省电的角度出发,平时微处理器处在停机状态,所有程序都靠中断服务来完成。
代码的临界区简称为临界区,指处理时不可分割的代码,运行这些代码不允许被打断。一旦这部分代码开始执行,则不允许任何中断打入(这不是绝对的,如果中断不调用任何包含临界区的代码,也不访问任何临界区使用的共享资源,这个中断可能可以执行)。为确保临界区代码的执行,在进入临界区之前要关中断,而临界区代码执行完成以后要立即开中断。图1.7所示为前、后台系统。
图1.7 前、后台系统
程序运行时可使用的软、硬件环境统称为资源。资源可以是输入、输出设备,如打印机、键盘、显示器。资源也可以是一个变量、一个结构或一个数组等。
可以被一个以上任务使用的资源叫作共享资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源,这叫作互斥。
一个任务(又称作一个线程)是一个简单的程序,可以认为CPU完全属于该程序自身。实时应用程序的设计过程,包括如何把问题分割成多个任务,每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有自己的一套CPU寄存器和自己的栈空间,共享资源如图1.8所示。
图1.8 共享资源
当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,即CPU寄存器中的全部内容。这些内容保存在任务的当前状态保存区,也就是任务自己的栈区之中。入栈工作完成以后,就把下一个将要运行的任务的当前状态从任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程就称为任务切换。
这个过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。
多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通信。内核提供的基本服务是任务切换。使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核需要消耗一定的系统资源,比如2%~5%的CPU运行时间、RAM和ROM等。
内核提供必不可少的系统服务,如信号量、消息队列、延时等。
调度是内核的主要职责之一。调度就是决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。每个任务根据其重要程序的不同被赋予一定的优先级。基于优先级的调度法指CPU总是让处在就绪态的优先级最高的任务先运行。然而究竟何时让高优先级任务掌握CPU的使用权,有两种不同的情况,这要看用的是什么类型的内核,是非占先式的还是占先式的内核。
非占先式内核要求每个任务自我放弃CPU的所有权。非占先式调度法也称为合作型多任务,各个任务彼此合作共享一个CPU。异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。
当系统响应时间很重要时,要使用占先式内核。因此绝大多数商业上销售的实时内核都是占先式内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪状态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。
任务的优先级是表示任务被调度的优先程度。每个任务都具有优先级。任务越重要,赋予的优先级应越高,越容易被调度而进入运行态。
不同系统的中断过程如图1.9所示。
图1.9 不同系统的中断过程
中断是一种硬件机制,用于通知CPU有个异步事件发生了。中断一旦被识别,CPU保存部分(或全部)上下文即部分或全部寄存器的值,跳转到专门的子程序,称为中断服务子程序(ISR)。中断服务子程序进行事件处理,处理完成后,程序回到:
(1)在前、后台系统中,程序回到后台程序;
(2)对非占先式内核而言,程序回到被中断了的任务;
(3)对占先式内核而言,让进入就绪态的优先级最高的任务开始运行。
时钟节拍是特定的周期性中断。这个中断可以看作系统心脏的脉动。中断之间的时间间隔取决于不同应用,一般在10~200ms之间。时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。如果时钟节拍率越快,系统的额外开销就越大。
Linux操作系统是UNIX操作系统的一种克隆系统。它诞生于1991年的10月5日(这是第一次正式向外公布的时间)。此后借助于互联网,经过全世界各地计算机爱好者的共同努力,现已成为当今世界上使用最多的一种UNIX类操作系统,并且使用人数还在迅猛增长。
Linux是目前最为流行的一款开放源代码的操作系统,从1991年问世到现在,不仅在PC平台,还在嵌入式应用中大放光彩,逐渐形成了与其他商业EOS抗衡的局面。目前正在开发的嵌入式系统中,70%以上的项目选择Linux作为嵌入式操作系统。
经过改造后的嵌入式Linux具有适合嵌入式系统的特点。
(1)内核精简,高性能、稳定;
(2)良好的多任务支持;
(3)适用于不同的CPU体系架构:支持多种体系架构,如X86、ARM、MIPS、ALPHA、SPARC等;
(4)可伸缩的结构:可伸缩的结构使Linux适合从简单到复杂的各种嵌入式应用;
(5)外设接口统一:以设备驱动程序的方式为应用提供统一的外设接口;
(6)开放源码,软件资源丰富:广泛的软件开发者的支持,价格低廉、结构灵活、适用面广;
(7)完整的技术文档,便于用户的二次开发。
uClinux是一个完全符合GNU/GPL公约的操作系统,完全开放代码。uClinux从Linux 2.0/2.4内核派生而来,沿袭了主流Linux的绝大部分特性。它是专门针对没有MMU的CPU,并且为嵌入式系统做了许多小型化的工作。适用于没有虚拟内存或内存管理单元(MMU)的处理器,例如ARM7TDMI。它通常用于具有很少内存或Flash的嵌入式系统。它保留了Linux的大部分优点:稳定、良好的移植性,优秀的网络功能,完备的对各种文件系统的支持,以及标准丰富的API等。注意:LINUX2.6版本已可以在没有MMU的处理器上运行。
Windows CE是微软开发的一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作,它是精简的Windows 95。Windows CE的图形用户界面相当出色。Win CE具有模块化、结构化和基于Win32应用程序接口以及与处理器无关等特点。Linux操作系统界面和Win CE分别如图1.10和图1.11所示。Win CE不仅继承了传统的Windows图形界面,并且在Win CE平台上可以使用Windows 95/98上的编程工具(如Visual Basic、Visual C++等),使绝大多数的应用软件只须简单的修改和移植就可以在Windows CE平台上继续使用。
图1.10 Linux操作系统界面
图1.11 WinCE
从多年前发表Windows CE开始,微软就开始涉足嵌入式操作系统领域,如今历经WinCE 2.0、3.0,新一代的WinCE呼应微软.NET的意愿,定名为“Windows CE.NET”(目前最新版本为5.0)。WinCE主要应用于PDA,以及智能电话(smart phone)等多媒体网络产品。微软于2004年推出了代号为“Macallan”的新版WinCE系列的操作系统。
Windows CE.NET的目的,是让不同语言所写的程序可以在不同的硬件上执行,也就是所谓的.NET Compact Framework,在这个Framework下的应用程序与硬件互相独立无关,而核心本身是一个支持多线程以及多CPU的操作系统。在工作调度方面,为了提高系统的实时性,主要设置了256级的工作优先级以及可嵌入式中断处理。
如同在PC Desktop环境,Windows CE系列在通信和网络的能力,以及多媒体方面极具优势。其提供的协议软件非常完整,如基本的PPP、TCP/IP、IrDA、ARP、ICMP、Wireless Tunable TCP/IP、PPTP、SNMP、HTTP等几乎应有尽有,甚至还提供了有保密与验证的加密通信,如PCT/SSL。而在多媒体方面,目前在PC上执行的Windows Media和DirectX都已经应用到Windows CE 3.0以上的平台。这些包括Windows Media Technologies 4.1、Windows Media Player 6.4 Control、DirectDraw API、DirectSound API和DirectShow API,其主要功能就是对图形、影音进行编码译码,以及对多媒体信号进行处理。
μC/OS-II是Jean J.Labrosse在1990年前后编写的一个实时操作系统内核。名称μC/OS-II来源于术语Micro-Controller Operating System(微控制器操作系统)。它通常也称为MUCOS或者UCOS。严格地说,μC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度、任务管理、时间管理、内存管理和任务间通信和同步等基本功能,没有提供输入/输出管理、文件管理、网络等额外的服务。但由于μC/OS-II良好的可扩展性和源码开放,这些功能完全可以由用户根据需要自己实现。μC/OS-II的目标是实现一个基于优先级调度的抢占式实时内核,并在这个内核之上提供最基本的系统服务,如信号量、邮箱、消息队列、内存管理、中断管理等。虽然μC/OS-II并不是一个商业实时操作系统,但μC/OS-II的稳定性和实用性却被数百个商业级的应用所验证,其应用领域包括便携式电话、运动控制卡、自动支付终端、交换机等。μC/OS-II是一个源码公开、可移植、可固化、可裁剪、占先式的实时多任务操作系统,其绝大部分源码是用ANSI C写的,只有与处理器的硬件相关的一部分代码用汇编语言编写。使其可以方便地移植并支持大多数类型的处理器。可以说,μC/OS-II在最初设计时就考虑到了系统的可移植性,这一点和同样源码开放的Linux很不一样,后者在开始的时候只是用于x86体系结构,后来才将和硬件相关的代码单独提取出来。
目前μC/OS-II支持ARM、PowerPC、MIPS、68k/ColdFire和x86等多种体系结构。
μC/OS-II通过了联邦航空局(FAA)商用航行器认证。自1992年问世以来,μC/OS-II已经被应用到数以百计的产品中。μC/OS-II占用很少的系统资源,并且在高校教学使用时不需要申请许可证。
VxWorks操作系统是美国WIND RIVER公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空航天等高精尖技术及实时性要求极高的领域中,如卫星通信、军事演习、弹道制导、飞机导航等,甚至在1997年4月登陆火星表面的火星探测器上也使用到了VxWorks。
eCos是RedHat公司开发的源代码开放的嵌入式RTOS产品,是一个可配置、可移植的嵌入式实时操作系统,设计的运行环境为RedHat的GNUPro和GNU开发环境。eCos的所有部分都开放源代码,可以按照需要自由修改和添加。eCos的关键技术是操作系统可配置性,允许用户组和自己的实时组件和函数以及实现方式,特别允许eCos的开发定制自己的面向应用的操作系统,使eCos能有更广泛的应用范围。
TRON是指“实时操作系统内核(The Real-time Operating system Nucleux)”,它是在1984年由东京大学的Sakamura博士提出的,目的是为了建立一个理想的计算机体系结构。通过工业界和大学院校的合作,TRON方案正被逐步用到全新概念的计算机体系结构中。
uITRON是TRON的一个子方案,它具有标准的实时内核,适用于任何小规模的嵌入式系统,日本国内现有很多基于该内核的产品,其中消费电器较多。目前已成为日本事实上的工业标准。
TRON明确的设计目标使其甚至比Linux更适合做嵌入式应用,内核小,启动速度快,即时性能好,也很适合汉字系统的开发。另外,TRON的成功还来源于如下两个重要的条件:
(1)它是免费的;
(2)它已经建立了开放的标准,形成了较完善的软、硬件配套开发环境,较好地形成了产业化。