嵌入式VxWorks全程学习总结.doc_第1页
嵌入式VxWorks全程学习总结.doc_第2页
嵌入式VxWorks全程学习总结.doc_第3页
嵌入式VxWorks全程学习总结.doc_第4页
嵌入式VxWorks全程学习总结.doc_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式VxWorks学习总结报告嵌入式VxWorks学习总结作者: 学号: 单位: 日期: 2010-10-21 1目 录1 嵌入式VxWorks OS介绍12 VxWorks开发42.1 Tornado开发工具42.1.1 安装过程42.1.2 内部组件52.1.3 使用说明72.2 VxWorks开发策略12.2.1 交叉调试开发12.2.2 板级支持包BSP12.2.3 任务调度42.2.4 信号量62.3 VMWare上安装VxWorks92.3.1 概述92.3.2 准备工作92.3.3 开始安装102.3.4 编译程序122.3.5 制作引导磁盘142.3.6 配置FTP服务器142.3.7 创建VxWorks系统152.3.8 配置联机调试环境162.4 PC机上安装VxWorks182.4.1 概述182.4.2 开发前准备192.4.3 修改BSP192.4.4 网卡配置202.4.5 制作启动盘222.4.6 后续配置与开发232.5 软件界面开发232.5.1 WindML与中文显示232.5.2 WindML环境配置262.5.3 汉字显示方案282.5.4 WindML注意事项293 开发和问题293.1 VxWorks开发工作293.1.1 硬件环境搭建303.1.2 网络通信303.1.3 基于缓冲队列的多任务网络通信323.1.4 命令通道与任务优先级333.1.5 双网卡通信343.1.6 中西文混合输出364 参考资料39371 嵌入式VxWorks OS介绍VxWorks是目前世界上用户数量最大的实时操作系统,它具有高度可剪裁的微内核结构、高效的多任务调度、灵活的任务间通信手段、快速灵活的I/O系统、确定的s级中断延迟时间等优点。作为实时多任务操作系统,VxWorks采用中断处理与普通任务分别在不同的堆栈中处理的中断处理机制,中断服务程序只完成在最小时间内通告中断的发生,而将其他非实时处理尽量通过中断与任务间的通信机制放在被引发的任务上下文完成。这样就能保证任务在确定的时间内执行,满足虚拟试验实时信息传输与处理的要求。目前最重要的RTOS主要包括:第一类、传统的经典RTOS:最主要的便是Vxworks操作系统,以及其Tornado开发平台。Vxworks因出现稍早,实时性很强(据说可在1ms内响应外部事件请求),并且内核可极微(据说最小可8K),可靠性较高等,所以在北美,Vxworks占据了嵌入式系统的多半疆山。特别是在通信设备等实时性要求较高的系统中,几乎非Vxworks莫属。Vxworks的很多概念和技术都和Linux很类似,主要是C语言开发。像Bell-alcatel、Lucent、华为等通信企业在开发产品时,Vxworks用得很多。但Vxworks因价格很高,所以一些小公司或小产品中往往用不起。目前很多公司都在往嵌入式Linux转(听说华为目前正在这样转)。但无论如何,Vxworks在一段长时间内仍是不可动摇的。与Vxworks类似的稍有名的实时操作系统还有pSOS、QNX、Nucleus等RTOS。第二类、嵌入式Linux操作系统:Linux的前途除作为服务器操作系统外,最成功的便是在嵌入式领域的应用,原因当然是免费、开源、支持软件多、呼拥者众,这样嵌入式产品成本会低。Linux本身不是一个为嵌入式设计的操作系统,不是微内核的,并且实时性不强。目前应用在嵌入式领域的Linux系统主要有两类:一类是专为嵌入式设计的已被裁减过的Linux系统,最常用的是uClinux(不带MMU功能),目前占较大应用份额,可在ARM7上跑;另一类是跑在ARM 9上的,一般是将Linux 2.4.18内核移植在其上,可使用更多的Linux功能(当然uClinux更可跑在ARM 9上)。很多人预测,嵌入式Linux预计将占嵌入式操作系统的50%以上份额,非常重要。缺点是熟悉Linux的人太少,开发难度稍大。另外,目前我们能发现很多教材和很多大学都以ucOS/II为教学用实时操作系统,这主要是由于ucOS/II较简单,且开源,非常适合入门者学习实时操作系统原理,但由于ucOS/II功能有限,实用用得较少。目前Intel、Philip都在大搞ARM+LINUX的嵌入式开发,Fujitum则是在自己的处理器上大搞Linux开发。第三类、 Windows CE嵌入式操作系统:Microsoft也看准了嵌入式的巨大市场,MS永远是最厉害的,WinCE出来只有几年时间,但目前已占据了很大市场份额,特别是在PDA、手机、显示仪表等界面要求较高或者要求快速开发的场合,WinCE目前已很流行(据说有一家卖工控机的公司板子卖得太好,以至来不及为客户裁减WinCE)。WinCE目前主要为4.2版(.NET),开发平台主要为WinCE Platform Builder,有时也用EVC环境开发一些较上层的应用,开发环境方便快速,微软的强大技术支持,WinCE开发难度远低于嵌入式Linux。对于急于完成,不想拿嵌入式Linux冒险的开发场合,WinCE是最合适了。根据不同的侧重点,WinCE还有两个特殊版本,一个是MS PocketPC操作系统专用于PDA上(掌上电脑),另一个是MS SmartPhone操作系统用于智能手机上(带PDA功能的手机),两者也都属于WinCE平台。在PDA和手机市场上,除WinCE外,著名的PDA嵌入式操作系统还有Palm OS(因出现很早,很有名)、Symbian等。实时多任务操作系统是能在确定的时间内执行其功能,并对外部的异步事件作出响应的计算机系统。多任务环境允许一个实时应用作为一系列独立任务来运行,各任务有各自的线程和系统资源。VxWorks系统提供多处理器间和任务间高效的信号灯、消息队列、管道、网络透明的套接字。 实时系统的另一关键特性是硬件中断处理。为了获得最快速可靠的中断响应,VxWorks系统的中断服务程序ISR有自己的上下文。VxWorks实时操作系统由400多个相对独立的、短小精炼的目标模块组成,用户可根据需要选择适当模块来裁剪和配置系统,这有效地保证了系统的安全性和可靠性。系统的链接器可按应用的需要自动链接一些目标模块。这样,通过目标模块之间的按需组合,可得到许多满足功能需求的应用。VxWorks操作系统的基本构成模块包括以下部分:(1)高效的实时内核WindVxWorks实时内核(Wind)主要包括基于优先级的任务调度、任务同步和通信、中断处理、定时器和内存管理。(2)兼容实时系统标准POSIXVxWorks提供接口来支持实时系统标准P.1003.1b.(3)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格式的目标硬件(4)本机文件系统VxWorks的文件系统与MS-DOS、RT-11、RAM、SCSI等相兼容。(5)网络特性VxWorks网络能与许多运行其它协议的网络进行通信,如TCP/IP、4.3BSD、NFS、UDP、SNMP、FTP等。VxWorks可通过网络允许任务存取文件到其它系统中,并对任务进行远程调用。(6)虚拟内存(可选单元VxVMI)VxVMI主要用于对指定内存区的保护,如内存块只读等,加强了系统的健壮性。(7)共享内存(可选单元VxMP)VxMP主要用于多处理器上运行的任务之间的共享信号量、消息队列、内存块的管理。(8)驻留目标工具Tornado集成环境中,开发工具工作于主机侧。驻留目标外壳、模块加载和卸载、符号表都可进行配置。(9)Wind基类VxWorks系统提供对C+的支持,并构造了系统基类函数。(10)工具库VxWorks系统向用户提供丰富的系统调用,包括中断处理、定时器、消息注册、内存分配、字符串转换、线性和环形缓冲区管理,以及标准ANSI-C程序库。(11)性能优化VxWorks系统通过运行定时器来记录任务对CPU的利用率,从而进行有效地调整,合理安排任务的运行,给定适宜的任务属性。(12)目标代理目标代理可使用户远程调试应用程序。(13)板级支持包板级支持包提供硬件的初始化、中断建立、定时器、内存映象等。(14)VxWorks仿真器(VxSim)可选产品VxWorks仿真器,能模拟VxWorks目标机的运行,用于应用系统的分析。VxWorks的特点如下: (1)可靠性。操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。而稳定、可靠一直是VxWorks的一个突出优点。自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。 (2)实时性。实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件作出响应的能力。实时性的强弱是以完成规定功能和作出响应时间的长短来衡量的。VxWorks 的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。VxWorks 提供的多任务机制中对任务的控制采用了优先级抢占(Preemptive Priority Scheduling)和轮转调度(Round-Robin Scheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。(2)可裁减性。用户在使用操作系统时,并不是操作系统中的每一个部件都要用到。例如图形显示、文件系统以及一些设备驱动在某些嵌入系统中往往并不使用。VxWorks 由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。VxWorks 内核最小为 8kB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。由于它的高度灵活性,用户可以很容易地对这一操作系统进行定制或作适当开发,来满足自己的实际应用需要。2 VxWorks开发2.1 Tornado开发工具2.1.1 安装过程安装包Tornado解压后的目录结构如下图所示,CRACK如其名字所示,就是破解文件夹了,序列号和crack文件都在其中。1、进入Tornado目录,安装Tornado,提示输入序列号什么的就到Crack文件夹中去找。2、如果安装目录为C:Tornado2.2,则在其目录下新建文件夹flexlm,将安装光盘下的CRACK目录下的license.dat拷贝到c:Tornado2.2flexlm。3、安装完毕后,如果从开始菜单直接运行tornado,会提示错误,这是因为安装还没有完成,在C盘Tornado2.2文件夹下你会发现一个setup.log文件,用ultraedit或vim打开,在最后一行你会发现一个注册表键值,进入注册表,找到这个键值HKEY_LOCAL_MACHINESOFTWAREFLEXlm License ManagerLM_LICENSE_FILE,将其值修改为:c:Tornado2.2flexlmlicense.dat另外一种破解方法是在windows里面设置一个环境变量LM_LICENSE_FILE = c:Tornado2.2flexlmlicense.dat到此为止,Tornado就能在XP系统上跑起来了。Tornado的文件树:2.1.2 内部组件WindRiver公司提供的软件产品分为两部分:开发环境Tornado和实时操作系统VxWorks。Tornado的启动界面见图5-1。运行Tornado的一方称为宿主机,而运行VxWorks的一方称为目标机,二者根据实际应用可以采用网络或串行线连接,满足WDB协议(见图5-2)。在图4-4所示的WTX和WDB两个协议最为重要,负责主机各个工具和目标机的通信。其中WTX(Windriver Tools eXchange)负责主机开发工具和Target Server之间的通信。而WDB(Wind DeBug)负责主机的Target Server和目标机的WDB Agent(Target Agent)之间的通信。WDB Agent实现Target Server的请求,并且返回结果。请求包括:内存操作、断点设置、虚拟I/O支持和任务控制等。Target Server在主机上运行。一个Target Server代表一个目标机,所有的主机工具都通过它来访问目标机。图5-1 Tornado启动界面图5-2 主机与目标机的连接Tornado 2.2主要组成部分有:1 集成的源代码编辑器(可惜不支持汉字输入)。2 工程管理工具。3 集成的C和C编译器和make工具。4 浏览器,用于收集可视化的资源,监视目标系统。5 CrossWind,图形化的增强型调试器。6 WindSh,C语言命令外壳,用于控制目标机。7 VxSim,集成的vxworks目标机仿真器。8 WindView,集成的软件逻辑分析仪。9 可配置的各种选项,可以改变归Tornado GUI的外观等。2.1.3 使用说明Tornado 2.2 IDE运行在我们的宿主机(Host)上。主界面如下图所示。包括菜单、工具栏、主工作区和程序编辑区。主工作区(Workspace)中可以集中管理所有的工程项目。工程有两种格式:bootable和downloadable。第一种经编译后生成的映象文件已经包括了vxworks内核,可直接在目标板上完成自启动、装入内核并运行应用程序。所以一般作为生产用映象。第二种则只是纯粹的动用程序,生成的映象文件不包括vxworks内核,一般为.out格式文件,所以不能在目标板上自动运行。它要求目标板上要有固化的bootrom通过网络或串口下载vxworks内核到目标板,并建立相关的运行环境。然后通过宿主机上的target Server下载到目标机上运行。所以它一般用在工程调试阶段。下面以arm为例分别就两种格式作一个详细的论述。(1)创建bootable格式的工程。启动tornado后进入”file-new project”出现如下的界面:选择“Creat a bootable VxWorks image”后点击OK,并按要求输入工程名称和位置。出现如下界面:此时要选择你工程所基于的BSP目录。然后系统自动为你在工作区生成一个你指定名称(Project0)的工程。如下所示:工程下的文件为系统文件,大部分为bsp文件,一般不需要去修改。如何添加自己的应用文件到该工程中呢?将鼠标“Project0”上,点击右键。出现如下的界面:左键点击“add Files”选择文件的所在目录,就可以添加你的文件了。只添加不和系统提供的文件“连”起来是没有用的,在usrAppInit.c中加入一条任务生成的语句,如下图所示:其中“myDemoTask”为你应用程序中的第一个入口程序。当然在usrAppInit()之前应加上必要的include头文件,才能在后面的编译中通过。接下来就应该编译了,选择“Build”或“Rebuild All”后,系统就开始为你生成包含vxworks内核的映象文件vxworks_rom.hex了。如下图所示。(2)创建downloadable工程格式。新建时选择“Create downloadable application modules”然后按提示输入工程名和位置。“下一步”后出现如下图所示界面,在toolChain中选择“ARM7TDMI.gnu”编译工具。完成后你会发现工程(project1)下什么程序也没有。按上面的方法照样添加你的应用程序,并进行编译,生成project1.out文件。就可以调试了。调试之前必须保证你的目标机已经上电并通过网络或串口与宿主机相连。下载.out文件之前还要先配置你的target server。按下图所示进行操作:配置如目标机的IP,和映象文件所在的目录就基本上OK了。结果如下图所示。以网络下载vxworks映象为例:启动tornado自带的tftpServer,打开超级终端,设置好波特率。目标机复位,很快超级终端就有一些信息打出来,当出现如下的提示时表示vxworks内核已经在目标机上成功运行下来了。在Tornado II的tools菜单中启动刚才配置好的targetSever.成功后就会有一个靶状的红色小东西出现的window任务栏右下角。双击它,出现如下的提示则表示成功和目标机连接。点击 选择代理名,启动debug,点击下载.out文件到目标机。点击并输入任务名,就可以开始应用程序的调试了,调试界面如下图所示:可以在代码行设置断点。调试好的程序就可以按bootable的生成方式作成最终生产用映象,烧入目标机就可以了,当然还应该观察程序是否正常运行,输出结果是否符合要求。2.2 VxWorks开发策略2.2.1 交叉调试开发Tornado开发使用主机-目标机交叉开发模型:应用程序在主机的Windows环境下编译链接生成可执行文件,下载到目标机,通过主机上的目标服务器与目标机上的目标代理程序的通信,完成对应用程序的调测与分析。主机、目标机与之间的连接情况,可参照下图。主机的开发环境可以是Windows、HP等操作系统,目标机的硬件环境可以是Power PC、ARM、普通PC机等。主机与目标机之间的连接可以采用交叉网线或者串口。大多开发采用网线,连接方便,开发简单。2.2.2 板级支持包BSPTornado目录下config/bspname包含板级支持包BSP,它由运行VxWorks的某些硬件驱动文件组成,如有串行线的VME板、时钟和其它设备。文件包括:Makefile, sysLib.c, sysSerial.c, sysALib.s, romInit.s, bspname.h 和 config.h.文件sysLib.c以硬件独立方式提供VxWorks和应用程序间的板级联系,主要包括:初始化函数- 初始化硬件到一已知状态- 标识系统- 初始化设备,如SCSI或常规设备内存/地址空间函数- 得到板上内存大小- 总线地址空间- 设定/获得非易失性RAM- 定义板的内存位图(可选)- 为有MMU的处理器定义虚拟内存到物理内存的映射总线中断函数- 打开/关闭总线中断- 产生总线中断时钟/定时器函数- 使能/不能定时中断- 设置定时器的周期性邮箱/位置监视函数(可选) - 使邮箱/位置监视中断能在目录config/all 的配置文件usrConfig.c和bootConfig.c负责启动库函数。设备驱动可调用内存和总线管理函数。板级支持包BSP负责目标板硬件的初始化,实时内核的载入等。对于硬件初始化的顺序,大致可按下表中形式进行:函 数函 数 功 能所 在 文 件sysInit()(a)锁住中断;(b)禁用缓冲;(c)用缺省值初始化系统中断表(仅i960);(d)用缺省值初始化系统错误表(仅i960);(e)初始化处理器寄存器到一缺省值;(f)使回溯失效;(g)清除所有悬置中断;(h)激活usrInit(),指明启动类型。sysALib.sUsrInit()(a)对bss赋零;(b)保存bootType于sysStartType;(c)调用excVecInit(),初始化所有系统和缺省中断量;(d)依次调用sysHwInit(),usrKernelInit(),kernelInit().usrConfig.cusrKernelInit()依次调用classLibInit(),taskLibInit(),taskHookInit(),semBLibInit(),semMLibInit(),semCLibInit(),semOLibInit(),wdLibInit(),msgQLibInit(),qInit(),workQInit()usrKernel.ckernelInit()初始化并启动内核。(a)激活intLockLevelSet();(b)从内存池顶部创建根堆栈和TCB;(c)调用taskInit(),taskActivate(),用于usrRoot();(d)调用usrRoot().kernelLib.cUsrRoot()初始化I/O系统,驱动器,设备(在configAll.h和config.h中指定)(a)调用sysClkConnect(),sysClkRateSet(),iosInit(),ttyDrv();(b)初始化excInit(),logInit(),sigInit().(c)初始化管道,pipeDrv();(d)stdioInit(),mathSoftInit()或mathHardInit()(e)wdbConfig():配置并初始化目标代理机usrConfig.c 在大多数目标板的板级支持包中,VxWorks的入口点由两个函数:romInit()和romStart()来完成,而非sysInit()。具体基于ROM的VxWorks的初始化过程如下表所示:函数函数功能所在文件1.romInit()2.romStart()3.usrInit()4.usrKernelInit()5.kernelInit()6.usrRoot()7.Application routine(a)禁止中断;(b)保存启动类型;(c)硬件初始化;(d)调用romStart();(a)将数据段从ROM拷贝到RAM,清内存;(b)将代码段从ROM拷贝到RAM,有必要的话解压缩;(c)调用usrInit();初始化程序如果相应的配置文件被定义,对应函数被调用初始化并启动内核初始化I/O系统,驱动器,创建设备应用程序代码romInit.sbootInit.cusrConfig.cusrKernel.ckernelLib.cusrConfig.cApplication source file2.2.3 任务调度目标板加电启动成功后,有如下几个任务已开始运行。他们就是VxWorks的系统任务。(1)根任务:tUsrRoot内核首先执行根任务tUsrRoot,其入口点为文件config/all/usrConfig.c中的usrRoot()函数,它负责初始化VxWorks工具,并创建注册、异常处理、网络通信任务和tRlogind等任务。一般来说,在所有的初始化工作完成后,根任务tUsrRoot被删除。(2)注册任务:tLogTask注册任务tLogTask被VxWorks模块用于传送不需I/O操作的系统消息。(3)异常处理任务:tExcTask异常处理任务tExcTask有最高优先级,它负责系统的异常情况出错处理,不能被悬置、删除或是改变其优先级。(4)网络通信任务:tNetTask网络通信任务tNetTask负责系统级任务的网络通信。(5)目标代理任务:tWdbTask如果目标代理程序运行在任务模式,目标代理任务tWdbTask被创建,用来响应主机目标服务器的请求。实时系统的一个任务可有多种状态,其中最基本的状态有四种:就绪态:任务只等待系统分配CPU资源;悬置态:任务需等待某些不可利用的资源而被阻塞;休眠态:如果系统不需要某一个任务工作,这个任务处于休眠状态;延迟态:任务被延迟时所处状态;当系统函数对某一任务进行操作时,任务从一种状态迁移到另一状态。处于任一状态的任务都可被删除。VxWorks内核的任务管理提供了动态创建、删除和控制任务的功能,具体实现通过如下一些系统调用:taskSpawn()创建(产生并激活)新任务taskInit()初始化一个新任务taskActivate()激活一个已初始化的任务taskName()由任务ID号得到任务名taskNameToId()由任务名得到任务ID号taskPriorityGet()获得任务的优先级taskIsSuspended()检查任务是否被悬置taskIsReady()检查任务是否准备运行taskTcb()得到一个任务控制块的指针taskDelete()中止指定任务并自由内存(仅任务堆栈和控制块)taskSafe()保护被调用任务taskSuspend()悬置一个任务taskResume()恢复一个任务taskRestart()重启一个任务taskDelay()延迟一个任务 状态迁移 调用就绪态 - 悬置态semTake()/msgQReceive()就绪态 - 延迟态taskDelay()就绪态 - 休眠态taskSuspend()悬置态 - 就绪态semGive()/msgQSend()悬置态 - 休眠态taskSuspend()延迟态 - 就绪态expired delay延迟态 - 休眠态taskSuspend()休眠态 - 就绪态taskResume()/taskActivate()休眠态 - 悬置态taskResume()休眠态 - 延迟态taskResume()多任务调度须采用一种调度算法来分配CPU给就绪态任务。Wind内核采用基于优先级的抢占式调度法作为它的缺省策略,同时它也提供了轮转调度法。基于优先级的抢占式调度,它具有很多优点。这种调度方法为每个任务指定不同的优先级。没有处于悬置或休眠态的最高优先级任务将一直运行下去。当更高优先级的任务由就绪态进入运行时,系统内核立即保存当前任务的上下文,切换到更高优先级的任务。Wind内核划分优先级为256 级(0255)。优先级0为最高优先级,优先级255为最低。当任务被创建时,系统根据给定值分配任务优先级。然而,优先级也可以是动态的,它们能在系统运行时被用户使用系统调用taskPrioritySet()来加以改变,但不能在运行时被操作系统所改变。轮转调度法分配给处于就绪态的每个同优先级的任务一个相同的执行时间片。时间片的长度可由系统调用KernelTimeSlice()通过输入参数值来指定。很明显,每个任务都有一运行时间计数器,任务运行时每一时间滴答加1。一个任务用完时间片之后,就进行任务切换,停止执行当前运行的任务,将它放入队列尾部,对运行时间计数器置零,并开始执行就绪队列中的下一个任务。当运行任务被更高优先级的任务抢占时,此任务的运行时间计数器被保存,直到该任务下次运行时。2.2.4 信号量信号量VxWorks信号量是提供任务间通信、同步和互斥的最优选择,提供任务间最快速的通信。也是提供任务间同步和互斥的主要手段。VxWorks提供3种信号量来解决不同的问题。二进制最快的最常用的信号量,可用于同步或互斥。互斥为了解决内在的互斥问题、优先级继承、删除安全和递归等情况而最优化的特殊的二进制信号量。计数器类似于二进制信号量,但是随信号量释放的次数改变而改变。(1)二进制信号量二进制信号量能够满足任务间的互斥和同步,需要的系统开销最小。二进制信号量可以看成一个标志,对应资源是可用还是不可用。当一个任务调用semTake ()请求一个信号量时,如果此时信号量可用,信号量会被清零,并且任务立即继续执行;如果信号量不可用,任务会被阻塞来等待信号量。当一个任务调用semGive ()释放一个二进制信号量时。如果信号量已经可用,释放信号量不会产生任何影响;如果信号量不可用并且没有任务等待使用该信号量,信号量只是被简单地置为可用;如果信号量不可用并且有一个或多个任务等待该信号量,最高优先级的任务被解阻塞,信号量仍为不可用。当两个以上的任务共享使用同一块内存缓冲区或同一个I/O设备之类的资源时,可能会发生竞争状态。二进制信号量可以通过对共享资源上锁,实现高效的互斥访问,不象禁止中断或禁止抢占,二进制信号量将互斥仅仅限于对与之联系的资源的访问,并且比禁止中断和禁止抢占提供更精确的互斥粒度。使用时创建用于保护资源的二进制信号量,初始时信号量可用。当任务需要访问这个资源时,首先取得这个信号量,所有其它想要访问这个资源的任务将被阻塞。当任务完成了对该资源的访问时,释放该信号量,允许其他任务使用该资源。因此所有对一个需要互斥访问资源的操作由semTake ()和semGive ()对一起来实现:semTake(semMutex,WAIT FOREVER)/*临界区,某一时刻仅被一个任务访问*/semGive (semMutex)信号量另一种通常的用法是用于任务间的同步机制。在这种情况下,信号量代表一个任务所等待的条件或事件。最初,信号量是不可用的。一个任务或中断处理程序释放该信号量来通知这个事件的发生。等待该信号量的任务将被阻塞直到事件发生、该信号量可用。一旦被解阻塞,任务就执行恰当的事件处理程序。信号量在任务同步中的应用对于将中断服务程序从冗长的事件处理中解放出来以缩短中断响应时间是很有用的。(2)互斥信号量互斥信号量是一种特殊的二进制信号量,用于解决具有内在的互斥问题:优先级继承、删除安全和对资源的递归访问等情况。互斥信号量与二进制不同点在于:它仅用于互斥;仅能由取(semTake ()它的任务释放;不能在ISR 中释放(semGive ()。优先级继承问题。优先级倒置发生在一个高优先级的任务被迫等待一段不确定时间,等待一个低优先级任务完成。VxWorks允许使用优先级继承算法,在互斥信号量中使用选项 SEM-INVERSION-SAFE ,将使能优先级继承算法,优先级继承协议确保拥有资源的任务以阻塞在该资源上的所有任务中优先级最高的任务的优先级执行,直到它释放所拥有的所有信号量,然后该任务返回到正常状态。因此这个“继承的高优先级”任务受到不会被任何中间优先级任务抢占的保护。删除安全问题。另一个互斥问题涉及到任务删除。在一个受信号量保护的临界区,经常需要保护在临界区执行的任务不会被意外地删除。删除一个在临界区执行的任务可能引起意想不到的后果,造成保护资源的信号量不可用,可能导致资源处于破坏状态,也就导致了其他要访问该资源的所有任务无法得到满足。原语 taskSafe()和taskUnsafe ()提供了防止任务被意外删除的一种方法。同时互斥信号量提供了选项SEM-DELETE-SAFE ,使用这个选项,每次调用semTake ( )时隐含地使能了taskSafe(),当每次调用semGive ()时隐含地使能了taskUnsafe ()这种方式,任务得到信号量时得到不会被删除的保护。递归资源访问问题。互斥信号量能够被递归地获得。这意味着信号量能够被一个拥有该信号量的任务在该信号量最终被释放之前多次获取。递归对于满足一些子程序即要求能够相互调用但是也要求互斥访问一个资源非常有用。这种情形是可能的,因为系统需要跟踪哪一个任务当前拥有信号量。(3)计数器信号量计数器信号量是实现任务同步和互斥的另一种手段。计数器信号量除了像二进制信号量那样工作外,还保持对信号量释放次数的跟踪。信号量每次释放,计数器加一,每次获取,计数器减一。当信号量减到0 时,试图获取该信号量的任务被阻塞。正如二进制信号量,当信号量释放时,如果有任务阻塞在该信号量阻塞队列上,那么任务解除阻塞;但是如果信号量释放时,没有任务阻塞在该信号量阻塞队列上,那么计数器加一。VxWorks的信号灯操作库有semLib、semBLib、semCLib、semMLib,分别对应通用信号灯与二进制、计数型和互斥信号灯的操作。库中信号灯相关的函数有:semBCreate()创建一个二进制信号灯semCCreate()创建一个计数型信号灯semMCreate()创建一个互斥型信号灯semGive()释放信号灯semTake()获取信号灯semFlush()使所有被该信号灯阻塞的任务脱离阻塞状态信号量在实现多任务间的通信、同步和互斥中发挥着重要的作用。因此,深入理解和正确使用VxWorks的信号量,可以提高实时系统中多任务间通信的效率。2.3 VMWare上安装VxWorks2.3.1 概述VxWorks是风河公司(Windriver)开发的实时操作系统之一,以其优秀的可靠性、实时性及内核的可裁减性,被广泛应用于通信、军事、航天、航空等关键行业领域。VxWorks可以适用于多种硬件体系结构,其中也包括大家日常都可以接触到的PC体系结构。VMWare 是被广泛应用虚拟PC系统软件,他可以提供基于Inetl CPU的虚拟PC系统环境,包括CPU、BIOS、硬盘和其他外围硬件设备,使您可以在一台PC机上同时运行两个操作系统。VMWare对外围硬件设备的模拟,屏蔽了不同设备型号的差异,在硬件环境发生改变时(硬件型号变化),对于运行于VMWare上的操作系统影响很小(无须安装新的驱动程序)。本文以下部分将介绍如何在VMWare软件提供的虚拟环境上安装VxWorks操作系统。由于可以在同一台PC机上建立完整VxWorks开发环境,所以可以有效地降低项目初期的开发成本,也可以为初学者提供一个接近于真实的模拟环境。需要注意的是,由于VMWare本身是运行在Windows操作系统之上的,而VxWorks运行于VMWare之上,所以这个模拟环境无法保证VxWorks的实时特性。因此,Vmware上的嵌入式VxWorks操作只是单机演示作用,可以快速方便的得到一些实验性结果,并不能彻底实现其他诸如实时性测试等方面的目标。2.3.2 准备工作我们假设您有一台普通配置的PC机,并安装了Windows2000操作系统。其次您需要安装Tornado 2.2 for pcPentium开发环境。缺省安装的Tornado 2.2 for pcPentium可能不包括pcPentium的BSP组件,但该组件可以从风河公司(Windriver)的网站免费下载。我们将在下文以WIND_BASE引用Tornado的安装路径。其次是要安装VMWare软件,这里我们使用4.0的版本。如果您还没有该软件,也可以从VMWare的网站下载试用版。最后,由于Tornado自带的PC-NET网卡驱动有问题,所以需要下载AMD的PCNET网卡的VxWorks系统驱动,可以从AMD网站免费下载。一张1.44M的软盘,用于制作系统引导盘。准备并安装好以上软件后,就可以开始下一步的工作了。2.3.3 开始安装(1)编译网卡驱动程序VMWare为运行于其上的操作系统提供虚拟网卡支持,该网卡类型即为AMD的PC-NET。实际上,在Tornado开发包中已经包含了该类型网卡的驱动程序,但经过测试,对于VMWare无法正常工作,所以您需要从AMD的网站下载最新的驱动程序。下载得到的是一个可执行的安装程序,运行该程序将得到一个压缩包和一个帮助文件,按照该帮助的要求,将压缩包直接释放到Tornado目录下。如果提示是否允许覆盖文件,则选择允许。此后按如下步骤完成驱动程序的编译和替换: 打开一个控制台窗口,运行批处理程序:$(WIND_BASE)hostx86-win32bin torVars.bat; 重新定位到$(WIND_BASE)targetsrcdrvend目录,运行: make CPU=PENTIUM tool=gnu ln97xend.o其间会产生一些警告,但这不会影响我们的工作。 重新定位到$(WIND_BASE)targetlibpentiumPENTIUMcommon目录,并将上一步生成的文件ln97xend.o复制到此目录下。备份此目录下的文件libdrv.a; 运行命令arpentium -d libdrv.a ln97xEnd.o,删除libdrv.a中原有的ln97xEnd模块,然后再运行命令: arpentium -ra iOlicomEnd.o libdrv.a ln97xEnd.o将我们刚刚创建的新模块添加进去。到此有关网卡驱动的设置就完成了。注意不要关闭这个窗口,后面还要使用。(2)修改配置文件在这一节中,我们要修改编译VxWorks的配置头文件Config.h中定义的一些参数,使编译出来的系统引导程序和VxWorks的映象符合我们的要求;同时还要修改sysLn97xEnd.c这个文件,以使系统的网络功能正常运行。 定位目录到$(WIND_BASE)targetconfigpcPentium并打开该目录下Config.h文件; 我们首先要修改VxWorks的启动参数。先查找到定义DEFAULT_BOOT_LINE宏的地方,修改预处理条件CPU = PENTIUM分支下的定义如下: #define DEFAULT_BOOT_LINE lnPci(0,0)your_host_name:d:vxWorks h=69 e=54 u=target pw=vxworks tn=target其中: lnPci(0,0)指定了使用第0个网卡和第0个处理器,lnPci这个标识会因为使用的驱动程序不同而有所不同,但这里用lnPci就可以了; your_host_name指定您的主机的名字,使用Windows系统的主机名就可以; d:vxWorks指定了VxWorks映象下载的完整路径; h=69是主机的IP地址,就是您当前正在使用的系统的IP地址; e=54是目标机的IP地址,也就是未来VxWorks操作系统的IP地址,您只要任意指定一个不冲突的IP地址即可,这里我们假设您的目标机IP地址和主机IP地址在同一个网段内; u=target指定了FTP服务器的用户名,这个FTP就是用来下载VxWorks映象的,后面还会提到; pw=vxwroks是用户名对应的口令; tn=target指定目标机的名字,任意指定即可; 您可以参考Tornado自带的手册以获取更多信息; 下面我们要指定使用什么样的网卡驱动程序。首先查找“Network driver options”这段文字,之后您可以看到在该注释后面定义了一系列的有关网卡驱动的宏定义。注意保证INCLUDE_END和INCLUDE_LN_97X_END这两个宏处于定义状态(define),其他的宏都处于未定义状态(undef); 缺省情况下,VxWorks系统是不接受外部输入设备(如键盘)的输入,也不向外部输出设备(如显示器)输出数据。为了便于调试,我们必须改变它的这种缺省状态。我们查找定位宏INCLUDE_PC_CONSOLE,然后保证其处于定义状态(define)即可; 到此为止,对config.h文件的修改就完成了,保存修改,然后再打开同一目录下的sysLn97xEnd.c文件; 这一步修改的目的是要使网卡正常工作。我们先定位到“memory-mapped IO base”这段文字,然后将其前面的参数由pciRsrcendUnit.bar1修改为NONE,这样就可以了。最后别忘了保存。 到此为止,全部的修改工作都完成了,下一步就可以开始编译连接了。2.3.4 编译程序这一节我们要编译生成bootrom引导程序和VxWorks运行映象。 打开您的Tornado开发工具,在Build菜单下选择Build Boot ROM,弹出如下对话框: 在BSP列表中选择pcPentium,而在Image to build列表中分别选择bootrom和gnu。完成选择后,点击OK按钮就开始引导程序的编译了。编译产生的文件bootrom将保存在$(WIND_BASE)targetconfigpcPentium目录下。 编译生成bootrom后,还要创建一个VxWorks映象(image),也就是VxWorks操作系统本身的代码。 o 创建一个“bootable VxWorks image”的工程; o 选择您需要的VxWorks组件。这一步是可选的,如果您只想使用缺省的配置,那根本就不需要这一步;但如果您想使用额外的组件,例如,您可能想通过telnet连接VxWorks系统,这时就需要在Workspace窗口的VxWorks选项卡中选择telnet sever对应的组件,如下图: 在这个例子中我们选择了两个重要的组件:Telnet server 和 Target shell 。前者使我们可以通过Telnet协议登录到VxWorks操作系统中;后者则可以让我们通过命令行控制VxWorks系统。完

温馨提示

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

评论

0/150

提交评论