作者:East  FPGA那点事儿

上一章讲述了PCIe总线DMA的原理和XAPP1052存在的问题。

本章以服务器常用的4通道1000M以太网卡为例讲述如何提高DMA的效率。

1.内存重分配
Windows操作系统会划分一部分硬盘空间作为虚拟内存,将长时间不用得应用程序或内存交换到硬盘中,而释放出一部分内存空间供其他应用程序使用,提高计算机的性能。

或者操作系统会定进行内存碎片整理,将应用程序中零散的内存收集起来重新分配,减少内存碎片。

但是如果被交换或整理的是DMA使用的内存就麻烦了。操作系统已经为该内存重新分配了物理地址,而原内存分配给了其他应用程序,此时DMA再使用该内存,必然导致死机蓝屏现象。XAPP1052就没有很好的解决该问题,在程序中设置禁止将该内存交换到硬盘或整理。

2.内存大小
XAPP1052中申请到的物理连续内存大小为4KB。因为DDR内存内部是以块为单位,最小块为4KB,所以在操作系统中比较容易申请到4KB的物理连续内存。

4KB这个大小太小了。以太网数据小包为64B,大包为1512B,假如连续收到3个大包,那么应该怎样利用4KB的内存呢?

一种方式是一片4KB内存只存放2包数据,剩余内存浪费,第二片4KB内存存放第三包数据;另一种方式是将第三包数据拆分,前一半数据存放在第一片内存,后一半数据存放在第二片内存。

第一种方式将浪费976B,内存利用率非常低;而第二种方式对内存管理和数据处理带来了更高的要求,可靠性肯定降低了。

如果能申请到更大的物理连续内存,比如4MB,那么采用第一种方式浪费的字节数就可以接受。有没有办法申请更大的物理连续内存呢?就留给读者自己去查阅资料了。

3.申请内存
操作系统中有内存管理单元,应用程序申请的内存片是逻辑连续,但不一定物理连续。对于上层软件来说由操作系统屏蔽了硬件特性,看不到任何区别;但是DMA使用必须物理连续。随着计算机运行时间增加,操作系统中的内存碎片也会增加,或其他应用程序占用了内存,导致最后连4KB的物理连续内存都很难申请到。

所以建议:
由驱动程序申请内存,不要在应用程序中申请。
开始工作时就申请足够的内存。
该内存必须妥善管理。
该内存只作为中间转存,数据应拷贝到应用程序的内存中再使用。

4.内存管理
XAPP1052中一次DMA操作完成会产生一个中断。下面简单计算一下:当网络数据量较大时,例如达到4MB/s,那么4KB的内存块完全填满需要:
4KB/40MB/s=100us

中断的频率远远高于任务调度的周期(10ms),这将导致驱动程序不停的处理中断,CPU使用率非常高,而DMA性能非常低。

即使使用大内存,例如4MB,但是4路1000M网最大流量为500MB/s也是相同的情况。

我们提出的解决方案如下:

驱动程序申请大量内存片,一开始在内存池1中进行管理。程序开始运行时,将部分内存片指针写入FIFO1中;FPGA从FIFO1中取得内存地址,并开始向该地址写入数据,当该片内存写满后,将该内存地址写入FIFO2,并从FIFO1中取出下一个地址。驱动程序可定期或以FIFO2半满中断等形式,从FIFO2中读回内存指针放入内存池2中。然后将数据可拷贝给应用程序,就可以“释放”这片内存,放入内存池1中。驱动程序检测到FIFO1中使用量较少时立即向FIFO1写入一批内存地址。达到内存循环使用的目的。而驱动程序只需要做内存的调度和管理。FPGA的处理上也没有特殊要求,而且对FPGA中数据缓存的要求也非常低,我们实际应用中只使用了16KB的数据缓存。

假如内存片大小为4MB,两个FIFO深度为32,在500MB/s的数据流量下,使用半满中断处理方式。中断频率为:
16*4MB/500MB/s=128ms

CPU不用频繁处理中断,自然可以将更多的CPU资源用于处理其他任务。而windows任务调度时间约10ms,远小于128ms,完全不用担心因为任务调度延迟导致FIFO溢出而丢包现象。

转载:http://xilinx.eetrend.com/blog/9832

