天天看点

VxWorks操作系统及实时多任务程序设计

VxWorks操作系统及实时多任务程序设计 来源:http://www.et00.com 作者:刘尉悦、张万生、邢涛、王砚方 时间:2007-06-27 发布人: 谭欣

  摘 要:数字式声纳系统需要实时显示其搜索、跟踪结果,同时对用户命令作出及时的响应,并实时控制前端的硬件。本文基于VxWorks实时操作系统和X窗口系统的显示及控制程序设计,着重介绍实时多任务程序设计。

  关键词:实时 实时操作系统 VxWorks X/ Window

  系统概况

  本系统运行于VME总线系统(MVME177)上,通过VME背板总线与各模件交换数据对各处理模件进行控制并显示信号处理结果。MVME177模件运行于嵌入式实时操作系统VxWorks下,人机交互界面基于X窗口系统。

  一、 嵌入式实时操作系统VxWorks简介

   由于声纳系统在探测到某些目标(如鱼雷)后要迅速作出反应,所以要求控制及显示系统必须是实时操作系统。实时操作系统要求能够随时打断正在执行的任务, 对内部和外部发生的事件在确定的时间内作出响应。本系统采用的VxWorks 是由美国WindRiver开发的一种类UNIX的高性能嵌入式实时操作系统。它是目前世界上用户数量最大的实时操作系统,具有优越的技术性能、丰富的应 用软件支持、良好的技术服务和可靠的系统稳定性。

  VxWorks的主要性能特点有:

   (1) 高度可剪裁的微内核结构。VxWorks所需要的存储器空间大约为8KB~488KB(ROM)、620KB~29.3KB(RAM),具有极好的可伸缩性。

  (2) 高效的多任务调度。VxWorks 支持中断驱动的优先级抢占式调度和时间片轮转调度,并具有确定的、快速的上下文切换能力。

  (3) 灵活的任务间通信手段。支持信号灯、消息队列、管道、信号和套接字等进程间通信和互斥手段。

  (4) 支持诸如Ring buffer、Link list 等共享内存技术。

  (5) 确定的μs级的中断延迟时间。

  (6) 适用于多种物理介质的TCP/IP协议族支持和几乎所有常用的基于TCP/IP协议的应用层协议。

  (7) 极其丰富的板级支持软件包(BSP),支持多种处理器板。

  (8) 支持POSIX 1003.1b (实时扩充)。

  (9) 快速、灵活的I/O系统。

  (10) 支持MS/ DOS、RT/ 11和RAW等文件系统和网络文件系统(NFS)。

  (11) 灵活的启动方法。支持从ROM、本地磁盘以及网络启动。

  二、 VxWorks的一些技术特点

  VxWorks的特点主要在于嵌入式和实时性。由于嵌入式的特点,系统内核只有任务管理和简单的内存管理,在此之上可以根据需要配置各种功能模块,包括网络管理、文件系统、虚拟存储器等等。实时性则体现在实时调度算法和实时内核(高效的进程间通信、内存管理等)。

  VxWorks支持POSIX标准,所以POSIX的概念和接口以及一些策略都被支持。但为了提高系统性能,VxWorks另有一套接口及实现策略称为wind内核。下面的讨论主要针对wind内核。POSIX标准可以参见相关资料。

   (1) 任务 在VxWorks中,最小的程序运行单位称为任务(task)。每个任务包含一段固定的代码和数据空间。操作系统内核通过任务控制块(task control block)对它的执行、通信、资源等情况进行控制。任务具有就绪、阻塞、挂起和延迟等状态。

  与Linux和 WindowsNT下的进程不同的是:在VxWorks中,所有任务共同享有物理内存,存在于统一的线性空间中。每个任务没有自己独立的代码段和堆,只有 独立的动态栈。任务中的地址即是真正的物理地址。由于不需要进行地址空间映射,在任务切换时的上下文切换(context switch)时间大为减少,符合实时操作系统要求快速响应的原则。从这个意义上来说,VxWorks的任务更接近Linux和WindowsNT下的线 程(thread)。 VxWorks的代码段与堆共享减少了上下文切换时间,却带来了共享代码的可重入性(reentrancy)问题。如1个函数被2个任务所调用,当其中包 含对全局、静态变量等从堆中分配空间的数据进行访问时,就有可能产生冲突,从而引发错误。在应用软件开发时要加以注意。解决方法是使用局部变量(从栈中分 配空间)或使用信号灯对临界代码进行监控。

  (2) 任务调度 VxWorks有2种任务调度策略:优先级抢先调度和时间片轮转调度。这2种调度策略都是系统级的,与POSIX进程级的调度策略不同,即整个系统里要么 是优先级抢先调度,要么是时间片轮转调度;而POSIX标准下可以每个进程使用自己的调度策略。系统共有256个优先级。

  优先级抢先调度指的是一个优先级较低的任务正在执行中,另一个优先级高的任务进入就绪状态,则马上进行处理器抢先,执行高优先级任务,直到高优先级释放处理器(完成、挂起、阻塞等)才继续执行低优先级任务。

  优先级抢先调度可以保证实时系统的迅速响应特性,但是也带来1个问题:当系统中存在几个相同优先级的任务时,就会使单一任务独占处理器,直至完成。为此加入了基于优先级的时间片轮转调度方式。在不同优先级的任务间以抢先方式调度,相同优先级的任务则以时间片进行轮转。

  (3) 存储管理 在基本的wind内核中,任务直接操作线性物理内存,不存在虚拟存储等复杂的存储管理策略,这主要是从性能来考虑的。不过VxWorks也提供支持POSIX标准的虚拟存储区和共享内存(多处理器间共享)组件。

  

   (4) 任务间通信 在任务间传递控制信息时,通信量小,wind内核支持各种UNIX的通信手段:信号量(semaphore)、消息队列(message queue)、管道(pipe)、信号(signal)、套接字(socket)。信号量主要用于对临界资源访问的同步和互斥;消息队列多用于消息驱动机 制;管道是基于文件系统实现的任务间按先进先出方式传送数据的通信方式;信号相当于软中断;套接字机制主要用于网络通信。

  当任务间需要大量交换数据时,由于VxWorks直接操作物理内存,可以直接访问全局存储区,不需要特别的手段,与Linux下的共享存储段申请和WindowsNT中的存储映射文件方式不同。

   (5) 中断 在VxWorks下,所有中断服务程序都不属于任何一个任务,并且使用同一个栈进行数据存储,则中断将不会引起上下文切换,以实现高效的中断响应。中断与 各任务之间可以通过前面所述的各种手段进行通信,但要注意对中断服务程序有一些限制,例如不能进行可能导致阻塞的资源申请等等。

  (6) 文件系统 VxWorks支持多种本地文件系统:MS_DosFS、RawFS和RT/ 11FS,可根据具体配置选择;还支持网络文件系统NFS,可以没有局域文件系统。

   (7) 网络支持 Vxworks支持多种物理介质的TCP/IP协议族和几乎所有常用的基于TCP/IP协议的应用层协议,例如ARP、BOOTP、SLIP和FTP,甚 至其启动就是通过BOOTP或FTP方式取得系统映像文件的。 以上简单介绍了一些VxWorks的技术特点。要注意,这些特点都是跟VxWorks的特性——实时性与嵌入式密切相关的。

  三、 X窗口系统

  本系统采用美国Peritek公司的VCL/ V图形控制器插件进行显示输出和输入控制,客户界面基于X/ Window。X客户程序的开发选用美国SeaWeed公司的SeaWindM软件。

   X是美国麻省理工学院(MIT)研制的一个可移植的网络透明的窗口系统。它具有设备独立性和网络透明性的特点,即基于X开发的应用程序不需要重写或重新 编译就可以在新的显示硬件上执行,并且在网络环境下通过X可在网络任一节点上运行X的应用程序而不必考虑该节点的物理位置。

  四、 显示与控制系统的具体实现

   本系统的功能主要是初始化各处理模件、根据输入命令对各处理模件进行控制和对处理结果的实时显示。这些都是通过与相应子系统的数据通信来完成的。对通信 数据和策略的分析是系统设计的关键。系统与其他子系统中存在着这样几类通信数据:与前端模拟子系统的控制信息与数据、与数字信号处理子系统相关的控制信息 和数据、发射信号控制信息、显示数据以及从键盘和鼠标获得的输入信息。这几类数据都是通过VME背板总线传输,通过对VME地址空间直接读写进行访问。其 中由数字信号处理子系统送来的数据是由数据更新事件驱动的。为了满足实时性的要求,需要在每组结果数据更新之前完成通信,因此处理的优先级需要很高。

  基于上面的考虑,系统划分为4个任务:系统监控、显示与输入、子模件控制和错误处理。

  系统监控——提交和监控其他子任务。

  显示与输入——实时显示信号处理结果和产生输入消息。

  子模件控制——向各子模件发送控制参数和计算数据,由输入消息驱动。

  错误处理——根据错误类型进行相应处理:显示错误信息、重启动各模件、中止系统,由出错消息驱动。

   信号处理结果读取在显示和输入任务中完成,其驱动事件为处理结果更新。在被动声纳处理中,短时间能量积累的结果每64ms更新一次,平均功率谱结果每 1.5s更新一次;主动声纳处理的幅度信息数据率为1.3kb/s,频域处理结果更新率为5~10次/s。如果由信号处理模件在数据更新后向 MVME177发送中断事件,由于数据更新率差别较大,可能造成瞬间中断频繁,增加处理复杂度。所以采用定时中断,使用间隔为50ms的定时中断去检查数 据更新标志,既能保证实时数据刷新,又能简化处理结构。

  各任务间的大批量数据传输利用VxWorks的共享内存直接访问,而传递 控制消息多采用消息队列(message queue)。在显示和输入任务中有两类驱动事件:键盘、鼠标输入和显示数据更新。显示刷新的优先级应该高于人工输入,所以在这里使用了信号 (signal)。当任务捕获信号时,立即中断正在执行的流程,转而进行信号服务处理。完成后,继续原处理流程可以保证显示的实时刷新。

  各任务之间的通信机制由4个消息队列、1个定时中断和1个信号完成:

  消息队列SystemMsg:系统开机、系统关机、系统复位、系统重启等,由错误处理任务和键盘输入产生;由系统监控任务接收。

  消息队列ParamModifyMsg:更改前端硬件参数、DSP参数等,由键盘输入产生,由子模件控制任务接收。

  消息队列ErrorMsg:定义了各种错误类型,由各任务的出错接口产生;由错误处理任务接收。

  X消息队列:由显示和输入任务接收(被SeaWindM软件包封装)。 定时中断:由系统监控任务启动和停止,读取DSP处理结果。 信号处理:由显 示和输入任务注册,定时中断发送信号,接收到后进行数据显示。

  系统定义全局变量System_Data。其数据类型为自定义的System_Data_Struct结构。通过System_Data实现任务间的数据交换。

  结束语

  以上介绍了数字式声纳的显控系统的设计。基于VxWorks的多任务设计使系统的实时性和稳定性都非常好。目前该显控系统已通过测试,达到了系统的设计要求。

继续阅读