《基于VxWorks嵌入式系统的数据通信》课件第6章_第1页
《基于VxWorks嵌入式系统的数据通信》课件第6章_第2页
《基于VxWorks嵌入式系统的数据通信》课件第6章_第3页
《基于VxWorks嵌入式系统的数据通信》课件第6章_第4页
《基于VxWorks嵌入式系统的数据通信》课件第6章_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章VxWorks实时操作系统与应用6.1VxWorks概述6.2VxWorks系统的应用机制6.3VxWorks系统开发方法6.4本章小结6.1VxWorks概述

VxWorks嵌入式实时操作系统自1987年由美国WindRiver公司成功推出以来,得到了非常广泛的应用。随着信息技术的迅猛发展,嵌入式应用渗透到了人们生活的各个领域。VxWorks以其良好的持续发展能力、高性能的内核及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。同时,VxWorks也是目前软件工程师采用最多的用于开发实时嵌入式系统的商用实时操作系统,它为程序员提供了高效的实时多任务调度、中断管理、实时的系统资源及实时的任务间通信。

VxWorks操作系统自1996年进入中国以来,已被广泛地应用于通信、军事、航空、航天等高精尖及实时性要求极高的领域中,是研究嵌入式实时操作系统的一个极好工具。6.1.1VxWorks的特点

VxWorks是一款功能强大、独具特色的嵌入式操作系统,因此备受开发商的青睐。其主要特点如下:

(1)高性能的微内核。VxWorks具有一个高性能的、标准的嵌入式实时操作系统微内核Wind。该微微内核Wind具有高效的任务管理功能、任务之间切换时间短、中断延迟小、网络流量大的特点,能实现快速多任务切换、抢占式任务调度、多样化任务间通信手段等功能。

(2)强实时性。VxWorks系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。VxWorks提供的多任务机制中对任务的控制采用了优先级抢占和轮转调度机制,充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下了更大的余地。

(3)可伸缩性。VxWorks利用C/C++语言支持ANSIC标准,提供多达1800个应用程序接口(API),很容易在系统中实现各种复杂的数学运算。

(4)可移植性。VxWorks操作系统在各种CPU平台上提供了统一的编程接口和一致的运行特性,尽可能地屏蔽了不同CPU之间的底层差异。应用程序员可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。基于VxWorks操作系统的应用程序可以在不同CPU平台上轻松移植。

(5)可裁剪性。VxWorks中可裁剪的组件超过80个,用户可以根据自己的应用需求对VxWorks进行配置,产生具有各种不同功能集的操作系统映像。

(6)可靠性。VxWorks经过将近20年市场应用的验证,操作系统本身是高度可靠的,而另外构造一个高可靠性的系统也是要由整个系统设计来保证的,VxWorks操作系统为了支持软件可靠性设计,还提供了分布式消息队列和异常处理等机制支持系统的冗余设计和容错设计,因此能够胜任一些诸如飞行控制这样的关键性任务。

(7)具有友好的开发调试环境。VxWorks具有一个友好的集成开发环境Tornado,它可运行在多种主机上,便于操作、配置和应用程序的开发调试。

(8)较好的兼容性。VxWorks是最早兼容POSIX1003.1b标准的嵌入式实时操作系统之一。其良好的兼容性,使它在不同运行环境间可以方便地移植,从而使用户在开发和培训方面所做的工作得到保护,减少了开发时间和费用。

(9)支持多种开发和运行环境,几乎适用于所有的流行目标CPU平台。6.1.2VxWorks系统的组成及功能

VxWorks操作系统是一个32位的实时操作系统,支持32位以上的嵌入式微处理器,包括进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等部分。VxWorks实时操作系统构成如图6.1中虚线框内所示。VxWorks只占用了很小的存储空间,并可高度裁剪,保证了系统能以较高的效率运行。图6.1VxWorks结构框图

VxWorks系统主要由以下几部分组成。

1.高性能的实时微内核Wind

VxWorks的实时微内核Wind主要包括多任务调度(采用优先级抢占方式)、任务间的同步和通信机制及中断处理、定时器和内存管理机制。

2.I/O系统