PCIe调试心得_DMA part2的更多相关文章

  1. PCIe调试心得_DMA part3

    作者: East  FPGA那点事儿 上一章讲述了PCIe总线如何提高DMA的效率. 本章以服务器常用的4通道1000M以太网卡为例讲述如何实现多个虚拟DMA通道. 1.多通道DMA发 4通道以太网卡 ...

  2. PCIe调试心得_DMA part1

    作者 :East  FPGA那点事儿 1.PCIe的DMA介绍在PCIe中需要使用DMA的项目,一定要先看XAPP1052,里面包含一个DMA的参考设计,对初学者有极大的帮助. XAPP1052中包含 ...

  3. LPC2478_调试心得(转)

    1.在调试“E:\htwang\smart2200v201\ARM嵌入式系统实验教程(二)\开发板出厂编程程序\液晶显示程序\LCM_Disp”的程序时,想使用外部RAM进行仿真调试,在将ADS1.2 ...

  4. MIPI接口LCD屏调试心得(转)

    源: MIPI接口LCD屏调试心得

  5. VGA调试心得

    以前自己调试过视频信号,无非就时钟加行场同步加数据线,如果视频信号出问题,第一看现象,第二测频率,反正出问题不是消隐信号出问题,就是时钟频率出问题.通过这种方式也调试成功过几个显示屏,然后就以为自己对 ...

  6. js断点调试心得

    虽然网上已经有多的数不清的调试教程了,但仍然没有发现哪篇文章写的通俗易懂,索性自己尝试写写自己的一些使用习惯或者说是心得,希望对那些还不是很懂得使用断点调试的孩子有一些帮助(大神请无视~). 1.断点 ...

  7. PCI-E调试方式

    PCI-E的调试步骤 1.板子插上去之后正常情况下使用lspci 就能看的一个设备 这个设备上存在几个ID,可以根据ID可以确定设备是否识识别到 2.然后就是加载设备的驱动的时候,设备驱动会有VEND ...

  8. React Native调试心得

    在做React Native开发时,少不了的需要对React Native程序进行调试.调试程序是每一位开发者的基本功,高效的调试不仅能提高开发效率,也能降低Bug率.本文将向大家分享React Na ...

  9. Pycharm Debug调试心得

    1.操作步骤: 1-1.添加断点:直接在标记处点击鼠标左键即可.(删除断点只需再点击断点处即可) 1-2.Debug下运行代码 1-3.按照所需调试进行代码调试.Debug的调试方式如下所示: 分别为 ...

随机推荐

  1. 深夜闲聊节目:华为 Mate7的指纹识别安全么?

    许久没有写过不论什么东西,近期非常忙并且还要准备找工作之类的,唉... ....今天的文章也不说技术,仅仅是闲聊. 一.手机指纹识别一揽 打开非常多站点.论坛的科技栏目,充斥着各种手机讯息!仿佛手机已 ...

  2. ArcGIS安装问题集锦

    1. 软件安装 软件下载.安装问题自行解决,否则就不要使用. 2. 常见问题 2.1 许可管理器版本不正确 2013年3月19日 问题一:ArcGIS10安装后,更改许可管理器时,通常,在ArcGIS ...

  3. @QueryParam和@PathParam使用方法比较

    1 先来看@queryparam Path("/users") public class UserService { @GET @Path("/query") ...

  4. android 随手记 读写文件的几种方式

    java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 */ import java.io.BufferedRe ...

  5. Spring AOP深入理解之拦截器调用

    Spring AOP深入理解之拦截器调用 Spring AOP代理对象生成回想 上一篇博客中:深入理解Spring AOP之二代理对象生成介绍了Spring代理对象是怎样生成的,当中重点介绍了JDK动 ...

  6. 优化iOS程序性能的25个方法

    1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自己主动引用计数)和iOS5一起公布.它避免了最常见的也就是常常是因为我们忘记释放内存所造成的内存泄露.它自己 ...

  7. spring启动方式

    spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.看一下ContextLoaderListe ...

  8. 【协议篇】UDP

    UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议.它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! UDP适用于一次只传送少量数据.对可靠性要 ...

  9. MySQL Workbench--Window安装试用

    MySQL Workbench 01.概述 MySQL Workbench provides DBAs and developers an integrated tools environment f ...

  10. 自研DCI网络路由交换协议DCIP-白牌交换机时代的企业网络

    一转眼从听华为3Com的路由交换课程到如今已经13年有余了,依稀记得第一节课的时候我带着老婆去听的课(老婆是日语系的.那时还是女朋友,并不懂网络,仅仅是跟着我去上课的).抢了个头排,讲师宋岩老师提问了 ...