查看完整版本: 视频信号采集与图象传输技术的研究----基于USB的图像传输接口设计

admin 发表于 2015-4-28 00:05:03

视频信号采集与图象传输技术的研究----基于USB的图像传输接口设计

随着通用串行总线(USB)的接口集成在PC主板上及Windows 98等操作系统全面支持USB技术标准,USB的应用正得到突飞猛进的发展。所设计的视频信号采集系统除可通过EPP和计算机通讯外,还可通过USB和计算机相连。
       
        3.1 USB概述
        USB(Universal Serial Bus)协议是一些PC大厂商,如Microsoft, Intel等为了解决日益增加的PC外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信的标准,自95年在Comdex上亮相以来至今已广泛地为各PC厂家所支持。现在生产的PC几乎都配备了USB接口,Microsoft的windows98、NT以及Mac OS,Linux, FreeBSD等流行操作系统都增加了对USB的支持。
       
        USB电缆由电源线(Vbus)、地线(GND)和两根数据线(D+和D-)组成,如图4-1所示。
       
        USB接口有两种两种形状的插口,分别称为A口和B口。其中A口的方向面向主机,而B口的方向面向USB外设,与A口和B口分别对应的有A插座和B插座。插口和插座的外形如图4-2所示。
       
        数据在D+和D-间通过差分方式以全速或低速传输,时钟信息编码在差分码中。在每个数据包的头部有一个同步信号(SYNC),接收方用它和数据发送方保持时钟同步。
       
        USB的主要优点有:
       
        (1)速度快。USB有高速和低速两种方式,主模式为高速模式,速率为12Mbps,另外USB还提供低速方式,速率为1.5Mb/s.相比之下,串口数据传输率是115kbps-230kbps,标准并口的数据传输率为1Mbps,这些都要低于USB的传输速率,现在推出的USB2.0协议,在理论上其传输率可以达到480Mbps.
        (2)设备安装和配置容易。USB设备支持即插即用,安装USB设备不必再打开机箱。加减已安装过的设备,完全不用关闭计算机。
       
        (3)易于扩展。用USB连接的外围设备数目最多达127个。标准USB电缆长度为3米(5米,低速)。通过Hub或中继器可以使外设距离达到30米。
       
        (4)能够采用总线供电。USB工作在5V电压下,总线提供最大达500mA电流。
       
        对于功耗较小的设备来说这是非常有效的。
       
        (5)使用灵活。USB共有4种传输模式:控制传输(control)、同步传输(Synchronization)、中断传输(interrupt)、块传输(bulk),以适应不同设备的需要。
       
        (6)健壮性强。USB协议规定了对各种可能遇到的错误的处理和恢复机制,保证数据传输的正确性。
       
        (7)实现成本低。USB对系统与PC的集成进行了优化,适合于开发低成本的外设。
       
        由于这些优点,USB的应用范围很广。论文设计的USB通信接口主要针对的应用是传输视频数据,进行12Mbps全速传输。在保证传输可靠性的条件下,理论上USB全速传输的有效数据速率为8Mbps.
        3.2 USB系统描述
        一个USB系统可分为USB设备、主机(Host)和主机与设备的连接(Interconnect)三个部分。
       
        连接部分规定了USB设备与主机的连接和通信方式。它包括总线拓扑结构、通信各层的任务和相互关系、数据流模型以及主机与多路USB设备通信时的带宽分配等内容。USB物理互连方式如图4-3所示,是一种星形级连结构。这种集线器级连的方式使得外设的扩展很容易。而在逻辑上,各个设备好象是与主机直接相连的,如图4-4所示。它们之间的通信不用理会物理连接方式。
       
        USB主机是一个USB系统的核心。在一个USB系统中只有一台主机。主机的USB接口称为USB控制器,通过它主机和外围USB设备进行通信。在主机中还集成了一个根集线器(Root Hub)用于直接与外设相连或与一般USB hub级连。
       
        图4-5展示了USB通信模型之间基本的信息流与互连关系。由图可见,主机与
       
        设备都被划分成不同的层次。在主机与设备之间的所有通信最终都是通过USB的电缆进行,然而,在上层的水平层之间存在逻辑的主机—设备信息流。主机上的客户软件和设备功能部件之间的通信是基于实际的应用需求及设备所能提供的能力。客户软件与功能部件之间的透明通信的要求,决定主机和设备下层部件的功能以及它们的界面(interface)。
       
        USB系统(USB System)使用主机控制器来管理主机与USB设备的数据传输。USB系统有三个主要的组成部分:主机控制器驱动(Host Controller Driver),USB驱动(USB Driver),主机软件(Host software)。图4-6描述了主机的通信。主机可提供如下的功能:检测USB设备的插入和拔出;管理主机与设备之间的数据流,对设备进行必要的控制;收集各种状态信息;对插入的设备供电。
       
        主机上还有USB系统软件(USB System Software)和客户软件(Client Software)。客户软件和与其对应的USB设备进行通信,实现各个USB设备特殊的功能应用。系统软件对USB设备和客户软件之间的通信进行管理,并完成USB系统中一些共同的工作,例如:USB设备的枚举和配置,参与各种类型的数据传输、电源管理以及报告设备和总线的一些状态信息并进行处理等。
       
        USB设备包括USB hub和功能设备(Function)两大类。它们都必须有标准的USB接口,支持标准的USB操作(比如配置,复位等)。它们的描述信息也应该具有USB协议定义的标准格式。
       
        3.3下端设备USB接口电路设计
        USB下端硬件系统的实现有两大类方法。第一类方法是采用带有微处理器的USB芯片,比如CYPRESS的CY7C64XXX系列。由于处理器和USB收发器集成在一起,它具有电路实现简单,性能优良的优点。但缺点也很明显,即这种方案不够灵活,比如说它的I/O腿数目可能不适合具体应用等等。而且,采用此类芯片意味着要同时购买昂贵的开发系统。在初步开发阶段以及国内供货渠道不很畅通的情况下,这种方案对于学校实验室来说不太适合。第二类方法是采用微处理器+USB收发芯片(USB Transceiver)的办法。它的电路比前一种方案稍复杂,但灵活性更大。而且由于我们可以根据实验室条件和开发者的经验自己选择微处理器,开发成本得到降低,进度也加快不少。所以我们采用了第二种方案,用ATMEL公司的具有8K FLASH存储容量的AT89C52和Philips公司的PDIUSBD12芯片构成系统。
       
        AT89C52使用方便,价格便宜,此芯片大家都非常了解,在这就不多说了。
       
        Philips的PDIUSBD12芯片由于与微控制器的接口灵活,且在中国供货渠道比较畅通,目前在国内使用比较多。所以我们的方案采用了PDIUSBD12. PDIUSBD12是一款性价比很高的USB器件,完全符合USB1.1版的规范,它通常用作微控制器系统中实现与微控制器进行通信的高速通用并行接口。它还支持本地的DMA传输。PDIUSBD12所具有的低挂起功耗连同LazyClock输出可以满足使用ACPI、OnNOW和USB电源管理的要求。低的操作功耗可以应用于使用总线供电的外设。
       
        此外它还集成了许多特性包括SoftConnet TM、GoodLink TM可编程时钟输出低频晶振和终止寄存器集合。所有这些特性都为系统显著节约了成本,同时使USB的功能在外设上的应用变得容易。PDIUSBD12的功能框图如图4-7所示。D12的时序分别如图4-8和图4-9所示。
       
        图4-10是USB通信系统的电路原理图。由三部分构成:微处理器,D12接口芯片和数据采集电路。微处理器是核心,由它控制数据的采集,处理和传输。
       
        实际开发板中使用的是89C52,主要考虑到开发工具和开发费用。但是由于89C52的时钟频率(12M)低于D12的工作频率(48M),因此整个系统的效率不高。
       
        理想情况可以采用更高的工作频率的芯片。在该例中ALE接低电平,表示一个独立的地址和数据总线配置。D12的A0脚与89C52的任意一个I/O口相连。该端口控制D12的命令和数据状态。89C52的多位地址和数据总线可直接与D12的数据总线相连,89C52的频率输入可由D12的CLKOUT提供。
       
        3. 4设备端驱动程序设计
        在应用程序可以与一个设备通信之前,主机需要知道设备支持哪些传输类型和终端。主机也必须分配一个地址给设备。主机通过一个被称为列举的信息交换来完成这些工作。
       
        集线器的一个任务就是检测设备的连接与断开。每个集线器都有一个中断IN流程用来向主机报告这些事件。在系统启动的时候,主机查询它的根集线器来了解有哪些设备已经连接上了。在启动后,主机持续周期性地查询以了解是否有设备连接或断开。
       
        一旦发现一个新设备,主机发送一系列的请求给这个设备的集线器,使得这个集线器在主机和这个设备之间建立一个通信通道。然后主机试图列举这个设备。列举是使得主机的设备驱动程序能与这个设备通信的最基本的信息交换。
       
        这个过程由如下动作组成:分配一个地址给设备,从设备读取描述数据,分配和载入一个设备驱动程序以及从在接受到的数据中出现的选项中选择一个配置。然后设备就被配置好了,并且准备好使用它的配置中支持的任何终端来传输数据。
       
        主机列举是通过给终端0发送包含标准USB请求的控制传输。所有的USB设备必须支持控制传输、标准USB请求和终端0.对一个成功的列举来说,设备必须对每一个请求响应,返回请求的信息以及采取其他请求的动作。
       
        从用户的角度看,列举应该是不可见和自动的,除了在一些情况下如申明发现一个新设备和是否成功配置这个新设备的窗口。有时在第一次使用时,用户需要提供一个有INF文件和设备驱动程序的磁盘。
       
        当列举结束时,Windows把新的设备加入到控制面板的设备管理器中。当一个用户断开一个外设的连接时,Windows自动地从这个显示中移掉这个设备。
       
        在一个一般的外设中,外设的程序代码包含了主机请求的信息,并且程序代码必须能识别和响应这些信息的请求。在主机方面,Windows将查找一个被称为INF文件的特殊文件文本,这个文件会告诉Windows哪个驱动适合这个设备。
       
        3.4.1 USB设备列举规范
        在列举过程中,一个设备将经历六个可能的设备状态中的四个:上电、默认、地址和配置(其他状态时连接和挂起)。在每种状态下,设备都有定义的能力和行为。以下是在列举过程中引起和出现的事件。
       
        (1)用户插入一个设备到一个USB端口。
       
        这个端口可以在主机的根集线器上或者在连接主机下游的集线器上。集线器正常给这个端口提供电源,这个设备正处于上电状态。
       
        (2)集线器检测到这个设备。
       
        集线器端口的两根信号线(D+和D-)的每一根都有一个1.5kΩ的下拉电阻,而一个设备在D+(为全速设备)和D-(为低速设备)都有一个1.5kΩ的上拉电阻。当一个设备插入到一个端口时,设备的上拉电阻使信号线为高,使得集线器可以检测到一个设备连接上了。
       
        一旦检测到一个设备,集线器持续提供电能但传输USB流通量给设备,因为设备还没有准备好接受它。
       
        (3)主机知道了这个新设备。
       
        每个集线器使用它的中断流程来报告发生在集线器上的事件。当主机知道了这个事件,它给集线器发送一个Get_Port_Status请求来了解更多的信息。返回的信息告诉主机一个设备是什么时候连接上的。
       
        (4)集线器重新设置这个设备。
       
        当主机知道有一个新的设备时,主机控制器给集线器发送一个Set_Port_Feature请求,请求集线器来重新设置端口。集线器使得设备的USB数据线处于重启状态至少10ms.
        (5)集线器在设备和总线之间建立一个信号通路。
       
        主机通过发送一个Get_Port_Status请求来验证设备是否激起重启状态。返回的数据的一位表示设备是否仍然处于重启状态。当集线器已经释放了重启状态,设备就处于默认状态了。设备的USB寄存器已经处于它们的默认状态,设备已经准备好通过终端0的默认流程来响应控制传输。设备现在可以与主机通信,使用默认地址0h.在这一点上,设备可以从总线上抽取不超过100mA的电流。
       
        (6)集线器检测设备速度。
       
        或者在重启之前或者在重启之后,集线器通过检查两个信号的电压来检测设备的速度。集线器通过测定哪根信号线在空闲时有更高的电压来检测一个设备的速度。集线器发送信息给主机,以响应下一个Get_Port_Status请求。
       
        (7)主机发送一个Get_Descriptor请求来知道默认流程的最大包的大小。
       
        主机发送请求给设备地址0、终端0.因为主机一次只列举一个设备,只有一个设备将响应寻址设备地址0的通信。
       
        最大包的大小是这个描述符的第8位,因此主机只需要读取头8B.一个Windows主机请求64B,但在仅接收一个包后(不管是否有64B),它就开始了状态阶段。在完成状态阶段时,主机请求集线器来重启这个设备(重复步骤4和5)。
       
        (8)主机分配一个地址。
       
        主机控制器通过发送一个Set_Address请求来分配一个单独的地址给设备。
       
        设备读取这个请求,返回一个确认,并且保存新的地址。这个设备现在处于一个地址状态。从这个点开始的所有通信使用这个新地址。
       
        (9)主机知道了设备的能力。
       
        主机给新地址发送一个Get_Descriptor请求来读取这个设备描述符,这次读取整个部分。这个描述符是一个数据结构包括终端0的最大包的大小,设备支持的配置号,以及关于这个设备的基本信息。主机把这些信息应用在其后的通信中。
       
        主机然后通过请求在设备描述符规定的一个或多个配置描述符来了解这个设备。一个Windows主机开始申请配置描述符的9B.包括在这些9B中的是这个配置描述符和它的所有的从属描述符的总长度。
       
        Windows然后再次请求配置描述符,这次使用得到的总长度,最多可达到FFhB.这导致设备发送跟随在每个配置的接口描述符后的配置描述符,在它后面是每个接口的终端描述符。
       
        (10)主机分配和载入一个设备驱动(除了复合设备)。
       
        在主机已经从它的描述符中知道了能够知道的所有信息后,它开始在一个设备启动中查找最适合的匹配来管理与设备的通信。在选择一个驱动时,Windows尽量去与从设备得到的、保存在系统INF文件中的销售商和产品ID、发布号和/或类信息相匹配。在驱动程序被载入后,它经常请求设备来重新发送描述符或者发送应用于这个设备的类描述符。
       
        (11)主机的设备驱动选择一个配置。
       
        在从描述符了解了设备后,设备驱动程序发送一个Set_Configuration命令来请求希望的配置号。很多设备只支持一个配置。如果一个设备支持多个配置,则这个驱动能根据以下信息来决定使用哪个配置:它已经具有的关于这个设备如何被使用的信息,或者它可能询问用户该做什么,或者它可以就选择第一个配置。设备现在可以使用了。
       
        另外两个设备状态:连接和挂起,可能出现在任何时间。
       
        综上,USB设备启动流程可概括为:
        (1) USB设备接入USB口,发出连接USB命令。
       
        (2)主机发出读设备描述符两次。
       
        (3)主机根据设备描述符——厂商ID、产品ID,启动相应设备驱动程序。
       
        (4)设备驱动程序初始化USB设备:读设备描述符;读配置描述符;选择接口、端点(管道),确定传输方式。
       
        3.4.2数据采集系统固件程序设计
        本程序利用的是查询方式。D12设备端程序使用C51语言编写,其任务是完成设备的管理和数据的交互。设备的管理是指设备和主机的驱动程序互相响应,完成设备的添加、配置、删除等基本操作。数据的交互是指设备和主机之间的数据包的传送。仿真系统是伟福E2000/T,编译软件:E2000W和COMP51V6.传送数据的过程是:单片机向D12发出软连接主机的命令,主机通过D12向单片机索取设备描述符,单片机返回后,主机再通过D12向单片机发出设置USB地址信息。单片机设置D12 USB地址。主机启动USB设备驱动程序,设备驱动程序通过D12向单片机索取设备描述符,单片机返回后,设备驱动程序再索取配置描述符(包括接口、端点描述符)。主机发出配置信息,单片机配置D12端点。完成USB启动过程。
       
        根集线器检查到设备连接后,激活主机USB总线驱动程序,USBD发出一系列的SETUP包。从设备端看到的流程如图4-11所示。
       
        主机的第一个命令要求得到设备描述符,此SETUP包为8个字节数据(80,06,00,01,00,00,40,00),其具体含义请参考USB1.1协议第九章。40表示返回数据长度最大为40H个字节。实际上,只返回一个包,即数组DEV_DESC[]中的前8个字节。用于说明设备的描述符的真实长度和设备的类型。此事件的处理过程如图4-12所示。
       
        接着是设置设备地址处理事件,主机发送一个含有指定地址的数据包(00,05,02,00,00,00,00,00),在主机只有一个USB设备的时候,这个地址一般会是2,最大地址127.USB协议中可以连接127个设备,但是,即使是COMDEX 98的插拔大会,也只做到111个可同时工作而已。设置地址事件处理结束后,设备进入地址状态,主机会在指定地址处访问设备。
       
        主机再次发送得到设备描述符的数据包(80,06,00,01,00,00,12,00),与上次不同的是,要求的数据的长度是实际的数据长度。因为设备每次只能发送8字节,因此它会分三次完成此要求。
       
        接着主机要求得到设备的配置描述符(80,06,00,02,00,00,09,00),包中数据“09”指定设备发送9个字节,这正是设备配置描述符的长度。
       
        接着主机要求得到设备的配置描述符、接口描述符和节点描述符(80,06,00,02,00,00,FF,00),由于不知道设备描述符的真实长度,因此它要求得到256个字节。
       
        主机会再次以描述符的实际长度要求设备重新发送描述符,这里不再赘述。
       
        最后主机发送设置设备配置SETUP包(00,09,01,00,00,00,00,00),设备处理此事件,将允许所有节点进入工作状态。
       
        图4-13为列举成功后,显示的对话框。其中“myfirstusb goodhappy!!”
       
        为描述符。
       
        3. 5 Windows下USB客户驱动程序设计
        开发Windows2000驱动程序的必备的工具:C++,Windows Device Developer Key(DDK),此外还要有必要的调试工具,比如:SoftIce,Winbug等。虽然在驱动程序中,大多数C的支持库都不能使用,但它还是必备的工具。
       
        一个USB系统的所有事件都是由主机方发起的。通信建立的前提是主机承认了下端的USB设备,并对它进行配置,然后再根据需要建立通信管道。如果通信中出现错误或是其它问题,也都需要主机的干预。所以,主机客户驱动程序的设计对整个系统的稳定性至关重要。本文设计的系统最终将运行在WINDOWS 2000操作系统上。
       
        3.5.1 WINDOWS设备驱动程序概述
        设备驱动程序提供连接到计算机硬件的软件接口,它是操作系统的一个信任部分。用户应用程序以一种规范的方式访问硬件,而不必考虑如何控制硬件。
       
        驱动程序是一个软件,在装入后成为操作系统内核的一部分。它使一个或多个设备可用于用户态程序员,每个设备代表一个物理的或逻辑的硬件。在Windows中,驱动程序总是使设备看起来像一个文件。可以打开设备的一个句柄(handle),然后应用程序可以在设备句柄最后关闭之前向驱动程序发出读写请求。在WINDOWS98和WINDOWS2000(WINDOWS NT)中,设备驱动程序必须根据WINDOWS驱动程序模型(WDM)设计。这个模型包括两个方面:首先,核心模型描述设备驱动程序的标准结构;其次,微软为常见类型的设备提供一系列的总线驱动程序和类驱动程序。
       
        核心WDM模型描述设备驱动程序如何安装和启动,以及如何为用户请求服务和与硬件打交道。WDM设备驱动程序必须适应于即插即用(PnP)系统,允许用户插入可以在软件中配置的设备。
       
        微软提供了一系列的系统驱动程序,它们具有为许多标准类型设备服务所需的所有基本功能。第一种系统驱动程序支持不同类型的总线,如USB、IEEE 1394 (Fire Wire)和音频端口设备。其他的类驱动程序实现标准的Windows功能,如人工输入设备(HID)和内核流功能。最后,静态图象体系结构(STI)提供一个处理静态图象、扫描仪等的框架。
       
        3.5.2设备驱动程序的功能
        一个驱动程序可以做的工作有:
        • 初始化它自己
        • 创建和删除设备
        • 处理Win32打开和关闭文件句柄的请求
        • 处理Win32输入/输出(I/O)请求
        • 串行化对设备的访问。访问硬件
        • 调用其他驱动程序。取消I/O请求和超时I/O请求
        • 处理一个可热插拔的设备被加入或删除的情况
        • 处理电源管理请求
        • 使用Windows Management Instrumentation(Windows管理诊断,WMI)和NT事件向系统管理员报告设备驱动程序在操作系统中的位置,以及它如何起作用,下图4-14说明得很清楚:
       
        3.5.3 USB客户驱动程序流程USB客户驱动程序是支持即插即用的标准WDM驱动程序。所有USB设备向客户驱动程序显露一个编程接口USBDI,客户驱动程序使用USB类驱动程序(USBD.sys)访问它。USBD.sys已经实现了USB设备大多数共同的功能,客户USB设备驱动程序的编写实际上是调用这些功能。
       
        USBD处理连接USB设备的大多数繁杂的工作。在内核级,命令由客户驱动程序使用内部IOCTL发送给USB系统。表4-1列出了所有内部IOCTL.最有用的IOCTL是IOCTL_INTERNAL_USB_SUBMIT_URB,它允许发出USB请求块(URB)给USBD,让USBD处理。URB允许发出多个功能调用给USB系统。由于它们都是内部的IOCTL,根据WINDOWS的规定,它们只能用于内核态(包括客户驱动程序),而不能用于用户的应用程序。用户态USB应用程序也可以发出几个普通的IOCTL给USB设备,目地仅仅是得到连接设备的信息。
       
        以下是整个USB客户驱动程序的流程。
       
        (1)驱动程序安装:USB hub驱动程序检测一个新的USB设备何时插入。PnP管理器使用厂商ID或设备类信息选择要运行的驱动程序并安装。
        (2)驱动程序初始化:
       
       
        DriverEntry例程还根据需要设置Unload、AddDevice和StartIo等回调(callback)例程。只要告诉内核该例程的名字,内核会在合适的环境下调用它。
        随后PnP管理器调用AddDevice回调例程,创建设备,内容主要包括:
        • 检查设备是否启用如果必要,复位并启用设备
        • 在某个配置中选择一个接口
        • 可能读其他描述符
        • 访问设备,发出相关的命令,读取设备的状态,以及初始化管道
        (3)等待客户程序调用,准备接受IRP大多数的常规IRP,客户USB驱动程序无需处理,只需传递给下层驱动程序处理。USB类驱动程序主要通过USB驱动程序接口(USBDI)的内部IOCTL使用。如前所述,最重要的内部IOCTL是IOCTL_INTERNAL_USB_SUBMIT_URB,它发出USB请求块URB由USB类驱动程序处理。
       
        客户驱动程序为内部IOCTL创建一个新的IRP,填写该IRP,并沿设备栈向下把这个IRP发送到USB系统驱动程序,然后等待,直到该IRP被处理。
       
        (4)读、写IRP的处理在客户驱动程序中,重点部分是对读写IRP的处理。以读为例,对于大块数据的读,客户驱动程序将其分割成若干个长度较小的部分,为每个部分创建一个IRP,依次发送给设备栈中的下一个驱动程序,等待全部完成后,再返回这一IRP已完成的消息。
       
        3. 6基于USB的视频信号采集系统的应用程序设计
        D12接口板的驱动程序开发完成后,这个设备已经象是PC上的硬盘一样,我们可以对它进行任意的读写。当然,这个设备操作起来似乎还很困难。比如,在Visual C++或者Visual Basic中,对D12接口板读写仍然要调用CreatFile,CloseFile,ReadFile,WriteFile,IOControl等这些对设备直接操作的函数,对于一个不熟悉C++操作的编程人员来说,这样做很容易造成系统的瘫痪。因此,应该提供安全的访问设备的函数入口,就象Visual Basic访问硬盘那样。正是居于此想法,编写了此应用程序。
       
        该应用程序有两部分组成:使用Visual C++编写的Win32 DLL程序和使用Visual Basic编写客户应用程序。
       
        Win32动态连接库(Dynamic Link Library)是包含共享函数库的二进制文件,可以被多个应用程序同时使用。建立应用程序的可执行文件,不必将DLL链接到应用程序中,而是在运行时动态装载DLL,装载时DLL被映射到调用进程的地址空间中。DLL中定义有两种函数:导出函数(export function)和内部函数(internal function),导出函数可以被其它模块调用,内部函数只能在内部使用。
       
        DLL与可执行文件非常相似,不同之处在于DLL包含在导出表(Export Table)。导出表包含DLL中每个导出函数的名字,这些函数是进入DLL的入口点。只有导出表中的函数可以被其它可执行程序调用。
       
        首先,定义文件从DLL中导出函数有两种方法:一种是创建定义文件(。DEF)
       
        并在建立DLL时使用。DEF文件;另一种是在函数的定义中使用关键字_declspec(dll export)。这里使用第一种方法,定义文件dll.def源代码如下所示:
        LIBRARY "dllu" //DLL库的名称为dllu.lib.
        DESCRIPTION 'my dll ' //DLL库的描述为“my dll”。
       
        EXPORTS //定义导出函数。
       
        opendevice //打开设备函数。
       
        closedevice //关闭设备函数。
       
        ReadLocation //从设备读取数据。
       
        WriteLocation //向设备写入数据。
       
        test //速度测试函数。
       
        其次,程序实现过程程序通过dllu.cpp来实现,其主要实现步骤如下:
        (1)在进行其它操作之前,应用程序必须打开设备。
       
        (2)在应用程序退出之前,必须执行设备的关闭操作。
       
        (3)简单的读写操作函数的编写。此函数将程序执行的错误码返回,同时,将设备端的数据写入一个名为“read.txt”的文件中。程序的入口参数staddr表示要求读取数据的起始地址,length表示要求读取数据的字节长度。
       
        (4)写操作与读操作原理相同,此步是编写写操作函数。此函数完成设备的读操作,它向应用程序返回一个整形变量,表示操作中产生的错误代码。应用程序需要告诉它数据写入的起始地址,数据长度和数据来源文件名称。
       
        (5)内部函数的编写,进行读写操作时都要用到的DeviceReadWrite函数代码,这是一个内部函数,外部应用程序不能访问。该函数完成对设备的读写操作,使用BOOL型变量,表示操作是否成功执行。参数command表示是要求进行读操作还是写操作,address表示欲访问设备RAM的起始地址,outDataLength表示写入设备的字节数,outDataBuffer表示欲写入数据区的指针,inDataLength表示读取设备的字节数,inDataLength表示欲存放来自设备数据的缓冲区指针。
       
        (6)测试设备的传输速度。为了测试设备的速度,特编写一个用于测试速度的函数。它连续的向设备读取262144个字节的数据,根据花费的时间与完成的数据量,可以计算得到数据传输率。注意这里得到传输率只是数据的净传输率,不包括USB协议的开销字节数量。
       
        至此,DLL程序已经编写完成,我们可以使用任何其他支持DLL的编程语言进行调用。
       
        应用程序可以利用Visual Basic编写。此应用程序实现的功能主要有以下几点:
        (1)实现对D12板的访问。
       
        (2)实现文本文件的访问与编辑。
       
        (3)实现位图的显示、存储与处理。
       
        在打开设备之前,关于设备的其他操作都是禁止使用的,这样可以避免用户在不知情的情况下,对设备进行不合法的操作,从而造成对系统的破坏。另外,在程序退出时,设备必须是关闭的。如果设备没有关闭,则强制执行设备的关闭操作。
页: [1]
查看完整版本: 视频信号采集与图象传输技术的研究----基于USB的图像传输接口设计