2024年1月12日发(作者:)

支激威艇求电子测量技术ELECrRONlCM[EASUREMENTTECHNOLOGY第33卷第1期2010年1月QNX6下PXI高速数据采集卡驱动程序开发侯轶宸苗克坚西安710129)(西北工业大学计算机学院测控系统体系结构教研室摘要:针对航空设备测试系统中需要长时间高速数据采集的问题,为PXI总线专用高速数据采集卡研发了基于QNX6实时操作系统的设备驱动程序。论文分析了QNX6的资源管理器层次结构以及PXI总线的特点,简要说明高速数据采集系统原理,详细阐述了QNX6系统下基于PXI的高速数据采集设备驱动程序的结构特点与实现难点。最后以ARINC429数据作为采集源,提出一个具体的测试方案,用软件分析采集到的数据,并绘出ARⅢC429数据波形图。经过验证,高速数据采集系统满足某航空测试设备的需求。关键词:PXI;QNX6;资源管理器;设备驱动程序中图分类号:TP2文献标识码:ADevelopmentofdriverofPXIhigh—speeddataacquisitioncardinQNX6Hou(TeatandControlSystemArchitectureYichenMiaoKejianScience,NorthWesternPolytechnicalUniversity,Xi’an710129)Lab,SchoolofComputertoAbstract:InordertOsolvetheproblemthatweneedcollecthigh-speeddatainisaalongtimeforaviationequipment,weThedevelopthedriverofPⅪhigh-speeddataacquisitioninQNX6.QNX6resourcereal-time0SintroducearchitectureofthemanagerinQNX6andthefeaturesofPXIbusareanalyzed.Wealsoonbrieflytheprincipleofhigh-speeddataacquisition.system.Ontheacquisitionbasisofthis。wefocusashoWtOdevelopthedriverofPXIhigh-speeddatatestcard.Atlast。wetakeARINC429dataanalyzetheacquisitionsource.Amethodi8proposed.WeusethesoftwareThetodataanddrawthewaveforlnofARINC429.TheexampleprovesthatthemethodiSeffective.high-speeddataacquisitionsystemmeetsthereal-timerequirementofthetestdeviceinaviationarea.Keywords:PXI;QNX6,resourcemanager;devicedriver两个基本原则来实现的。目前很多PXI的外围设备不具有QNX6下的设备驱动程序,所以需要自己开发QNX6下0引言数据采集是从传感器和其他待测设备等模拟和数字被测单元中自动采集非电量和电量信号,送到上位机中进行分析处理。数据采集系统是结合基于计算机或者其他专用测试平台,来测量软硬件产品,实现灵活的、用户自定义的测量系统口]。PXI是CompactPCIeXtentionforInstrumentation的简称,它将CompactPCI规范定义的PCI总线技术发展为合适于工业控制、测量、数据采集和试的设备驱动程序,本文将介绍如何开发QNX6系统下的基于PXI的高速数据采集设备的驱动程序。1QNX6资源管理器1.1设备驱动原理设备驱动程序提供连接到计算机的硬件的软件接口,它是操作系统的一个信任部分[4]。设备驱动程序就是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。1.2验应用的电气、机械和软件规范,从而形成r新的虚拟仪器体系机构【2]。QNX是一个分布式、多用户、多任务的嵌入式实时操作系统。被广泛应用到电信系统、航天仪器、工业自动化等方面。QNX从最初的QNX2升级为QNX4,再演变为今天的QNX6。QNX6是基于POSⅨ标准应用编程接口的,这使得熟悉UNIX或Linux的程序员QNX6资源管理器原理在QNX6中设备被称为资源,所有的资源由资源管理器管理,QNX的资源管理器负责给不同类型的设备提供一个接口[5]。而在其他操作系统中,对实际硬件设备(串・67・很容易进行程序的移植[3]。QNX6独特的效率,模块性和简单性,主要通过微内核结构和基于消息的进程间通信这万方数据

第33卷电子测量技术口。并n,网卡,磁盘等)或虚拟设备(/dev/null,网络文件系统,伪终端)的管理是通过关联于特定硬件的驱动程序实现的,但足QNX的资源管理器与设备驱动程序不同的是它以独立于内核的进程来运行,使之就像一个普通的应用程序。资源管理器是一个用户级程序,它使用发送/接收/回复消息协议来接收与回复消息,它接受来自其他程序的消息并有选择地与硬件进行通信。资源管理器运行方式如下:初始化资源管理器,向进程管理器注册,循环等待消息,当接收到消息时判断消息类型,然后调用相关的消息处理函数。如果你写一个资源管理器,那么你必须用一个循环来接收消息,而对于多线程资源管理器来说,相应的循环处理是隐含的,不必显式调用。本文所描述的实验采用的是多线程资源管理器。1.3QNX6资源管理器的构成通常,一个资源管理器由以下4层构成哺]:功能函数层(iofunc)资源管理器层(resmgr)消息转发层(dispatch)线程池层(threadp001)功能函数层,处于资源管理器的最高层,它由一系列写一个设备资源管理器,你就会需要使用它们,而不必担心具体细节fuJ题。如果你没有为系统消息提供相应的处理函数,那么功能函数层就提供了默认的处理。例如,你没有提供一个io_open处理器,那么当一个一IO一()PEN消至当你重写r相应的默认处理函数,你仍然可以调用这些read处理器,那么处理的开始,你可以调用iofunc—read—verify()来检杏客户端是否为读操作进行ropen()。功能函数层的所有函数和相应数据结构都被定义在头文件资源管理层负责处理大部分资源管理器库的细节,检没有使用资源管理层,那么你必须自己分析消息并处理。大多数资源管理器都会用到这一层。消息转发层扮演着一个阻塞点角色,它可以阻塞不同类型的事物。转发层通过dispatch—handler()来调用相应的处理函数。根据被阻塞的消息类型,处理器可能需要调用message一*()子系统。当使用message—attach()或pulse_attach()时,将需要针对消息类型或脉冲码进行一次类型处于资源管理器处理的序列中,并且路径名通过了resmgr_attach()进行连接,那么资源管理器子系统将被用来处理这些消息。当一个脉冲到来时,如果能被资源管理・68・万方数据器处理,它将被转发给资源管理器子系统。否则,如果select—attach()成功返回,并且脉冲码得到匹配,那么它将被转发给select子系统进行处理。如果一个消息被接收之后并没有匹配任何处理函数,那么资源管理器将向发送者返回一个MsgError。线程池层允许你写一个单线程或多线程资源管理器。这意味着,一个线程可以处理写消息,而另一个线程町以处理读消息。它町以独立于资源管理层而利用2PXI总线技术PXI总线具有如下优点:物理尺寸比VXI和GPIB等传统总线都小;总线宽度为132MB/s(最高町达528MB/s)远高于VXI或GPIB;开放的软件架构,与PCI兼容;牢固的结构,合适于放在工作台上,上架安装以及便携式使用;比GPIB或VXI有价格优势;有多个厂商可以提供多种机箱、背板、模拟、数字以及开关模块。时至今日,PXI已经成为当今自动化应用、测试的标准平台,它的开放式架构、灵活性和PC技术的成本优势为测量和自动化行业带来了一场翻天覆地地改革。PXI具有通用性、热拔插、可扩展性、高可靠性等特性非常适合数据采集处理系统口]。3高速数据采集卡本文以自研的高速数据采集卡的设备驱动程序开发为例,介绍在QNX6系统下如何开发PXI外围设备的驱动。高速采集卡为一块A/D采集卡,采集频率为4M/s,高速采集卡的电子硬盘容蹙较大,可在高速下长时间采集数据。例如实验所用的是频率为100K的429数据作为采集源,即429字中每位宽度为10弘s,那么高速数据采集卡采集429数据时每一位町以采集40个点,完全可以满足事后分析429数据的需求。如图1所示,高速数据采集系统原理如下,在QNx系统下发送控制命令,来配置FPGA中寄存器的状态,并通过9054配置芯片把PXI时序变成FPGA可用的时序,此时ARM一商在读寄存器的状态,判断寄存器是否被置位。如果控制命令对寄存器置位时,FPGA通过控制线把时序传给A/D,进行数据采集和}:传。FPGA中的两个寄存器一个用来表示数据采集,另一个用来表示数据上传。图1高速数据采集系统4QyX6下设备驱动程序的编写4.1获取硬件资源信息要正确的操作硬件,首先要获取正确的硬件的资源信处理大部分POSIX文件系统细节的10函数组成。如果要息到达时,iofune—open—default()将被自动调用。在这一层,同时也包含了默认处理函数能够调用的辅助函数,甚辅助函数。例如,你已经为-IO_READ消息写了自己的io_<sys/iofunc.h>中,命名格式为iofunc_*。查接收到的消息类型,调用相应的消息处理函数。如果你搜索。如果匹配成功,则连接函数就会被调用。如果消息

