型号: PXF0262
VxWorks操作系统指南
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),被应用于各种嵌入式领域。包括过程控制(化工、食品加工),机器人(制造、自动操作控制),航空电子(飞行管理、GPS、喷气发动机控制),军事(武器管理、密码),数据处理(采集、信号处理),通信(税收机、数字电话),家电(微波炉、洗衣机、空调),计算机外围设备(打印机、Modem)等。
VxWorks是嵌入式系统应用中的软件平台,是包括各种硬件驱动和内核组件的集合,提供了各种适应嵌入式系统和实时应用的特性,以及一些帮助系统开发和调试的辅助机制。VxWorks提供了定制硬件的板级支持包BSP,实现硬件抽象。硬件抽象层可以提高应用代码的一致性,使应用在各种目标板上的移植变得容易进行。VxWorks还提供各种流行的硬件设备的驱动,如网卡、串口和存储器驱动等,使得开发者可以快速建立应用系统。
VxWorks本身和其应用程序都具有极好的可移植性。VxWorks库组件几乎都用C语言编写,可容易移植到不同的CPU上实现。VxWorks的发行版本直接对多种CPU提供支持。VxWorks 5.5有8类CPU版本,包括PowerPC、Pentium、MIPS、SH、Xscal、ARM、68K和ColdFire等。虽然众多版本对特定CPU有优化和定制,但是WIND RIVER公司的主要目的可能是出于商业和安全的考虑。而WIND RIVER内部开发肯定在不遗余力地维持VxWorks内核代码的可移植性。虽然有各种不同CPU版本的VxWorks,但提供的函数接口是一致的,加上BSP硬件抽象层的支持,而且VxWorks支持POSIX、ANSI和BSD Socket等通用标准,使得建立在VxWorks之上的应用代码也有较好的可移植性。另外,VxWorks还提供了高效的内核机制。系统调用采用普通的函数调用形式,而未采用操作系统通用的软件陷入机制,减少了系统调用花销,使得任务上下文切换速度加快,并使切换延迟确定。VxWorks可根据应用需求灵活配置,这主要是因为VxWorks软件平台具备组件式结构。VxWorks包括核心内核功能和依赖内核的外围功能,各种功能按组件形式提供。VxWorks可看作各种功能库的集合。各种功能库的选择加入,就能产生适应定制需求的各种不同功能集合的操作系统映像。
良好的持续发展能力、高性能的内核以及友好的用户开发环境,使得VxWorks在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18 战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。
2.1.1 VxWorks的特点
l 可靠性
操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。而稳定、可靠一直是VxWorks的一个突出优点。自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。
l 实时性
实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件作出响应的能力。实时性的强弱是以完成规定功能和作出响应时间的长短来衡量的。
VxWorks 的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。VxWorks 提供的多任务机制中对任务的控制采用了优先级抢占(Preemptive Priority Scheduling)和轮转调度(Round-Robin Scheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。
l 可裁减性
用户在使用操作系统时,并不是操作系统中的每一个部件都要用到。例如图形显示、文件系统以及一些设备驱动在某些嵌入系统中往往并不使用。
VxWorks 由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。VxWorks 内核最小为 8kB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。由于它的高度灵活性,用户可以很容易地对这一操作系统进行定制或作适当开发,来满足自己的实际应用需要。
l 对一个实时内核的要求
一个实时操作系统内核需满足许多特定的实时环境所提出的基本要求,这些包括:
1)多任务:由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。多任务提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执行。系统内核分配CPU给这些任务来获得并发性。
2)抢占调度:真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先级。基于优先级的抢占调度,任务都被指定了优先级,在能够执行的任务(没有被挂起或正在等待资源)中,优先级最高的任务被分配CPU资源。换句话说,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。
3)任务间的通讯与同步:在一个实时系统中,可能有许多任务作为一个应用的一部分执行。系统必须提供这些任务间的快速且功能强大的通信机制。内核也要提供为了有效地共享不可抢占的资源或临界区所需的同步机制。
4)任务与中断之间的通信:尽管真实世界的事件通常作为中断方式到来,但为了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。所以需要杂任务级和中断级之间存在通信。
2.1.2 VxWorks的基本结构
VxWorks操作系统由一下5部分构成:板级支持包BSP、微内核wind、网络系统、文件系统以及I/O系统。VxWorks内核只占用了很少的存储空间,并且可高度裁剪,从而保证了系统以较高的效率运行。
关键词:实时操作系统 任务 消息 VxWorks Tornado
摘 要:本文档对实时操作系统作了简要介绍,并针对VxWorks系统的特点进行了具体的说明和分析,从VxWorks系统的任务管理、通信机制、系统配置、系统接口几个方面展开。
实时多任务操作系统是能在确定的时间内执行其功能,并对外部的异步事件作出响应的计算机系统。多任务环境允许一个实时应用作为一系列独立任务来运行,各任务有各自的线程和系统资源。VxWorks系统提供多处理器间和任务间高效的信号灯、消息队列、管道、网络透明的套接字。 实时系统的另一关键特性是硬件中断处理。为了获得最快速可靠的中断响应,VxWorks系统的中断服务程序ISR有自己的上下文。
VxWorks实时操作系统由400多个相对独立的、短小精炼的目标模块组成,用户可根据需要选择适当模块来裁剪和配置系统,这有效地保证了系统的安全性和可靠性。系统的链接器可按应用的需要自动链接一些目标模块。这样,通过目标模块之间的按需组合,可得到许多满足功能需求的应用。
VxWorks操作系统的基本构成模块包括以下部分:
高效的实时内核Wind
VxWOrks实时内核(Wind)主要包括基于优先级的任务调度、任务同步和通信、中断处理、定时器和内存管理。
兼容实时系统标准POSIX
VxWOrks提供接口来支持实时系统标准P.1003.1b.
I/O系统
VxWOrks提供快速灵活的与ANSI-C相兼容的I/O系统,包括UNIX的缓冲I/O和实时系统标准POSIX的异步I/O。VxWOrks包括以下驱动:
网络 --- 网络设备(以太网、共享内存)
管道 --- 任务间通信
RAM --- 驻留内存文件
SCSI --- SCSI硬盘,磁碟,磁带
键盘 --- PC x86键盘(BSP仅支持x86)
显示器 --- PC x86显示器(BSP仅支持x86)
磁碟 --- IDE和软盘(BSP仅支持x86)
并口 --- PC格式的目标硬件
本机文件系统
I/O系统
VxWorks的文件系统与MS-DOS、RT-11、RAM、SCSI等相兼容。
网络特性
VxWorks网络能与许多运行其它协议的网络进行通信,如TCP/IP、4.3BSD、NFS、UDP、SNMP、FTP等。VxWorks可通过网络允许任务存取文件到其它系统中,并对任务进行远程调用。
虚拟内存(可选单元VxVMI)
VxVMI主要用于对指定内存区的保护,如内存块只读等,加强了系统的健壮性。
共享内存(可选单元VxMP)
VxMP主要用于多处理器上运行的任务之间的共享信号量、消息队列、内存块的管理。
驻留目标工具
Tornado集成环境中,开发工具工作于主机侧。驻留目标外壳、模块加载和卸载、符号表都可进行配置。
Wind基类
VxWorks系统提供对C++的支持,并构造了系统基类函数。
工具库
VxWorks系统向用户提供丰富的系统调用,包括中断处理、定时器、消息注册、内存分配、字符串转换、线性和环形缓冲区管理,以及标准ANSI-C程序库。
性能优化
VxWorks系统通过运行定时器来记录任务对CPU的利用率,从而进行有效地调整,合理安排任务的运行,给定适宜的任务属性。
目标代理
目标代理可使用户远程调试应用程序。
板级支持包
板级支持包提供硬件的初始化、中断建立、定时器、内存映象等。
VxWorks仿真器(VxSim)
可选产品VxWorks仿真器,能模拟VxWorks目标机的运行,用于应用系统的分析。
VxWorks内核(wind)的基本功能可以分为如下几大类:
u 任务管理;
u 事件和异步信号服务;
u 信号量服务;
u 消息队列服务;
u 内存管理;
u 中断服务程序;
u 时钟管理和定时器服务;
u 出错处理。
在以下各节中将对VxWorks内核的各类功能分别进行描述。
任务是代码运行的一个映象,从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、I/O设备及内存空间等系统资源,并独立于其它任务,与它们一起并发运行(宏观上如此)。VxWorks内核使任务能快速共享系统的绝大部分资源,同时有独立的上下文来控制个别线程的执行。
多任务设计能随时打断正在执行着的任务,对内部和外部发生的事件在确定的时间里作出响应。VxWorks实时内核Wind提供了基本的多任务环境。从表面上来看,多个任务正在同时执行,实际上,系统内核根据某一调度策略让它们交替运行。系统调度器使用任务控制块的数据结构(简记为TCB)来管理任务调度功能。任务控制块用来描述一个任务,每一任务都与一个TCB关联。TCB包括了任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务最初被激活时以及从休眠态重新被激活时,要用到这些信息。
此外,TCB还被用来存放任务的"上下文"(context)。任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。在任务被重新执行时,必须要恢复上下文。通常,上下文就是计算机当前的状态,也即各个寄存器的内容。如同在发生中断所要保存的内容一样。当发生任务切换时,当前运行的任务的上下文被存入TCB,将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。于是转而执行这个任务,执行的起点是前次它在运行时被中止的位置。
VxWorks中,内存地址空间不是任务上下文的一部分。所有的代码运行在同一地址空间。如每一任务需各自的内存空间,需可选产品VxVMI的支持。
实时系统的一个任务可有多种状态,其中最基本的状态有四种:
就绪态:任务只等待系统分配CPU资源;
悬置态:任务需等待某些不可利用的资源而被阻塞;
休眠态:如果系统不需要某一个任务工作,则这个任务处于休眠状态;
延迟态:任务被延迟时所处状态;
当系统函数对某一任务进行操作时,任务从一种状态迁移到另一状态。处于任一状态的任务都可被删除。
状态迁移 调用
就绪态 ----> 悬置态 semTake()/msgQReceive()
就绪态 ----> 延迟态 taskDelay()
就绪态 ----> 休眠态 taskSuspend()
悬置态 ----> 就绪态 semGive()/msgQSend()
悬置态 ----> 休眠态 taskSuspend()
延迟态 ----> 就绪态 expired delay
延迟态 ----> 休眠态 taskSuspend()
休眠态 ----> 就绪态 taskResume()/taskActivate()
休眠态 ----> 悬置态 taskResume()
休眠态 ----> 延迟态 taskResume()
多任务调度须采用一种调度算法来分配CPU给就绪态任务。Wind内核采用基于优先级的抢占式调度法作为它的缺省策略,同时它也提供了轮转调度法。
基于优先级的抢占式调度,它具有很多优点。这种调度方法为每个任务指定不同的优先级。没有处于悬置或休眠态的最高优先级任务将一直运行下去。当更高优先级的任务由就绪态进入运行时,系统内核立即保存当前任务的上下文,切换到更高优先级的任务。
多任务调度须采用一种调度算法来分配CPU给就绪态任务。Wind内核采用基于优先级的抢占式调度法作为它的缺省策略,同时它也提供了轮转调度法。
基于优先级的抢占式调度,它具有很多优点。这种调度方法为每个任务指定不同的优先级。没有处于悬置或休眠态的最高优先级任务将一直运行下去。当更高优先级的任务由就绪态进入运行时,系统内核立即保存当前任务的上下文,切换到更高优先级的任务。
Wind内核划分优先级为256 级(0~255)。优先级0为最高优先级,优先级255为最低。当任务被创建时,系统根据给定值分配任务优先级。然而,优先级也可以是动态的,它们能在系统运行时被用户使用系统调用taskPrioritySet()来加以改变,但不能在运行时被操作系统所改变。
轮转调度法分配给处于就绪态的每个同优先级的任务一个相同的执行时间片。时间片的长度可由系统调用KernelTimeSlice()通过输入参数值来指定。很明显,每个任务都有一运行时间计数器,任务运行时每一时间滴答加1。一个任务用完时间片之后,就进行任务切换,停止执行当前运行的任务,将它放入队列尾部,对运行时间计数器置零,并开始执行就绪队列中的下一个任务。当运行任务被更高优先级的任务抢占时,此任务的运行时间计数器被保存,直到该任务下次运行时。
Wind内核可通过调用taskLock()和taskUnlock()来使调度器起作用和失效。当一个任务调用taskLock()使调度器失效,任务运行时没有基于优先级的抢占发生。然而,如果任务被阻塞或是悬置时,调度器从就绪队列中取出最高优先级的任务运行。当设置抢占禁止的任务解除阻塞,再次开始运行时,抢占又被禁止。这种抢占禁止防止任务的切换,但对中断处理不起作用。
程序代码和数据的出错,如非法命令、总线或地址错误、被零除等。VxWorks异常处理包,一般是将引起异常的任务休眠,保存任务在异常出错处的状态值。内核和其它任务继续执行。用户可借助Tornado开发工具,查看当前任务状态,从而确定被休眠的任务。
VxWorks内核的任务管理提供了动态创建、删除和控制任务的功能,具体实现通过如下一些系统调用:
taskSpawn() 创建(产生并激活)新任务
taskInit() 初始化一个新任务
taskActivate() 激活一个已初始化的任务
taskName() 由任务ID号得到任务名
taskNameToId() 由任务名得到任务ID号
taskPriorityGet() 获得任务的优先级
taskIsSuspended() 检查任务是否被悬置
taskIsReady() 检查任务是否准备运行
taskTcb() 得到一个任务控制块的指针
taskDelete() 中止指定任务并自由内存(仅任务堆栈和控制块)
taskSafe() 保护被调用任务
taskSuspend() 悬置一个任务
taskResume() 恢复一个任务
taskRestart() 重启一个任务
taskDelay() 延迟一个任务
VxWorks支持各种任务间通信机制,提供了多样的任务间通信方式,主要有如下几种:
Ÿ 共享内存,主要是数据的共享;
Ÿ 信号量,用于基本的互斥和任务同步;
Ÿ 消息队列和管道,单CPU的消息传送;
Ÿ Socket和远程过程调用,用于网络间任务消息传送;
Ÿ 二进制信号,用于异常处理。
在多处理器之间的任务也可采用共享内存对象来实现任务间通信,只是在系统配置上有所不同.
任务间通信的最简单的方法是采用共享存储区,也即相关的各个任务分享属于它们的地址空间的同一内存区域。因为所有任务都存在于单一的线性地址空间,任务间共享数据。全局变量、线性队列、环形队列、链表、指针都可被运行在不同上下文的代码所指向。
当某一地址空间用于数据交换时,为了避免冲突,对于内存的锁定是非常重要的。两个或多个任务读写某些共享数据时,最后的结果取决于任务运行的精确时序,有可能得到错误值,这样必须以某种手段确保当一个任务在使用一个共享变量或文件时,其他任务不能做同样的操作。主要有关中断、抢占禁止和用信号量锁定资源等方法。一般来说,关中断是最有效的解决互斥的方法。但这对于实时应用来说,它阻止系统对外部事件的响应,无法满足实时性的要求。同样,中断延迟也是不能接受。
VxWorks信号量提供最快速的任务间通信机制,它主要用于解决任务间的互斥和同步。针对不同类型的问题,有以下三种信号量:
Ÿ 二进制信号量 使用最快捷、最广泛,主要用于同步或互斥;
Ÿ 互斥信号量 主要用于优先级继承、安全删除和回溯;
Ÿ 计数器
VxWorks还提供POSIX信号量和多处理器上信号量的应用。
现实的实时应用由一系列互相独立又协同工作的任务组成。信号量为任务间同步和联锁提供了高效方法。单处理器中任务间消息的传送采用消息消息队列。消息机制使用一个被各有关进程共享的消息队列,任务之间经由这个消息队列发送和接收消息。
任务间全双工信息传送
管道用VxWorks的I/O系统提供一种灵活的消息传送机制,它是受驱动器pipeDrv(VxWorks所提供)管理的虚拟I/O设备。任务能调用标准的I/O函数打开、读出、写入管道。当任务试图从一个空的管道中读取数据,或向一个满的管道中写入数据时,任务被阻塞。和消息队列类似,ISR能向管道中写入信息,但不能从中读取。象I/O设备一样,管道有一个消息队列所没有的优势----调用select(),任务等待一系列I/O设备上的数据。
Wind信号量对于各种类型的信号量的控制提供了同一规范化的接口,仅创建函数要特别指明信号量类型。
semBCreate() 创建(产生并激活)一个二进制信号量
semMCreate() 创建(产生并激活)一个互斥信号量
semCCreate() 创建(产生并激活)制一个计数信号量
semDelete() 中止并自由信号量
semTake() 获得信号量
semGive() 给出信号量
semFlush() 解锁所有正等待某一信号量的任务
Wind 消息队列管理:
msgQCreate() 创建(产生并激活)消息队列
msgQDelete() 中止并自由信号量
msgQSend() 向消息队列发送消息
msgQReceive() 从消息队列接收消息
VxWorks提供了强大的网络功能,能与其它许多主机系统进行通信。网络完全兼容4.3BSD,也兼容SUN公司的NFS。这种广泛的协议支持在主机和VxWorksh目标机之间提供了无缝的工作环境,任务可通过网络向其它系统的主机存取文件,即远程文件存取,也支持远程过程调用。通过以太网,采用TCP/IP和UDP/IP协议在不同主机之间传送数据。
VxWorks提供了如下一些网络工具完成信息传送:
Ÿ Sockets
完成运行在VxWorks系统或其它系统之间任务的消息传送;
Ÿ http://www.51lm.cn/p/templates/cn/show.php?cid=0&aid=262