一种在pci总线上实现数据高速传输的方法

文档序号:6442501阅读:136来源:国知局
专利名称:一种在pci总线上实现数据高速传输的方法
技术领域
本发明涉及一种总线数据高速传输方法。
技术背景
在航天测控领域,高速的总线传输已经成为一种必需的技术。
在地面测控设备中,普遍采用PCI&PCI-X的总线结构,在设备板上用外购的接口芯片完成总线交互,由于商用芯片多是为中低速率传输设计的,灵活性较差,难以满足高速的数据传输需要,因此,需要有一种好的方法在PCI&PCI-X总线平台上实现高速传输。发明内容
本发明的技术解决问题是克服现有技术的不足,提供了一种在PCI总线上实现数据高速传输的方法。
本发明的技术解决方案是一种在PCI总线上实现数据高速传输的方法,包括总线设备端与PCI总线之间的数据传输方法以及PCI总线上所挂接主机的驱动程序内存使用方法,其中总线设备端与PCI总线之间进行数据传输时采用状态机进行控制,方法如下
(1)在收到直接内存传输开始的命令后,状态机首先发起本地数据发送,然后将接收到的本地数据保存到FIFO中;
(2)当FIFO中的可读数据大于可读预设值后,以该可读预设值作为直接内存传输的数据量进行传输;
(3)在直接内存传输过程中,状态机始终监视FIFO中存储的数据量,如果FIFO中的可读数据量小于可读预设值,则停止直接内存传输,同时本地数据继续存入FIFO中;
(4)当FIFO中的可写数据量小于可写预设值时,状态机停止本地数据传送;当 FIFO中的可写数据量大于可写预设值时,状态机重新开始本地数据传送;
通过上述状态机的不同状态切换完成总线设备端与PCI总线之间的数据传输;
PCI总线上所挂接主机的驱动程序内存使用方法如下
(1)为主机的驱动程序预设一个长度为A的非分页内存单元,由主机的应用程序在初始化时通过驱动接口进行申请,A的大小大于每次直接内存传输的数据量;所述的非分页内存单元为主机操作系统管理的连续物理内存;
(2)驱动程序在收到应用程序的请求后,循环向操作系统申请以A为大小的非分页内存单元,直到申请到的非分页内存单元大小满足应用程序的要求;
(3)驱动程序将申请到的各内存单元的起始地址存入内存块地址列表;
(4)设定内存块地址列表中第一块内存的起始地址作为第一次直接内存传输的写指针;
(5)当有直接内存传输请求时,首先读取需要传输的数据量,然后根据直接内存传输的写指针位置判断该直接内存传输的数据量是否超出该非分页内存单元的边界,如果没有越出则直接返回写指针所在内存地址进行直接内存传输;如果越出则顺序查询后面的非分页内存单元,并将满足数据量传输要求的非分页内存单元的初始地址作为写指针进行直接内存传输。
所述的可读预设值或者可写预设值为48。所述的A的大小为8女1024女1024。
本发明与现有技术相比的优点在于
(1)本发明采用FPGA作为板卡的总线控制器,并在商用PCI Core的基础上开发传输控制流程,极大的提高了总线传输的效率,并在驱动程序一端使用了链式内存管理策略, 在驱动程序和应用程序之间共享内存,极大地提高了主机的效率,使得将数据从设备板通过PCI&PCIX总线传输给应用程序成为可能。经过测试,采用本发明,在PCI和PCI-X总线上都能达到很高的传输速度,可以为需要在PCI&PCI-X工控设备开发高速应用的用户提供一个可行的选择;
(2)采用本发明方法,与目前普遍采用的商用桥接芯片的方式相比,采用FPGA和商用IP Core作为底层的桥接芯片,可根据需要进行流量控制,更能满足高速数据传输的需要;
(3)本发明采用FPGA作为板卡的总线控制器,相对目前商用芯片的接口形式来说,外部数据接口方式更灵活,比采用商用的桥接芯片工程适用性更强;
(4)本发明的驱动程序接口采用了链式内存池管理技术,在驱动程序和应用程序之间最大程度的减少了数据交互次数,很大程度的提高了数据采集的效率,减少了对于主机性能的依赖;
(5)本发明方法在66MHz/64位宽的情况下数据传输能到400MBps,在 PCI-X/100MHz/64bit的情况下数据传输能到600MBps,远大于现有常规设计的传输能力。