侯轶宸等:QNX6下PXI高速数据采集卡驱动程序开发第l期息,PXI和PCI在软件上是兼容的,因此PXI所有软件操作都是以PCI为基础的。QNX6中提供了丰富的PCI操作函数,可以自动的查找资源,读写PCI配置寄存器。首先调用pci—attach(),它是初始化前必须先执行的操作,用于连接PCI设备,它能保证PCI函数正确调用;在正确连接j二PCI服务器之后,通过调用pci—find—device(),通过两个参数:VENDORID(设备厂商号)和DEⅥCEID(设备号),来侦测所查询的PCI设备是否存在,查找过程遍历所用的PCI插槽,直到匹配为止,VEND()RID和DEⅥCEID它们的值可以根据硬件手册杳到;当没有找到需要的PCI设备时,调用pci_detach(),执行服务器断开操作,以使系统释放为该驱动分配的资源;如果成功找到PCI设备后,调用pci_attach—device(),连接PCI设备驱动并将系统为该设备分配的资源填充到用户定义的pci—dev_irffo系统结构一个变量中,为下面的操作提供有用的PCI信息;通过调用pci_read_config()来读取中断号和Mem空间基地址;读出的Mam空间基地址,先用PCI—MEM~削DDR转换pci服务器返回的地址为一个内存地址,再用mmap—device_memory映射设备的物理内存到一个线程地址空间嘲;4.2初始化资源管理器设备资源管理器可以分为单线程和多线程设备资源管理器。高速数据采集设备驱动程序采用的是多线程设备资源管理器。资源管理器需要先建立某种机制,以使客户端能够向资源管理器发送消息。这可以通过dispatch_create()函数调用来实现,它创建了并返回了一个dispatch数据结构。在这个结构里包含了通道ID。当进行相关连接,如进行resmgr_attach(),message_attach(),pulse_attch()时,才建立真正的通道。dispatch数据结构是不透明的,它的内容是不能被直接访问的。接下来初始化资源管理器属性,资源管理器属性结构用于配置有多少个IoV数据结构用于回复服务(nparts—max)和最小接收缓冲区大小(msg—max_size)。然后初始化消息处理函数,我们提供了两个表,连接函数表和I/0函数表。为避免手工填表注册处理函数,可以通过iofunc_fune__init()调用来一次性指定合适的iofunc_*一defauh()处理函数。QNX为开发者提供了可靠的默认处理函数,但用户也可以根据需要定义消息处理函数。例如iofunc_func—init(一RESMGR—CoNNECT—NFUNCS,&connect_funcs,一RESMGR_IO_NFUNCS,&io_funcs);io_funcs.devctl=io—devctl;//用户将使用自定义的io_devctl函数然后初始化设备所用属性结构,属性结构包含了与名字/dev/sample相关联的特定设备信息。它至少包含以下信息:设备类型和访问权限,拥有者ID和组ID。万方数据在资源管理器接收来自程序的消息之前,需要通过进程管理器通知其他进程自己所负责维护的路径名。任何对此路径前缀发出的请求才能被接收并处理。进程管理器根据注册的名字空间为请求操作的客户进程指派相应的资源管理器。id=resmgr_attach(dpp。/*dispatchhandle*|&resmgr_attr,/*resourcemanagerattrs*|”/dev/GSDevice”,/*devicename*/一FTYPE—ANY,/*opentype*/0,/*flags*}&connect_funcs./*connectroutines-16/杖io._funcs,|*~Oroutines*f&attr);/*handle*/if(id一一一1){fprintf(stderr,”s:Unabletoattachname./n”,argv[0]);returnEXIT_FAILURE;)本文简举介绍一下注册函数中的一些参数:设备名:关联到设备的名字(本例中为/dev/GSDevice)打开类型:指定了常量一FTYPE_ANY则告诉进程管理器,该资源管理器可以接收来自任何地方的open请求。标志:控制进程管理器的路径名解决行为。通过制定其值为O,我町以只处理对/dev/GSDevice的清求。接下来初始化线程池属性,线程池属性指明了哪些函数用来block循环和有多少线程町以同时存在。分配线程池处理句柄,线程池处理句柄用于控制线程池。用thread_pool_create()来建立一个句柄,它包含了给出的属性和标志。最后调用函数thread—pool—start()启动一个线程池。依照定义的THREAD_P()OI。PJ搋~M-T,在属性机构中我们为每个新建的线程分配了一个上下文结构,随后由于调用block_rune而被阻塞,当block—func返同时,线程将调用handler_func,这两类函数同样是通过属性结构给出的。每个线程都和单一资源管理器一样地工作,做同样的事情,按同样的规则处理消息。线程启动后,资源管理器就为处理消息做好了所有准备,thread—pool—create()中标志位P00L—FI。AG—EXIT—SELF的意思是,线程会通过ptbread_exit()来退出。4.3打开高速数据采集卡在驱动程序加载以后,用户程序就可以向操作文件一样操作设备。资源管理器根据系统调用函数open(”/dev/GS”,0LRI)、豫f0LNONBI。0CK)打开设备,返回一个设备文件句柄以供用户操作设备。4.4操作高速数据采集卡用户程序需要和驱动程序交互数据,比较简单方便的・69・

