预览加载中,请您耐心等待几秒...
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

VxWorks实时操作系统的USB驱动程序原理与分析 1、问题的提出通用串行总线(USB)作为一种中高速的数据方式,已经很普遍地应用于外设与主机的通信中。VxWorks是当今十分流行的实时操作系统,在通信、国防、工业控制、医疗设备等嵌入式实时应用领域。很多VxWorks系统中都有USB设备,可是关于USB的驱动实现并没有相关的资料可以参考,给实际工作带来了难题。本文通过详细地分析VxWorks下的USB驱动栈,具体提出了其实际应用的方法,为USB在应用VxWorks的嵌入式系统的开发扫清了技术障碍。 2、VxWorks简介VxWorks是WindRiver公司开发的具有工业领导地位的高性能实时操作系统(RealTimOperationSystem,RTOS)内核,具有先进的网络功能。VxWorks的开放式结构和对工业标准的支持,使得开发人员易于设计高效的嵌入式系统,并可以很小的工作量移植到其它不同的处理器上。作为一种先进的实时操作系统,它具有以下特点: 可裁剪微内核结构。 高效的任务管理:①多任务,具有256个优先级。②具有优先级排队和循环调度。③快速的、确定性的上下文切换。 灵活的任务间通讯:①三种信号灯:二进制、计数、有优先级继承特性的互斥信号灯。②消息队列。③套接字(Socket)。④共享内存。⑤信号(Signals) 微秒级的中断处理。 支持POSIX1003.1b实时扩展标准。 支持多种物理介质及标准的、完整的TCPIP网络协议。 灵活的引导方式。支持从ROM、flash、本地盘(软盘或硬盘)或网络引导。 支持多处理器并行处理。 快速灵活的l/O系统。 支持MS-DOS和RT-11文件系统。 支持本地盘,flash,CD-ROM的使用。 完全符合ANSIC标准。 多个系统调用。 3、USB驱动程序的结构概述图1提供了一个USB主驱动栈结构的简单概括。图2显示了USB主驱动栈的各模块之间的功能联系。图1USB主驱动栈结构简单模型图2USB主驱动栈各模块之间的功能联系在栈的最底部是USB主控制器(USBHC,即USBHostController),这是主系统中控制每一个USB设备的硬件部分。目前,市场上主要有两大类USB主控制器,一种是支持由ime1公司最先提出的通用主控制器接口(UniversalHostControllerInterface,简称UHCI),另一种是支持由微软、康柏和国家半导体公司联合设计提出的开放主控制器接口(OpenHostControllerInterface,简称OHCI)。硬件厂商一般根据这两个规范设计他们的USB主控制器。对于每一类型的主控制器都有一个与硬件独立的USB主控制器驱动(HostControllerDriver,简称HCD)。WindRiver提供了两个驱动:usbHcdUhciLib(UHCI主控制器库)和usbHedOheiLib(OHCI主控制器库)。USB主驱动(USBhostdriver,简称USBD)和HCD之间的接口允许一个或超过一个的底层主控制器。而且,WindRiver的USBD能够同时连接多个USBHCD。这样的设计特点可以使开发者建立复杂的USB系统。USBD是在HCD之上的与硬件独立的模块。USBD管理每一个与主机相连的USB设备,向更高层次提供了可与USB设备通信的路径。它还负责自动处理USB电力管理以及USB带宽管理。而且,USBD还管理USBhub,Hub功能是一个驱动能否对USB正确操作的评价之一。因此WindRiver的USBD设计者要使USBD透明地处理hub的功能。这意味着,USBD还能处理USBhub和设备的动态插拔。USBClient模块在USB主驱动栈的顶端。USB类驱动(USBClassDriver)是Client模块的典型例子。USB类驱动负责管理连接到USB上的不同类型的设备;它们依靠USBD来提供与每个设备的通信路径。USBclient模块的其他例子就是那些利用USBD与USB设备通信的应用程序。 4、USBD驱动详解这一部分将要描述USBD(USBHostDriver)的典型应用。例如初始化,client注册,动态连接注册,设备配置,数据传输,同时还探讨了USBD内部设计的关键特性。这部分是VxWorks下USB驱动的核心。4.1初始化USBD:分为两步(1)必须至少调用一次函数usbdInitialize()。在一个给定的系统中,usbdlnifialize()初始化内部USBD数据结构,并依次调用其它USB驱动栈模块的入口。usbdinitialize()可以在启动时调用一次,也可以对每一个设备各调用一次。USBD自己记录了调用usbdInitialize()(‘+’)和usbdShutDown()(‘-’)的次数。只有