闫航,刘亚斌,张秀磊
(北京航空航天大学自动化科学与电气工程学院,北京100191)
图像采集测试系统在测试与控制领域应用的十分频繁,图像采集的质量和速度在很大程度上直接影响着控制的精度与速度,而其中很多地方用到了以LVDS通信协议来传输信号的图像采集系统。在高速数据传输方面,PXI总线结构作为传输总线在很多领域都已经运用过,具备很好的传输性能与稳定性[1-3]。因此,基于PXI总线的驱动程序开发就显得尤为重要。为了测试某型号空空导弹位标器工作时图像信号,而研发了围边跑特性评估系统,而这套系统的核心便是四通道LVDS图像采集卡[4-6]。因此,在PXI总线下开发出稳定快速的驱动程序成为这个系统中尤为重要的部分。
为了满足某型号位标器特性评估系统设备要求,研发出的四通道图像采集卡具有以下具体功能:实现PXI总线接口,同时满足LVDS通信协议的要求;缓存大小为512 K*16 bit;数据带宽40 Mb/s;具备自检功能。
在过去的驱动开发中,主流的开发框架是基于WDM的,但是其繁琐的电源管理功能的实现,以及即插即用等模块来说,相对于最新的WDF框架,其开发的复杂程度都是很高的。同时随着微软不在更新xp系统,掌握对win7甚至是win10支持更加完美的WDF框架变得势在必行。本文正式基于WDF框架,对于某型号位标器特性评估系统所需要的LVDS图像采集卡进行驱动的开发。微软的WDF框架,并不是对WDM框架的否定与推翻,而是在WDM的基础上进行了更加人性化的封装,从很多方面降低了开发的难度、缩短了开发周期。文中采用的是WDF中的KMDF(内核模式驱动程序框架)。图1的简图中展示了IO请求从用户程序下发到IO管理器,之后被转换成为IRP之后再派发给底层的设备;用户程序工作在用户层,在与内核进行交互时只能使用部WIN32 API来实现;内核子系统的主要功能是将用户的请求包装成IRP并发送给相应的设备进行处理;WDF内核框架从功能上可以分为两个部分,上半部分负责接收IRP包,下半部分负责发送IRP包,同时WDF内核框架还实现了3个在驱动开发中十分重要的模块:对象模块、IO模块和PNP/电源模块[7]。
图1 KMDF内核框架
驱动对象在整个驱动编写的过程中占着极其重要的地位,在很多地方的优化和处理都离不开驱动对象。调用WdfDriverCreate函数就可以创建一个全局的驱动对象;对于同一个设备文件,在同时运行多个设备时,驱动对象是唯一的。在整个WDF驱动程序中,只需要调用WdfGetDriver()函数,就可以从一个全局结构体中,获得同一个驱动的句柄。
在以往的WDM驱动框架中,设备对象是整个驱动框架的核心,但是在微软新推出的WDF驱动框架中,设备对象在如今的驱动开发中已经不再贯穿整个驱动的始终,很多地方都由其他的对象来实现和完成[8]。在WDF驱动框架中,使用EvtDriverDeviceAdd()函数来创建设备对象。在四通道LVDS图像卡中,BMKLvds_EvtDeviceAdd()函数主要实现了以下功能:
1)WdfDeviceInitSetIoType()函数设置驱动中 IO的类型,参数设置的不同导致读写数据时所访问的内存地址的不同。
2)WDF_PNPPOWER_EVENT_CALLBACKS_INI T()函数进行即插即用的初始化以及电源管理例程配置结构。
3)WDF_FILEOBJECT_CONFIG_INIT()函数设置相应的create和close相应的例程。
4)WDF_OBJECT_ATTRIBUTES_INIT_CONTEX T_TYPE()函数初始化设备对象环境变量结构。
5)deviceAttributes.Synchronization Scope=Wdf SynchronizationScopeDevice函数实现了设备对象下的同步。
6)WdfDeviceCreate()函数创建设备对象并通过GetDeviceContext()函数获得设备对象环境变量结构地址指针。
7)WDF_INTERRUPT_CONFIG_INIT()函数通过函数指针的方式设置中断服务例程和延迟过程调用,并通过WdfInterruptCreate()函数创建中断对象;在4通道LVDS图像卡中,图像数据的采集是使用DMA实现的,调用BMKLvds_InitializeDMA()可以初始化LVDS图像卡的DMA模块。
8) WDF_IO_QUEUE_CONFIG_INIT_DEFAUL T_QUEUE()函数配置IO队列,同时对EvtIoRead、EvtIoWrite、EvtIoDeviceControl进 行 配 置 ;使 用WdfIoQueueCreate()函数创建队列。
9)最后一步,使用Wdf Device Create Device Interface()创建设备驱动接口 GUID[9-11]。
与WDM驱动框架相同,WDF框架在对系统的IO请求方面做了相同的处理。IO管理器将IO请求封装成IRP结构体,然后转发给内核驱动,WDF框架收到IRP请求之后,通过判断IRP的类型,根据不同的请求调用事件回调或是直接在框架内部处理。图2表示驱动程序对I/O请求如何进行处理[12-14]。
图2 IRP执行路径
在LVDS图像卡驱动中,主要通过4个函数来实现板卡所有的I/O请求,分别是Create处理程序、Close处理程序、Read处理程序和DeviceControl处理例程。在Create处理程序中,驱动程序会在框架接收到IRP_MJ_CREATE的请求之后调用BMKLvds_EvtDeviceFileCreate()回调函数函数。在Close处理程序中,驱动程序会释放在驱动中所使用的的内核事件,同时不在接收新的中断。DeviceControl处理例程实现了大部分驱动的I/O功能,在应用程序中调用DeviceControl函数后,框架会调用回调函数BMKLvds_EvtIoDeviceControl(),并将这个I/O请求打包为IRP转发给相应的设备。对于4通道LVDS图像采集卡驱动程序,拥有以下I/O功能。1)BMK_LVDS_REGISTER_DATA_ARR_EVEN T,中断到来时,会创建一个通知用户程序的信号量;2)BMK_LVDS_UNREGISTER_DATA_ARR_EVENT,将上述创建的信号量删除;3)BMK_LVD S_REGISTER_WAITDMASTART_EVENT,创建一个用来等待DMA启动的事件;4)BMK_LVDS_UNRE GISTER_WAITDMASTART_EVENT,删除上述创建的事件;5)BMK_LVDS_SEND_DATA,以 LVDS协议将上位机所设定的数据发送出去;6)BMK_LVDS_STOP_SEND,停止发送数据;7)BMK_LVDS_RECV_DATA,以LVDS协议接收传进板卡的数据;
8)BMK_LVDS_STOP_RECV,停止中断方式接收数据;
9)BMK_LVDS_DMA_SEND,以 DMA 方式发送LVDS数据。
10)BMK_LVDS_DMA_RECV,以DMA方式接收LVDS数据。
11)BMK_LVDS_CHANAL_CHANGE,切换图像卡接收数据的通道。
四通道LVDS图像采集板卡能够产生两类中断:Local中断和DMA中断。其中Local中断是由板卡的Local端产生的,Local中断在4通道LVDS图像卡中分为FIFO中断、数据传输完成中断。在板卡上的硬件FIFO资源达到上位机设定的值之后,会产生FIFO中断,通知上位机程序来取走数据;数据传输完成中断表示底层数据采集结束,且所有采集的数据都转移到FIFO中,从而产生中断告诉上位机,上位机一次性将FIFO中数据取走便完成了本次的采集任务。
驱动程序在处理中断时,并不是直接处理,因为中断的优先级很高,占用这个优先级进行相应的数据处理对于整个系统来说会造成不良的影响;故先判断中断的类型,然后屏蔽该类型的中断,紧接着在DPC延迟处理程序中对相应的中断进行处理[15]。
图3 驱动程序中断处理流程图
在现场的测试过程中,很多时候需要做高低温实验,高温加温到60度保温两个小时,低温降温到零下40度保温两个小时,因此如果一次只测试一发产品的话对于人力和物理来说都是很大的浪费,所以在结合现场的实际条件,提出了基于PXI的四通道LVDS图像采集卡,图像采集卡中,通过4片DS90LV048A芯片可以独立的采集四路图像信号,通过上位机给底层FPGA发送控制命令,来选择采集哪一路数据,实现四路独立的LVDS图像采集功能。四路图像数据之间独立性十分好,互不干扰,经过长期的测试,效果很好,达到了预期想要实现的效果。
2.2.1 液料比对树舌灵芝多糖提取率的影响。由图1可知,液料比在15∶1~35∶1范围内,GASP提取率与液料比呈正相关;在35∶1时最大,提取率可达2.18%;而液料比超过35∶1以后,随着液料比的增大GASP提取率呈下降趋势。这可能是因为在一定范围内,随着液料比的增大可以提高植物细胞内外溶剂的浓度差,从而使水溶性多糖迅速溶出从而提高多糖提取率[16],但液料比达到一定值后,液料比太大,浓缩时间延长,导致多糖损失[17]。综合考虑,选择35∶1为BBD(Box-Behnken Design)试验液料比的中心点。
在通过WDF框架编写完驱动程序之后,首先通过windbg程序进行了初步的调试,验证驱动程序中对于fpga的指令能够成功的发送下去,同时使用双机联调的方式调试驱动程序,在确保驱动程序的正确性。在VC++6.0的环境下针对之前开发的驱动程序,进行测试用动态链接库的编写,测试用的动态链接库主要包含以下几个功能:
1)打开板卡,在内存中声明相应的对象;
2)配置通道,通过FPGA指令的形式对四通道LVDS板卡的采集通道进行选择,这一步必须发生在数据采集步骤之前,因为在FPGA中,如果不对板卡的通道进行配置,默认的是一个通道也不选择的情况;
3)开始采集,这个功能并不是真正意义上的开始采集数据,而是在动态链接库层根据上位机软件传递的值,对动态链接库层接收数据的缓冲区FIFO进行初始化和配置,准备接受来自底层驱动的数据,以及接收数据之后如何将数据以一定的格式、协议传递给上位机软件,最后存储在计算机的内存或者是本地数据库中。在本测试软件中,在动态链接库层暂时声明了一个10M的FIFO,当LVDS图像采集卡开始采集数据,底层的驱动程序将数据以驱动程序中规定的格式以及协议传送的动态链接库层中的FIFO中,而FIFO中只要有数据,就通知上位机软件动态链接库层已经接收导数据,此时,上位机开始从动态链接库层得FIFO中取数据。这样便实现了LVDS图像数据从底层硬件到驱动程序,然后到动态链接库,在到上位机软件,最后到达计算机的硬盘或者本地的数据库中这样一个数据的传输过程。最后在检查计算机硬盘中的数据的正确性就能够确定驱动的正确性。
4)采集数据,在开始采集之后就可以以一定的数据量、格式、协议采集数据了;
5)停止采集;
图4为测试结果,让四通道LVDS图像采集卡接收0x0000~0xff的数据。
图4 测试结果
图4的测试结果只是很多次测试中的一组,在测试完之后会自动验算测试结果,显示丢帧数。通过实际测量300组测试,发现采集结果正确,没有出现丢帧错帧的情况,同时采集速度也能够满足需求。
通过使用WDF驱动框架对4通道LVDS图像采集卡的开发,发现相对于WDM
驱动框架,WDF对于很多功能的封装更加晚上,更加人性化,大大加快了开发的效率。文中基于WDF框架实现了整个驱动程序的开发,在实际的测试任务重运行稳定,能够很好的采集位标器穿回来的图像数据。
参考文献:
[1]郝贤鹏,张然峰,陶宏江.基于FPGA的高速图像传输系统设计[J].红外与激光工程,2015,44(11):3-4.
[2]马志刚,朱思敏,刘文怡.基于LVDS的高速图像数据存储系统设计[J].数据采集与处理,2013,28(3):1-4.
[3]张小军,廖风强,王录涛,王文平.多通道高速串行LVDS信号解串器设计[J].电子测量技术,2013(4):1-3.
[4]范旭东,沈三民,刘建梁,等.基于LVDS和68013A的数据控制传输系统设计[J].计算机测量与控制,2016,39(6):14-16.
[5]窦维治.基于高速并行LVDS总线在视频处理系统中的应用研究[J].电子器件,2013,31(3):11-13.
[6]李斌,张会新,刘文怡.基于LVDS的高速图像数据存储器的设计与实现[J].电视技术,2013,31(3):3-5.
[7]周欢,宋征宇.基于BMU/LVDS总线的闭环总检查测试技术研究[J].航天控制,2013,31(3):1-4.
[8]张天文,刘文怡.基于LVDS和PCI接口的高速图像传输系统设计[J].电子技术应用,2014,40(7):1-4.
[9]肖文君,刘万松,刘伍丰,等.基于WDF的PCIe总线驱动程序设计与实现[J].测控技术,2015,34(7):3-6.
[10]何帅,王文基,狄卫国.基于WDF的航天测控数字基带板驱动程序设计[J].无线电工程,2016,46(4):9-11.
[11]贾玉姣,刘亚斌,张秀磊.基于高速多通道采集模块的数字化仪软件设计[J].科学技术与工程,2016,24(12):1-3
[12]李世建.基于FPGA的PCI Express接口设计及WDF驱动程序开发[D].西安:西安电子科技大学,2013.
[13]黄华华,魏丰,邓林杰.基于PCI设备的DMA传输建模与分析[J].数字技术与应用,2015(5):1-4.
[14]李木国,黄影,刘于之.基于WDF过滤驱动的监控系统的设计与实现[J].计算机光盘软件与应用,2014(11):2-5.
[15]黎顺杰,张艳荣.基于WDF的PCI-CAN设备驱动程序设计[J].电子测试,2013(5):2-4.