VxWorks提供了一个快速灵活的I/O系统,包括UNIX标准的缓冲I/O和POSIX标准的异步I/O。VxWorks的I/O系统主要包括字符设备、块设备、虚拟设备(管道、Socket)、监控设备和网络设备等。

3.文件系统

VxWorks针对不同的设备提供了多种文件系统,支持外存储介质(磁盘、磁带、光盘等)的访问。在内部实现上,VxWorks的文件系统通过标准接口来连接,使其能够方便地在同类设备间移植。

4.板级支持包BSP

BSP为VxWorks提供了硬件环境的接口,使应用程序编码在很大程度上与目标板的硬件和结构无关。它包括硬件初始化、中断处理、定时器、内存地址映射、内存分配等。

5.网络系统

VxWorks的网络系统由标准的网络协议部分组成,即物理层、数据链路层、IP层、TCP层、应用层,基本上是移植了BSD4.4Unix的TCP/IP协议栈,仅在实时性上进行了较大的修改。为了增强系统的应用性和可移植性,在新版的VxWorks中增加了一个称为MUX层的接口层。VxWorks的网络系统结构如图6.2所示。

6.虚拟内存(VxVMI)与共享内存(VxMP)

VxVMI为带有MMU(内存管理单元)的目标板提供了虚拟内存机制,主要用于对指定内存区的保护。VxMP主要用于多处理器上运行的任务之间的信号量共享、消息队列和内存块管理。图6.2VxWorks的网络系统结构

7.目标代理目标代理遵循WDB(WindDebug)协议,允许目标机与主机上的Tornado开发工具相连,使用户可以远程调试应用程序。

8.工具库

VxWorks向用户提供了丰富的系统调用,包括中断处理、定时器、消息注册、内存分配、字符扫描、线缓冲和环缓冲管理及ANSIC标准。

9.VxWorks仿真器(VxSim)

VxSim可模拟VxWorks目标机的运行,用于应用系统的分析。6.2VxWorks系统的应用机制6.2.1任务管理机制

1.VxWorks任务任务是代码运行的一个映像,从系统的角度看,任务是竞争系统资源的最小运行单位。任务可以使用或者等待CPU、I/O设备及内存空间等系统资源,并独立于其他的任务,与它们一起并发运行。在VxWorks操作系统中,各功能模块均以任务的方式被系统调用。任务是指能够独立执行的一个功能或处理过程,是操作系统调度的基本单位。任务状态反映任务当前在系统所处的情形,一般包括五种状态:就绪、运行、睡眠、挂起和堵塞。系统根据任务的优先级别安排CPU时间,对不同优先级任务采用抢占式任务调度算法,对相同优先级任务采用轮询式调度算法。在对任务进行切换时,通过任务上下文保存任务的当前状态。任务创建的时候,一般要指定一个名字,也就是任务名。VxWorks操作系统返回一个长度为4字节并指向任务数据结构的任务ID号,大多数VxWorks操作系统程序使用任务ID号来定位某个任务,其中约定任务ID号为0值时表示任务调用。

VxWorks操作系统不需要唯一的任务名,但为了避免混乱,建议使用惟一的任务名。为了应用好开发工具Tornado,任务名不应与全局函数名和程序名冲突。对任务的操作使用taskLib中的库函数。taskLib中的库函数见表6.1。表6.1VxWorks常用的任务处理库函数

2.任务调度多任务系统需采用一种调度算法来为就绪态队列中的任务分配CPU。Wind内核采用基于优先级的抢占式任务调度算法作为它的默认调度策略,同时也提供了轮询式调度算法。

1)基于优先级的抢占式任务调度使用基于优先级的抢占式任务调度算法即当一个新任务优先级高于系统当前执行任务的优先级时,它将抢占CPU而执行。这种调度方法为每个任务指定不同的优先级。没有处于挂起或休眠态的最高优先级任务将一直运行下去。当更高优先级的任务由就绪态进入运行态时,系统内核立即保存当前任务的上下文,切换到更高优先级的任务。

Wind内核优先级划分为256级(0~255)。优先级0为最高优先级,优先级255为最低优先级。当任务被创建时,系统根据给定值分配任务优先级。然而,优先级也可以是动态的,能在系统运行时由用户通过系统调用taskPrioritySet()来加以改变。在图6.3中,Task1、Task2、Task3三个任务的优先级依次从低到高,任务Task 1最先运行,但它被Task 2和Task 3打断,因此最后运行完毕。图6.3抢占式任务调度算法

