|
EOS是指运行在嵌入式计算机系统上的支持嵌入式应用程序的操作系统,是用于控制和管理嵌入式系统中的硬件和软件资源、提供系统服务的软件集合。EOS是嵌入式软件的一个重要组成部分。它的出现提高了嵌入式软件开发的效率,提高了应用软件的可移植性,有力地推动了嵌入式系统的发展。
|
|
|
随着各种类型EOS的成熟和发展,与通用系统的开发方法相似,基于操作系统的开发方案逐渐成为开发的主流。EOS作为应用软件的运行平台,已经成为许多嵌入式系统的关键。
|
|
|
|
|
(1)微型化。EOS的运行平台是嵌入式计算机系统。这类系统一般没有大容量的内存,几乎没有外存,因此,EOS必须做得小巧,以尽量少占用系统资源。为了提高系统速度和可靠性,嵌入式系统中的软件一般都固化在存储器芯片中,而不是存放在磁盘等载体中。
|
|
|
(2)代码质量高。在大多数应用中,存储空间依然是宝贵的资源,这就要求程序代码的质量要高,代码要尽量精简。
|
|
|
(3)专业化。嵌入式系统的硬件平台多种多样,处理器的更新速度快,每种都是针对不同的应用领域而专门设计的。因此,EOS要有很好适应性和移植性,还要支持多种开发平台。
|
|
|
(4)实时性强。嵌入式系统广泛应用于过程控制、数据采集、通信、多媒体信息处理等要求实时响应的场合,因此实时性成EOS的又一特点。
|
|
|
(5)可裁减、可配置。应用的多样性要求EOS具有较强的适应能力,能够根据应用的特点和具体要求进行灵活配置和合理裁减,以适应微型化和专业化的要求。
|
|
|
嵌入式操作系统的实时性上,可以分为实时嵌入式操作系统(Real-Time embedded Operatiing System, RTOS)和非实时嵌入式操作系统两类。
|
|
|
(1)实时嵌入式操作系统。RTOS支持实时系统工作,其首要任务是调度一切可利用资源,以满足对外部事件响应的实时时限,其次着眼于提高系统的使用效率。RTOS主要用在控制、通信等领域。目前,大多数商业嵌入式操作系统都是RTOS。与通用操作系统相比,RTOS在功能上具有很多特性。RTOS和通用操作系统之间的功能也有很多相似之处,如它们都支持多任务,支持软件和硬件的资源管理以及都为应用提供基本的操作系统服务。RTOS特有的不同于通用操作系统的功能主要有:满足嵌入式应用的高可靠性;满足应用需要的上、下裁减能力;减少内存需求;运行的可预测性;提供实时调度策略;系统的规模紧凑;支持从ROM或RAM上引导和运行;对不同的硬件平台具有更好的可移植性。
|
|
|
(2)非实时嵌入式操作系统。这类操作系统不特别关注单个任务响应时限,其平均性能、系统效率和资源利用率一般较高,适合于实时性要求不严格的消费类电子产品,如个人数字助理、机顶盒等。
|
|
|
|
与通用计算机系统上的操作系统一样,EOS隔离了用户与计算机系统的硬件,为用户提供了功能强大的虚拟计算机系统,如下图所示。EOS主要由应用程序接口、设备驱动、操作系统内核等几部分组成。
|
|
|
|
|
EOS是一个按时序方式调度执行、管理系统资源并为应用代码提供服务的基础软件。每个EOS都有一个内核。另一方面,EOS也可以是各种模块的有机组合,包括内核、文件系统、网络协议栈和其他部件。但是,大多数内核都包含以下3个公共部件:
|
|
|
(1)调度器。是EOS的心脏,提供一组算法决定何时执行哪个任务。
|
|
|
(2)内核对象。是特殊的内核构件,帮助创建嵌入式应用。
|
|
|
(3)内核服务。是内核在对象上执行的操作或通用操作。
|
|
|
|
|
(1)任务。任务是独立执行的线程,线程中包含着独立的可调度的指令序列。实时应用程序的设计过程包括如何把问题分割成多个任务,每个任务是整个应用的一个组成部分,每个任务被赋予一定的优先级,有自己的一套寄存器和栈空间。在大多数典型的抢占式调度内核中,在任何时候,无论是系统任务还是应用任务,其状态都会处于就绪、运行、阻塞三个状态之一。另外,某些商业内核还定义了挂起、延迟等颗粒更细的状态。
|
|
|
(2)任务对象。任务是由不同的参数集合和支持的数据结构定义。在创建任务时,每个任务都拥有一个相关的名字、一个唯一的标识号ID、一个优先级、一个任务控制块、一个堆栈和一个任务的执行例程,这些部件一起组成一个任务对象。
|
|
|
(3)多任务。多任务是操作系统在预定的死线内处理多个活动的能力。多任务的运行使CPU的利用率得到最大地发挥,并使应用程序模块化。随着调度的任务数量的增加,对CPU的性能需求也随之增加,主要是由于线程运行的上下文切换增加的缘故。
|
|
|
(4)调度器。调度器是每个内核的心脏,调度器提供决定何时哪个任务运行的算法。多数实时内核是基于优先级调度的。
|
|
|
(5)可调度实体。可调度实体是一个可以根据预定义的调度算法,竞争到系统执行时间的内核对象。
|
|
|
(6)上下文切换。每个任务都有自己的上下文,它是每次被调度运行时所要求的寄存器状态,当多任务内核决定运行另外的任务时,它保存正在运行的任务的上下文,恢复将要运行下一任务的上下文,并运行下一任务,这个过程称为上下文切换。在任务运行时,其上下文是高度动态的。调度器从一个任务切换到另一个任务所需要的时间称为上下文切换开销。
|
|
|
(7)可重入性。指一段代码被一个以上的任务调用,而不必担心数据的破坏。具有可重入性的函数任何时候都可以被中断,一段时间以后继续运行,相应数据不会遭到破坏。
|
|
|
(8)分发器。分发器是调度器的一部分,执行上下文切换并改变执行的流程。分发器完成上下文切换的实际工作并传递控制。任何时候,执行的流程通过三个区域之一:应用任务、ISR(Interrupt Service Routines,中断服务程序)或内核。
|
|
|
根据如何进入内核的情况,分发的情况也有所不同。当一个任务是用系统调用时,分发器通常在每个任务的系统调用完成后退出内核。在这种情况下,分发器通常以调用一调用为基础的,因此,它可以协调由此引起的任何系统调用的任务状态转移。另一方面,如果一个ISR做系统调用,则分发器将被越过,直到ISR全部完成它的执行。
|
|
|
当前,大多数内核支持两种普遍的调度算法,即基于优先级的抢占调度算法和时间轮转调度算法。
|
|
|
|
基于优先级的抢占调度又可以分为静态优先级和动态优先级。静态优先级是指应用程序在执行的过程中各任务的优先级固定不变。在静态优先级系统中,各任务以及它们的时间约束在程序编译时是已知的;动态优先级是指应用程序在执行的过程中各任务的优先级可以动态改变。这种类型的调度,在任何时候运行的任务是所有就绪任务中具有最高优先级的任务,任务在创建时被赋予了优先级,任务的优先级可以由内核的系统调用动态而更改,这使得嵌入式应用对于外部事件的响应更加灵活,从而建立真正的实时响应系统。
|
|
|
一般情况下,可以采用单调执行速率调度法(Rate Monotonic Scheduling, RMS)来给任务分配优先级,基本原则是执行最频繁的任务优先级最高。RMS做了如下假设:
|
|
|
|
(2)任务间不需要同步,没有共享资源,没有任务间的数据交换等问题。
|
|
|
(3)系统采用抢占式调度,总是优先级最高且就绪的任务被执行。
|
|
|
|
|
|
|
要使一个具有n个任务的实时系统中的所有任务都满足硬实时条件,必须使下述定理成立(RSM定理)。
|
|
|
|
式中,Ei是任务i最长执行时间,Ti是任务i的执行周期,Ei/Ti是任务i所需的CPU时间。
|
|
|
基于RSM定理,要所有的任务满足硬实时条件,则所有有时间要求的任务总的CPU利用时间(或利用率)应当小于70%。通常,作为实时系统设计的一条原则,CPU利用率应当在60%~70%之间。
|
|
|
|
时间轮转调度算法为每个任务提供确定份额的CPU执行时间。显然,纯粹的时间轮转调度是不能满足实时系统的要求的。取而代之的是,基于优先级抢占式扩充时间轮转调度,对于优先级相同的任务使用时间片获得相等的CPU执行时间。内核在满足以下条件时,把CPU控制权转交给下一个就绪态的任务:
|
|
|
|
|
如下图所示,任务Task1、Task2、Task3具有相同的优先级,它们按照时间片运行,任务Task2被更高优先级的任务Task4抢占,当Task4执行完毕后恢复Task2的执行。
|
|
|
|
|
|
内核提供任务管理服务,也提供一个允许开发者操作任务的系统调用,典型的任务操作有任务创建和删除、任务调度控制、任务信息获取。
|
|
|
|
RTOS的用户可以使用内核对象来解决实时系统设计中的问题,如并发、同步与互斥、数据通信等。内核对象包括信号量、消息队列、管道、事件与信号等。
|
|
|
|
为了同步一个应用的多个并发线程和协调它们对共享资源的互斥访问,内核提供了一个信号量对象和相关的信号量管理服务。信号量是一个内核对象,就像一把锁,任务获取了该信号量就可以执行期望的操作或访问相关资源,从而达到同步或互斥的目的。
|
|
|
|
(1)二值信号量。二值信号量只能有两个值:0或1,当其值为0时,认为信号量不可使用。当其值为1时,认为信号量是可使用的。当二值信号量被创建时,既可以初始化为可使用的,也可以初始化为不可使用的。二值信号量通常作为全局资源,被需要信号量的所有任务共享。
|
|
|
(2)计数信号量。计数信号量使用一个计数器赋予一个数值,表示信号量令牌的个数,允许多次获取和释放。初始化时,如果计数值为0,表示信号量不可用;计数值大于0,表示信号量可用。每获取一次信号量其计数值就减1,每释放一次信号量其计数值就加1。在有些系统中,计数信号量允许实现的计数是有界的,有些则无界。同二值信号量一样,计数信号量也可用做全局资源。
|
|
|
(3)互斥信号量。互斥信号量是一个特殊的二值信号量,它支持所有权、递归访问、任务删除安全和优先级反转,以避免互斥固有的问题。互斥信号量初始为开锁状态,被任务获取后转到闭锁状态,当任务释放该信号量时又返回为开锁状态。
|
|
|
通常,内核支持以下几种操作:创建和删除信号量操作、获取和释放信号量操作、清除信号量的等待队列操作以及获取信号量的信息操作。
|
|
|
|
多数情况下,任务活动同步并不足以满足实时响应的要求,任务之间还必须能够交换信息。为了实现任务之间的数据交换,内核提供了消息队列对象和消息队列的管理服务。
|
|
|
消息队列是一个类似于缓冲区的对象,通过它,任务和ISR可以发送和接收消息,实现数据通信。消息队列暂时保存来自发送者的消息,直到有接收者准备读取这些消息为止。
|
|
|
大多数内核支持以下消息队列操作:创建和删除消息队列、发送和接收消息以及获取消息队列的信息等操作。
|
|
|
|
管道是提供非结构化数据交换和实现任务同步的内核对象。每个管道有两个端口,一端用来读,另一端用来写。数据在管道中就像一个非结构的字节流,数据按照FIFO方式从管道中读出。一般EOS内核支持两类管道对象:
|
|
|
(1)命名管道。具有一个类似于文件名的名字,像一个文件或设备出现在文件系统中,需要使用命名管道的任何任务或ISR都可以用误名字对其引用。
|
|
|
(2)无名管道。一般动态创建,且必须使用创建时返回的描述符才可引用此类型的管道。
|
|
|
通常,管道支持以下几种操作:创建和删除一个管道、读、写管道、管道控制、管道上的轮询。
|
|
|
|
某些特殊的EOS提供一个特殊的寄存器作为每个任务控制块的一部分,称为事件寄存器。它是一个属于任务的对象,并由一组跟踪指定事件的二值事件标志组成。EOS支持事件寄存器机制,创建一个任务时,内核同时创建一个事件寄存器作为任务控制块的一部分。经过事件寄存器,一个任务可以检查控制它执行的特殊事件是否出现。一个外部源(例如,另一个任务或中断处理程序)可以设置该事件寄存器的位,通知任务一个特殊事件的发生。任务说明它所希望接收的事件组,这组事件保存在寄存器中,同样,到达的事件也保存在接收的事件寄存器中。另外,任务还可以指示一个时限说明它愿意等待某个事件多长时间。如果时限超过,没有指定的事件达到任务,则内核唤醒该任务。
|
|
|
|
信号是当一个事件发生时产生的软中断,它将信号接收者从其正常的执行路径移开并触发相关的异步处理。本质上,信号通知其他任务或ISR运行期间发生的事件,与正常中断类似,这些事件与被通知的任务是异步的。信号的编号和类型依赖于具体的嵌入式系统的实现。通常,嵌入式系统均提供信号设施,任务可以为每个希望处理的信号提供一个信号处理程序,或是使用内核提供的默认处理程序,也可以将一个信号处理程序用于多种类型的信号。信号可以有被忽略、挂起、处理或阻塞等4种不同的响应处理。
|
|
|
|
条件变量是一个与共享资源相关的内核对象,它允许一个任务等待其他任务创建共享资源需要的条件。一个条件变量实现一个谓词,谓词是一组逻辑表达式,涉及共享资源的条件。谓词计算的结果是真或假,如果计算为真,则任务假定条件被满足,并且继续运行,反之,任务必须等待所需要的条件。当任务检查一个条件变量时,必须原子性地访问,所以,条件变量通常跟一个互斥信号量一起使用。
|
|
|
一个任务在计算谓词条件之前必须首先获取互斥信号量,然后计算谓词条件,如果为真,条件满足继续执行后续操作;否则,条件不满足,原子性地阻塞该任务并先释放互斥信号量。条件变量不是共享资源同步访问的机制,大多数开发者使用条件变量,让任务等待一个共享资源到达一个所需的状态。
|
|
|
|
大多数嵌入式处理器体系结构都提供了异常和中断机制,允许处理器中断正常的执行路径。这个中断可能由应用软件触发,也可由一个错误或不可预知的外部事件来触发。而大多数EOS则提供异常和中断处理的“包裹”功能,使嵌入式系统开发者避免底层细节。
|
|
|
|
异常是指任何打断处理器正常执行,迫使处理器进入特权执行模式的事件。异常可以分为同步异常和异步异常。同步异常是指程序内部与指令执行相关的事件引起的异常,例如,内存偶地址校准异常、除数为零异常等;异步异常是指与程序指令不相关的外部事件产生的异常,例如,系统复位异常、数据接收中断等。
|
|
|
同步异常可以分为精确异常和不精确异常。精确异常是指处理器的程序计数器可以精确地指出引起异常的指令。而在流水线或指令预取的处理器上则不能精确地判断引起异常的指令或数据,这时的异常称为不精确异常。
|
|
|
异步异常可以分为可屏蔽的异常和不可屏蔽的异常。可以被软件阻塞或开放的异步异常称为可屏蔽的异常,否则,为不可屏蔽异常。不可屏蔽的异常总是被处理器处理,例如,硬件复位异常。许多处理器具有一个专门的不可屏蔽中断请求线(NMI),任何连接到NMI请求线的硬件都可以产生不可屏蔽中断。
|
|
|
所有的处理器按照定义的次序处理异常,虽然每一种嵌入式处理器处理异常的过程不尽相同,但一般都会按照优先级次序来处理。从应用程序的观点看,所有的异常都具有比操作系统内核对象更高的优先级,包括任务、队列和信号量等。
|
|
|
中断也称为外部中断,是一个由外部硬件产生的事件引起的异步异常,大多数嵌入式处理器体系结构中将中断归为异常的一类。实时内核最重要的指标是中断关了多长时间。所有的实时系统在进入临界代码时都要关中断,执行完临界代码之后再开中断。中断延迟时间是指关中断的最长时间与开始执行中断服务子程序的第一条指令的时间之和,中断恢复时间是微处理器返回到被中断的程序代码所需要的时间。
|
|
|
从应用的观点来看,异常和外部中断是外部硬件和应用程序通信的一种机制。一般来讲,异常和中断可以在如下两个方面用在设计中:内部错误和特殊条件管理、硬件并发和服务请求管理。
|
|
|
|
计时器是实时嵌入式系统的一个组成部分。时间轮转调度算法、存储器定时刷新、网络数据包的超时重传以及目标机监视系统的时序等都严格依赖于计时器。许多嵌入式系统用不同形式的计时器来驱动时间敏感的活动,即硬件计时器和软件计时器。硬件计时器是从物理计时芯片派生出来的,超时后可以直接中断处理器,硬件计时器对精确的延迟操作具有可预测的性能。而软件计时器是通过软件功能调度的软件事件,能够对非精确的软件事件进行有效的调度,使用软件计时器可以减轻系统的中断负担。
|
|
|
|
(1)实时时钟:存在于嵌入式系统内部,用来追踪时间、日期的硬件计时设备。
|
|
|
(2)系统时钟:用来追踪从系统加电启动以来的事件时间或流失时间,可编程的间隔计时器驱动系统时钟,计时器每中断一次,系统时钟的值就递增一次。
|
|
|
(3)时钟节拍:也称为时钟滴答,是特定的周期性中断。中断之间的间隔取决于不同的应用,一般在10~200ms之间。而且时钟节拍率越快,系统的额外开销就越大。
|
|
|
(4)可编程计时器:一般是集成在嵌入式系统内部的专门计时硬件,用做事件计数器、流失时间指示器、速率可控的周期事件产生器等。使用独立的硬件计时器可以有效地降低处理器的负载。
|
|
|
(5)软件计时器:是应用程序安装的计数器,每次时钟中断,会递减一次,当计数器到达0时,应用的计时器超时,系统会调用安装的超时处理函数进行有关处理。
|
|
|
|
从系统开发者的观点看,I/O操作意味着与设备的通信,对设备初始化、执行设备与系统之间的数据传输以及操作完成后通知请求者。从系统的观点看,I/O操作意味着对请求定位正确的设备,对设备定位正确的驱动程序,并保证对设备的同步访问。
|
|
|
I/O设备、相关的驱动程序等共同组合成嵌入式系统的I/O子系统。下图是一个典型的微内核系统的层次模型图。
|
|
|
I/O子系统定义一组标准的I/O操作函数,以便于对应用隐藏设备的特性。所有的设备驱动程序都符合并支持这个函数集,给应用提供一个能够跨越各种类型I/O设备的统一的接口。
|
|
|
I/O子系统通常维护一个统一的设备驱动程序表,使用I/O子系统的工具函数,可以将任何驱动程序安装到此表或从表中删除。另外,还使用一个设备表来跟踪为每个设备所创建的实例。
|
|
|
|
|
|
|
|
VxWorks具有良好的持续发展能力、高性能的内核以及友好的用户开发环境。首先,它十分灵活,具有多达1800个功能强大的应用程序接口(Application Programming Interface, API)。其次,它适用面广,可以适用于从最简单到最复杂的产品设计。再次,它可靠性高,可以用于从防抱死刹车系统到星际探索的关键任务。最后,适用性强,可以用于所有流行的CPU平台。
|
|
|
|
Palm是一种32位的嵌入式操作系统,提供了串行通信接口和红外线传输接口,利用它可以方便地与其他外部设备通信、传输数据;拥有开放的OS应用程序接口,开发商可根据需要自行开发所需的应用程序。Palm是一套具有强开放性的系统。在编写程序时,Palm充分考虑了掌上电脑内存相对较小的情况,因此它只占有非常小的内存。由于基于Palm编写的应用程序占用的空间也非常小(通常只有几十千字节),所以,基于Palm的掌上电脑虽然只有几兆字节的内存,但可以运行众多应用程序。
|
|
|
由于Palm产品的最大特点是使用简便、机体轻巧,因此决定了Palm应具有以下特点。
|
|
|
(1)操作系统的节能功能。由于掌上电脑要求使用电源尽可能小,因此在Palm的应用程序中,如果没有事件运行,则系统设备进入半休眠的状态;如果应用程序停止活动一段时间,则系统自动进入休眠状态。
|
|
|
(2)合理的内存管理。Palm的存储器全部是可读写的快速RAM,动态RAM类似于PC(Personal Computer,个人计算机)上的RAM,它为全局变量和其他不需永久保存的数据提供临时的存储空间;存储RAM类似于PC上的硬盘,可以永久保存应用程序和数据。
|
|
|
(3)Palm的数据是以数据库的格式来存储的,为保证程序处理速度和存储器空间,在处理数据的时候,Palm不是把数据从存储堆复制到动态堆后再进行处理,而是在存储堆中直接处理。
|
|
|
(4)Palm与同步软件结合可以使掌上电脑与PC机上的信息实现同步,把台式机的功能扩展到了掌上电脑。
|
|
|
|
Windows CE也是一个开放的、可升级的32位嵌入式操作系统,是基于掌上电脑类的电子设备操作。Windows CE的图形用户界面相当出色。与PC上的Windows不同的是,Windows CE是所有源代码全部由微软自行开发的嵌入式新型操作系统,其操作界面虽来源于PC上的Windows,但Windows CE是基于Win32 API重新开发的、新型的信息设备平台。Windows CE具有模块化、结构化和基于Win32应用程序接口以及与处理器无关等特点。Windows CE不仅继承了传统的Windows图形界面,并且在Windows CE平台上可以使用PC上的Windows的编程工具(如Visual Basic、Visual C++等)、使用同样的函数、使用同样的界面风格,使绝大多数的应用软件只需简单的修改和移植就可以在Windows CE平台上继续使用。
|
|
|
Windows CE的设计目标是:模块化及可伸缩性、实时性能好,通信能力强大,支持多种CPU。它的设计可以满足多种设备的需要,这些设备包括了工业控制器、通信集线器以及销售终端之类的企业设备,还有像照相机、电话和家用娱乐器材之类的消费产品。一个典型的基于Windows CE的嵌入系统通常为某个特定用途而设计,并在不联机的情况下工作。它要求所使用的操作系统体积较小,内建有对中断的响应功能。
|
|
|
|
(1)具有灵活的电源管理功能,包括睡眠/唤醒模式。
|
|
|
(2)使用了对象存储技术,包括文件系统、注册表及数据库。它还具有很多高性能、高效率的操作系统特性,包括按需换页、共享存储、交叉处理同步、支持大容量堆等。
|
|
|
(3)拥有良好的通信能力。广泛支持各种通信硬件,亦支持直接的局域连接以及拨号连接,并提供与PC、内部网以及Internet(因特网)的连接,还提供与PC上的Windows的最佳集成和通信。
|
|
|
(4)支持嵌套中断。允许更高优先级别的中断首先得到响应,而不是等待低级别的ISR完成。这使得该操作系统具有嵌入式操作系统所要求的实时性。
|
|
|
(5)更好的线程响应能力。对高级别中断服务线程的响应时间上限的要求更加严格,在线程响应能力方面的改进,帮助开发人员掌握线程转换的具体时间,并通过增强的监控能力和对硬件的控制能力帮助他们创建新的嵌入式应用程序。
|
|
|
(6)256个优先级别。可以使开发人员在控制嵌入式系统的时序安排方面有更大的灵活性。
|
|
|
(7)Windows CE的API是Win32 API的一个子集,支持近1500个Win32 API。有了这些API,足以编写任何复杂的应用程序。当然,在Windows CE系统中,所提供的API也可以随具体应用的需求而定。
|
|
|
|
Linux是一个类似于UNIX的操作系统,Linux系统不仅能够运行于PC平台,还在嵌入式系统方面大放光芒。在各种嵌入式Linux迅速发展的状况下,Linux逐渐形成了可与Windows CE等嵌入式操作系统进行抗衡的局面。嵌入式Linux的特点如下:
|
|
|
|
(2)适用于不同的CPU,支持多种体系结构,如X86、ARM、ALPHA、SPARC等。
|
|
|
(3)能够提供完善的嵌入式图形用户界面以及嵌入式X-Windows。
|
|
|
(4)提供嵌入式浏览器、邮件程序、音频和视频播放器、记事本等应用程序。
|
|
|
(5)提供完整的开发工具和软件开发包,同时提供PC上的开发版本。
|
|
|
|
(7)常用嵌入式芯片的驱动集,支持大量的周边硬件设备,驱动丰富。
|
|
|
(8)针对嵌入式的存储方案,提供实时版本和完善的嵌入式解决方案。
|
|
|
(9)完善的中文支持,强大的技术支持,完整的文档。
|
|
|
(10)开放源码,丰富的软件资源,广泛的软件开发者的支持,价格低廉,结构灵活,适用面广。
|
|
|