图1本发明的原理示意图2为本发明方法的传输控制流程示意图3为本发明主机驱动程序链式内存池结构示意图4为本发明主机驱动程序链式内存管理流程示意图。
具体实施方式
首先对本发明方法中涉及到的专有名词进行解释
PCI 夕卜部设备互联总线(Peripheral Component Interconnector)
CPCI Compact PCI (欧式加固 PCI 总线结构)
PCI-X =PCI总线的升级版,速度更快
FPGA 可编程门阵列(Field Programmable Gate Array)
IP Core 知识产权核(Intelligence Property Core)
DMA:直接内存传输(Direct Memory Access)
FIFO 一种能够先入先出(First In First Out)的存储结构
非分页内存操作系统管理的连续物理内存
本发明是一种在PCI&PCI-X总线上实现高速数据传输的方法,采用的主机设备为 CPCI工业控制计算机或者带有PCI-X总线的服务器,设备端以Altera的EPCS1S25型FPGA为总线接口芯片,本发明的主要内容为对FPGA内部传输控制算法和主机驱动程序进行优化,在FPGA内部开发高效的数据传输控制接口,控制流量和稳定性,实现FPGA到主机总线的最优传输效率,同时在主机端设计高效的驱动程序接口,采用链式内存池等优化技术将高速数据高效的传输到应用程序,使得总线速率达到最优。
在FPGA内部采用商用的PCI&PCI-X IP Core (以下简称PCI Core)作总线接口控制,本发明在PCI Core与本地逻辑之间设计传输控制方法,控制流量和传输稳定性,达到高速的数据吞吐能力;为了把高速总线数据传输给用户程序,本发明在主机端优化了内存传输机制,在主机驱动程序使用链式内存池技术,将申请的内存分块进行管理,并在驱动程序和应用程序之间共享内存,保证了驱动程序和应用程序之间高效率的数据交互,使得总线传输到应用程序的消耗最小,如图1所示。
图2说明了传输控制优化后的流程(这里只说明从设备板到主机的传输),图中 SO表示空闲,Sl表示启动本地传输,接收数据,准备DMA传输,S2表示传输中本地传输开启,DMA传输量设为预设值,S3表示等待,根据可读和可写数据量控制本地传输和DMA传输量。整个传输流程由一个状态机实现,在收到DMA开始的命令后,状态机首先发起FPGA本地传输并接收数据保存到FIFO中,在FIFO中可读数据大于预设值后,设定DMA传输量为预设值,此时发起DMA传输;在传输过程中,状态机一直监视FIFO的数据量,如果可读数据量小于预设值,表示FPGA本地传输的速度跟不上总线传输的速度,就将DMA传输量更改为0, 同时FPGA本地传输继续往FIFO中存入数据,这样,PCI Core在传完预设值长度的数据后, 就停止等待,直到FIFO中有超过预设值的数据量再更改DMA传输量为预设值。如果可写数据量小于预设值,表示总线速度跟不上FPGA本地传输的速度,此时就停止FPGA本地传输操作,状态机进入等待状态,直到FIFO中可写数据量重新大于预设值。具体过程如下
(2. 1)在收到DMA开始的命令后,状态机首先发起FPGA本地数据发送,然后接收数据保存到FIFO中;
(2.2)在FIFO中可读数据大于预设值后,设定PCI Core的DMA传输量为预设值, 开始DMA传输;
(2. 3)在传输过程中,状态机一直监视FIFO的数据量,如果可读数据量小于预设值,就将PCI Core的DMA传输量更改为0,同时FPGA本地数据发送继续往FIFO中存入数据;
(2. 4)在传输过程中如果可写数据量小于预设值,状态机停止FPGA本地数据传送,进入步骤(2.5);
(2. 5)在FIFO中可读数据量超过预设值时,进入步骤(2. 2)。
其中预设值可以根据实际情况进行确定,例如可以为48。
图3说明了主机里驱动程序对内存使用的优化,在高速传输的驱动程序里,内存拷贝是很耗费时间的,优化的目的是使数据在DMA传输和应用程序拷贝都使用同一块缓冲区,这样能最大限度的减少时间消耗,提高传输效率。考虑到驱动程序的DMA传输需要使用连续的非分页内存,而应用程序不能从操作系统申请到这样的内存,所以,只能从驱动程序里申请到内存然后再把内存指针共享给应用程序使用,因为操作系统的内存管理机制,在驱动程序里非分页内存是很宝贵的,大块的连续非分页内存很难申请到,为了克服这些困难,本发明采用了多块小内存组成链式内存池的内存管理模式,由链式内存管理模块统一管理,在DMA传输和应用程序请求时为它们分配缓存空间。
图4说明了驱动程序里链式内存使用的流程,管理程序负责申请,分配和释放内存,在应用程序启动的时候,需要通过驱动接口向管理程序申请内存,并设置分块大小,管理程序根据申请的块大小逐块进行内存申请,如果申请失败,则只使用申请成功的部分,并把结果通知应用程序,在内存申请完成后,管理程序实时判断是否有DMA内存请求或者应用程序内存请求,如果有DMA内存请求,就根据读写指针从内存池里分配出一块连续内存返回给DMA ;如果有应用程序内存请求,就把有效的地址列表返回给应用程序,由应用程序控制相关的读写指针;链式内存采用循环使用的方式,在最后一块内存用完后,再操作第一块内存,这样能最大限度的保证数据传输速度。具体过程如下
(3. 1)为驱动程序预设一个非分页内存单元长度为A,由应用程序在初始化时通过驱动接口进行申请,A的大小应该大于每次DMA传输的长度;
(3.2)驱动程序根据在收到请求后,循环向操作系统申请以A为大小的非分页内存块,直到申请到应用程序要求的大小;
(3. 3)将申请到的各个内存块的起始地址放入列表里,如果没有申请到足够的内存,则保存已申请到的内存块地址列表;
(3. 4)设定第一块内存的起始地址作为第一次做DMA传输的写指针;
(3. 5)如果有DMA传输请求内存,首先读取需要传输的长度,然后根据DMA写指针察看是否会越过内存块的边界,如果没有越过,则直接返回写指针,如果会越过边界,则把下一块内存的初识地址作为写指针并返回给DMA传输;
(3.6)如果有应用程序申请内存,首先查看是否已经为它申请了内存,如果已经完成,则直接返回内存地址列表,由应用程序控制读写操作,如果还未完成,重复3. 1-3. 3,然后返回内存地址列表;
其中A的大小可以根据实际情况进行确定,例如可以为8 * 1024 * 1024。
表1给出了采用本发明方法后总线传输性能的提升值
表1 PCI&PCI-X性能测试结果
权利要求
1.一种在PCI总线上实现数据高速传输的方法,其特征在于包括总线设备端与PCI 总线之间的数据传输方法以及PCI总线上所挂接主机的驱动程序内存使用方法,其中总线设备端与PCI总线之间进行数据传输时采用状态机进行控制,方法如下(1)在收到直接内存传输开始的命令后,状态机首先发起本地数据发送,然后将接收到的本地数据保存到FIFO中;(2)当FIFO中的可读数据大于可读预设值后,以该可读预设值作为直接内存传输的数据量进行传输;(3)在直接内存传输过程中,状态机始终监视FIFO中存储的数据量,如果FIFO中的可读数据量小于可读预设值,则停止直接内存传输,同时本地数据继续存入FIFO中;(4)当FIFO中的可写数据量小于可写预设值时,状态机停止本地数据传送;当FIFO中的可写数据量大于可写预设值时,状态机重新开始本地数据传送;通过上述状态机的不同状态切换完成总线设备端与PCI总线之间的数据传输;PCI总线上所挂接主机的驱动程序内存使用方法如下(1)为主机的驱动程序预设一个长度为A的非分页内存单元,由主机的应用程序在初始化时通过驱动接口进行申请,A的大小大于每次直接内存传输的数据量;所述的非分页内存单元为主机操作系统管理的连续物理内存;(2)驱动程序在收到应用程序的请求后,循环向操作系统申请以A为大小的非分页内存单元,直到申请到的非分页内存单元大小满足应用程序的要求;(3)驱动程序将申请到的各内存单元的起始地址存入内存块地址列表;(4)设定内存块地址列表中第一块内存的起始地址作为第一次直接内存传输的写指针;(5)当有直接内存传输请求时,首先读取需要传输的数据量,然后根据直接内存传输的写指针位置判断该直接内存传输的数据量是否超出该非分页内存单元的边界,如果没有越出则直接返回写指针所在内存地址进行直接内存传输;如果越出则顺序查询后面的非分页内存单元,并将满足数据量传输要求的非分页内存单元的初始地址作为写指针进行直接内存传输。
2.根据权利要求1所述的一种在PCI总线上实现数据高速传输的方法,其特征在于 所述的可读预设值或者可写预设值为48。
3.根据权利要求1所述的一种在PCI总线上实现数据高速传输的方法,其特征在于 所述的A的大小为8 * 1024 * 1024。
全文摘要
一种在PCI总线上实现数据高速传输的方法,采用FPGA作为板卡的接口控制芯片,集成PCI Core作为总线控制接口,在FPGA中优化传输控制方法,使得数据从FPGA到总线能高速平稳传输,同时在主机驱动程序采用链式内存使用方式,在驱动程序内部以及驱动程序和应用程序之间最大限度的提高了内存拷贝的效率,使得整个传输链路的效率得到了极大的提升。在64位PCI总线66MHz速率下,数据传输可以达到400MBps,在64位PCI-X总线100MHz的速率下,数据传输可以达到600MBps,能够满足目前大多数的高速传输需求,可为需要使用PCI&PCI-X总线做高速数据传输的用户提供一个可行的选择。
文档编号G06F13/38GK102521184SQ20111043321
公开日2012年6月27日 申请日期2011年12月20日 优先权日2011年12月20日
发明者刘斌, 朱颖 申请人:北京遥测技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1