2)轮询式调度当所有相同优先级的任务处于就绪状态时,轮询式调度算法倾向于平均使用CPU。轮询式调度算法对于所有相同优先级的任务,通过时间片获得相同的CPU处理时间。在一组相同优先级的任务里,每个任务将在一个规定的时间间隔或时间片内执行。在任务的执行时间片内,如果该任务被阻塞或被更高优先级的任务抢占,那么其时间片数值将被保存,并且在其重新执行时恢复计数。对于抢占情况,当抢占的高优先级任务完成执行后,只要没有其他更高优先级任务抢占执行,那么原任务将继续执行。而对于任务阻塞情况,将根据任务优先级将其放在队列尾部。图6.4为三个相同优先级任务Task1、Task2、Task3的轮询式调度。任务Task2被一个更高优先级的任务Task4抢占。当Task4执行结束后,Task2将在其中止处继续执行。图6.4轮询式调度算法6.2.2中断处理中断处理过程是软件和硬件的综合。当CPU接收到来自外设的中断信号时,便立即停止当前正在执行的命令,保存现场,并转而执行指定的中断服务程序(ISR)。在中断服务程序执行结束后,CPU再次恢复现场,继续执行刚才被打断的工作。CPU对于中断的响应和处理过程基本上是一致的。在指令执行过程中,CPU会适时扫描、查询有无中断请求。在VxWorks中,将信号机制(Signal)称为“软中断”,而将硬件外设产生的中断称为“硬中断”。为了获得尽可能快的响应时间,VxWorks的中断处理程序运行在特定的上下文中不涉及任何任务上下文的切换。中断服务程序不是在规则的任务上下文中运行,这种处理方式给VxWorks带来了快速响应时间,同时也给中断服务程序带来如下约束:

(1)不能调用可能引起调用阻塞的函数。例如,ISR不能取信号量,因为一旦信号量不能获得,内核就会试图将当前调用任务挂起,而这是没法做到的。

(2)不能通过VxWorks驱动执行I/O口。除管道驱动程序(因为其设计允许由ISR进行写操作)外,大部分的驱动程序的实现都要求有任务上下文,因为它们可能要阻塞调用任务以等待设备完成传输。

(3)不能调用使用浮动协处理器的函数。表6.2中列出了所有ISR可以调用的函数。表6.2ISR可以调用的函数

VxWorks系统为中断处理提供了API,主要集中在库intLib和intArchLib()中,部分常用的设置中断函数如表6.3所示。中断事件不是孤立存在的,通常涉及到任务级代码,因此必须提供中断服务程序与一般任务的通信机制。VxWorks提供的中断服务程序与任务的通信机制有信号量、消息列队、管道及网络套接字等。信号量是诸多通信机制中常用的方法,通过中断服务程序释放某一信号量,相应的任务等待该信号量,从而完成一次通信,如图6.5所示。表6.3设置中断函数列表图6.5中断处理示意图6.2.3内存管理嵌入式系统中,将程序代码、数据和系统信息等所占用的内存之外的部分用于内存的动态分配,这个区域称为堆。内存管理主要是管理堆内存的动态分配和回收。通常,内存管理需要保存一些堆的信息,包括堆的起始地址、大小及分配表。在嵌入式VxWorks系统中,内存管理是由操作系统来完成的。内存管理的工作主要是监控哪些内存区域已被使用,哪些是空闲区域,在任务需要时为其分配内存空间,使用完毕之后释放空间。对于实时操作系统来说,内存管理必须是高效的,开销必须是可预见的。一种解决方法是预先分配内存,即在系统构造或编译时为每个任务指定其使用的内存空间。