第33卷电子测量技术方法是使devctl()作为应用程序与驱动程序的接口。devctl()函数是用来与硬件通讯的最常用方式,用户可以利用它来向硬件发送数据,或接收来自硬件的数据,或同时收/发数据。通过devctl(handle,I)(2MD—GS,pctlGS,sizeof(Ctl—GS),NULL)传递给资源管理器。当资源管理器收到设备控制消息时,就会调用io—devctl()函数来控制设备。io_devctl()函数模块框架如下:intio_devctl(resmgr_context_t*ctp,io_devctl_t*msg,RESMGR一0CB_T*ocb){pctI_GSpctlGS=一DEVCTL—DATA(nlSg一>i);//从消息中取得数据结构iRet=ThreadCtl(一NTO一卫CTL-10,O);//获取对端口进行I/o操作的权限resmgr_msgread(ctp,pctlGS,sizeof(Ctl—GS),sizeof(msg一>i));dcmd—msg一>i.dcmd;switch(dcmd){case13CMD_GS:cmd=pctlGS-->cmd;switch(cmd){caseI()CTL—Gs—READ—REG-ISTER—ULoNG://读采集卡中的寄存器pctlGS一>longdata=*(MemBase+(pctlGS-->offset)/4);//MemBase为初始化硬件时得到的硬件基址信息nbytes=sizeof(Ctl_(羚);//表明返回给用户程序的字节数resmgr_msgwrite(ctp,pctlGS,sizeof(Ctl—GS),sizeof(msg一>o));break;caseI()cTLGS_WRITE_REGIsl飞R_ULONG://写采集卡中的寄存器tl-((MemBase)+pctlGS一>offset/4)一pctlGS一>longdata;nbytes=0;//返回的数据字节数为0break;})memset(&msg-->o,0,sizeof(msg-->o));msg一>o.nbytes—nbytes;return—RESMGR_PTR(ctp,&msg一>o,sizeof(msg-->o)+nbytes)1)・70・万方数据从代码中可见,被传递的数据直接跟在io—devct—t结构后面,可以使用宏一DEVCTL_DATA(msg-->i)得到这个指针。取出所传递进来的命令,首先判断是读命令还是写命令。例如,传进来的命令是读命令,取出偏移地址,根据之前获取的硬件资源信息,可以读出所要的数据,然后把数据返同给用户程序。如果是写命令,就町以在具体的地址完成写操作,不需要返回数据给用户程序。4.5高速采集ARINC429数据以频率为100K的ARINCA29数据作为采集源进行实验。实验所用工控机为凌华PXI-3800,插入AR州@29接口板和高速数据采集卡。以QNX6为软件平台。把ARINC429接口板的数据输出端连接到高速数据采集卡设备的采集源输入端。首先启动发送ARINCA29数据,然后启动高速数据采集设备的采集功能,把采集到的ARINCA29数据写入电子硬盘,等到写满电子硬盘后,启动上传数据的功能,把从电子硬盘读到的数据写入FPGA的FIFO,接下来从FIFO中读数并写到工控机硬盘中,并以dat文件形式保存。采集到的数据经软件分析后,绘出ARINCA29的波形图,如图2所示,经过与示波器所示波形的比较,可以看出高速数据采集卡采集到的数据很好的回放了ARINC429波形。本数据采集系统可长时间高速采集数据,满足某航空测试设备的要求。图2ARINC429波形图4.6释放设备资源在操作完成设备之后,应释放对硬件的控制权,例如释放占用的内存和中断等。5结论在QNX6系统下,用资源管理器开发设备驱动程序,结构清晰,代码利用率高。QNX6中作为设备驱动使用的资源管理器独立于内核运行,所以驱动的调试与其他程序一样,驱动中的任何BUG都不会引起整个操作系统关闭。本文所述的高速数据采集设备的驱动程序,现已用于某航空测试设备,效果良好。(下转第85页)

王朋辉等:基于SIMD的实时GPS软件接收机3.2静态定位参考文献[11第1期图4为采用最小二乘法求解用户的位置和速度,其中位置显示的是在地心地固坐标系(ECEF)下减去接收机位置均值的误差,速度为接收机在ECEF坐标系下的速度。由图中可以看出,位置误差在10m以内,位置定位误差的翟传润,徐敏,战兴群,等.实时GPSLI软件接收机定位精度改进[J].上海交通大学学报,2008,42(4):175—178.LEDVINABM,p0WEI.I,SP.A12-ChannelReal-TimeGPSL1SoftwareReceiver[C].Proceedingsof均方差分别为2.04米级。mom,3.54m,3.19m。速度误差在分[23f碳詈‘…mImom瞳!挚.薹b.=。.▲唑塑-0.02。b业o.02f1。速度洪爱…¨匕::::::二二二==-Y误差(m)the2003NationalTechnicalMeetingoftheInstituteofNavigation,2003(2):767—782.[3]ENGELF,MUMFORDP,PARKINSONGNSSReceiverofResearchGlobalK,etaLAnOpenPlatformPositioning▲y速度误差(rods)Architecture[J].JournalSystems,2004(3):63—69。[4]儿NT,QINHL,ZHUJJ,eta1.Real-timeGPSSoftware[5]TSUIReceiverCorrelatorDesign[R].ShangHai:ChinaCom,Aug22。2007.JBY.FundamentalsofGlohalPositioning加O撕时间(0.1s)时|’日j(0.Is)SystemReceivers-AInterscienceSoftwareApproach[M].AWileyPublication,2003.[6]图4ECEF坐标的定位结果HECKLERGlibraryW,GARRlSONJL.s】:MDcorrelatorsoftwareforGNSSreceivers[J].GPS4结论[7]Soloutions,2006(10):269—276.KAPLANED.UnderstandingGPS。PrinciplesandHouse,Inc.1996.GPS软件接收机和硬件接收机相比,具有很大的灵活性,目前各种卫星导航系统处于更新换代的快速发展中,Applications[M].Boston:Artech[8]社,2003.作者简介王惠南.GPS导航原理与应用[M].北京:科学出版软件接收机更能适应这一潮流,各种新的算法、完备性检验、组合导航算法都可以在软件接收机上方便的实现。本文提出的基于SIMD指令的实时软件接收机,在目前的x86指令CPU上都可以实现,和基于MATLAB的软件接收机相比,运行速度有了很大的提高,具有更大的使用价值。软件接收机通过改变程序,可以用来跟踪其他的导航系统的信号。王朋辉,男,河南洛阳人,硕士研究生,主要研究方向为卫星导航。Dmail:fenixwph@yahoo.com.cn(上接第70页)参考文献[1]陈嵩,沙斐.基于嵌入式以太网技术的便携式数据采集系统[J].电子测量与仪器学报,2007,21(6):62-66.驱动程序开发[J].化工自动化及仪表,2005,32(2):35—38.[7]孙昊.基于CPCI总线的多CPU航空总线测试模块实现[J].电子质量,2009,4:23—25.[23刘鑫,周金莲.CompactPCI总线工控机技术的现状与应用[J].电子技术应用,2002,28(7):6-8.[83AlessandroRubinkLINUX设备驱动程序[M].北京:中国电力出版社,2002.410—418.作者简介侯轶宸,男,1984年9月出生,硕士生,[3][43于爱县,苗克坚.基于QNX6的PCI总线设备驱动设计[J].安徽工业大学学报,2008,25(2):185—189.ChrisCant.WindowsWDM设备驱动程序开发指南主要研究方向为嵌入式系统及其应用。E-mail:xiandaohl@126.tom[M].北京:机械工业出版社,2003.8-11.[53[6]王斑.QNX驱动程序的编写口].测控技术,2006,25(6):54-56.黄峰,单家方.QN)(系统下PXI多功能数据采集卡・85・万方数据