VxWorks系统的基本内存管理是采用平板模式,所有进程直接寻址绝对物理地址,在进程间可以共享代码段、数据段和BSS段。VxWorks系统中的内存布局如图6.6所示。在VxWorks系统中由特定的宏定义和系统函数获得标准的系统内存地址,分别标志系统物理内存的起始地址、VxWorks的加载地址、系统内存区的起始地址、用户保留内存的起始地址以及物理内存的容量。可以看出,在系统内存区中有一段是分配给调试代理的,专门用于Host与Target间调试信息的传递和处理,而用户任务的任务堆栈、动态内存分配则都来自于剩余的系统内存区。内存管理模块运行在用户态。图6.6VxWorks系统中的内存布局对信号量的操作是原子级的,不可打断,分配时大量的时间花费在查找链表的过程中,但这不会影响到系统效率,因为这个过程是发生在任务的上下文中,是可以被其他高优先级的任务所抢占的。整个内存分配发生在内核级,此时任务抢占被禁止,如果高优先级的任务在此时变为就绪态,它就必须等待直到内核为低优先级的任务完成内存分配。有些操作系统甚至在这段时间禁止中断。这必定影响系统的实时性和效率。内存分配采用First-Fit(最先匹配)法,在空闲链表中查找内存块,从高地址开始,当找到第一个满足分配请求的空闲块时就分配所需的内存,并修改该空闲块的大小。空闲块的剩余部分仍然保留在空闲链表中。但在实时系统任务执行中,有时在内存分配时对链表查询的时间也是不可忍受的。一般情况下,我们采用MessageQueue来代替malloc(),在系统启动之初就分配好可能用到的内存块,并将它们放入消息队列,那么,在以后对实时要求很高的场合中,可以直接从消息队列中获得空闲内存块的指针,避免了查找时间的耗费。内存RAM包括动态存储器DRAW和静态存储器SRAW,SRAM主要用作高速缓存Cache。Cache是一种小容量的高速缓冲存储器,设置在CPU和主存间,存放主存最近被CPU访问的内容,从而提高了CPU存取的速度。6.2.4I/O与文件系统

VxWorks操作系统提供的I/O系统和文件系统,为应用层提供了标准的设备操作接口,并以最大程度屏蔽了应用层软件对硬件的相关性。

1.I/O系统

VxWorks的I/O系统适用于实时应用,具有高度可裁剪性。VxWorks的I/O系统自上而下分为三层:I/O子系统、驱动和设备,如图6.7所示。

I/O子系统是VxWorksI/O系统的一个子层,它为应用程序的I/O操作定义一组标准函数,同时要求下层的设备驱动支持这个函数集。图6.7I/O系统层次图在许多系统中,设备驱动只提供读/写等函数,如果要实现某种协议,如字符设备的通信协议,则是在I/O子系统中完成的。这种结构虽然简化了驱动程序的实现,但可裁剪性不好,不适于实时系统。在VxWorks中,I/O子系统通过查找文件描述符表、驱动表和设备链,将用户请求转发给设备驱动,由设备驱动完成I/O请求的所有相关操作。这样,所有I/O操作在驱动中完成,如果需要使用某个协议,也是在驱动中实现。同时,VxWorks提供标准协议的库函数以便设备驱动的开发者实现高层协议。

VxWorks的I/O系统提供了简单、统一、与设备无关的接口,其内部的独特设计使它比大多数其他I/O系统更快捷、更灵活。它支持以下设备:

(1)面向字符的设备,如UART。

(2)随机访问的块设备,如磁盘。

(3)虚拟设备,如管道、Socket。

(4)监控和控制设备,如数字/模拟I/O设备。

(5)网络设备。

2.文件系统文件系统是一种块I/O操作设备。VxWorks中的I/O系统可以包含多个不同类型的文件系统,用来协助完成非字符设备的I/O操作。实现文件系统要添加一些该文件系统特有的设备访问例程,还要有块I/O的驱动程序。通过文件系统访问设备具有抽象性好的优点。

VxWorks提供两个本地文件系统:dosFs和rt11Fs,它们分别与MS-DOS和RT-11文件系统相兼容,适用于块设备的实时应用。VxWorks提供相应的库dosFsLib和rt11FsLib,此外还为其他类型的设备提供了相应的文件系统,见表6.4。表6.4VxWorks文件系统6.3VxWorks系统开发方法

VxWorks系统是专门为嵌入式实时应用开发设计的模块化实时操作系统。基于VxWorks系统的特性,在开发设计实时多任务软件时要特别注重以下问题。6.3.1通信机制的选择本机之间的通信机制比较适用的是信号量和消息队列。在以下情况下可以考虑使用信号量:

(1)任务之间的同步。

(2) ISR与任务之间的同步,要求任务很快响应。

(3)互斥临界区的操作。

(4)两任务之间传递较大的数据块,使用信号量来保护全局共享结构。在以下情况下可以考虑使用消息队列:

(1)两个任务之间通信比较频繁,并且每一次的数据量较小。

(2)多个任务写,一个任务读。

(3)一个任务不仅与ISR进行通信,而且还与其他任务进行通信。

(4)强调优先级,必要时需要紧急传送数据。一般而言,可以用消息队列来代替管道。管道中的消息按FIFO排列,无法实现紧急数据传输;另外,管道对于高优先级的任务和低优先级的任务同等对待,无法减少高优先级任务的响应时间。当一个任务需要同时接收来自其他任务、网络接口、串行口的数据时,可以使用管道来简化编程。

Socket主要用于网际通信和本机任务之间通信效率比较低的场合。多个任务存取共享的数据时,一般使用信号量机制。

VxWorks下的Signal主要用于错误和异常处理,一般不用于任务之间的通信,这主要是因为信号的开销太大,以及带宽和信息量非常有限。Signal可用于事件的通知,不适用于复杂的交互。6.3.2正确划分任务程序在CPU中以任务的方式运行,故要将系统的处理框图转化为多任务流程图,对处理进行任务划分。如果任务太多,必然增加系统任务切换的开销;如果任务太少,系统的并行度就降低了,实时性就比较差。因此要对任务进行正确合理的任务划分。

1.合理的任务划分考虑系统内功能的异步性,在将一个软件系统分解成并行任务时,可遵循以下原则:

(1)在系统中创建多个与I/O设备相当数目的I/O任务。

(2)将在相同周期内执行的各功能组成一个任务。

(3)将紧密相关的功能组组成一个任务,使各功能共享资源或相同时间的驱动,减少了系统的开销。

(4)将有最后时间期限(Deadline)的功能分离出来,组成独立运行的任务。

(5)当计算功能占用CPU的时间较多时,捆绑计算功能任务,赋予它们较低优先级,运行时能被高优先级的任务抢占,消耗CPU的剩余时间。

2.错误的任务划分和改进方法

(1)任务的挂起和恢复太频繁,这是由于任务划分过细造成的。改进的方法是将任务变成子程序使用。

(2)事件发生时调用子程序,这是由于任务划分太粗造成的。改进的方法是将子程序划分为任务。

(3)得到消息后,又立即检查另外的信息。改进的方法是不要使用轮询的方式,直接使用时间驱动方式。6.3.3合理分配动态内存

VxWorks为用户提供了两种内存区域,即Region、Partition。Region是变长的内存区,用户可以从创建的Region中分配Segment,其特点是容易产生碎片,但灵活、不浪费。 Partition是定长的内存区,用户可以从创建的Partition中分配Buffer,其特点是无碎片、效率高,但浪费。衡量算法的指标是碎片和速度问题。所谓碎片是指内存中的空间大于被申请的空间,但是没有一块单独的内存空间大于被申请的空间。我们要求内存分配算法使碎片尽量少,执行速度尽量快。表6.5中比较了三种内存分配算法,其中最大算法的执行速度最快、碎片最少。但VxWorks采用的是最先算法。表6.5三种内存分配算法的比较

VxWorks没有清除碎片的功能,因为嵌入式实时系统找不到一个合适的时间把正在运行的程序暂停下来清理内存,所以在实时系统的设计中只能是避免碎片。影响碎片的因素有:Region的大小,Region越大则碎片越少;任务占用Segment的时间,占用的时间越短则碎片越少;Segment之间的准方差,Segment越规则则碎片越少。6.3.4防止任务异常操作系统发生死锁、饥饿或者优先级反转都会让任务处于异常状态。

1.死锁死锁是指多个任务因为等待进入对方占据的临界区而导致不可自行恢复的运行终止。在程序设计过程中要注意对死锁的预防,一个是尽量使互斥资源在相同优先级任务中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论