上一章讲述了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拆分_PCIe调试心得_DMA part2相关推荐

  1. AT91RM9200+pcf8563在linux2.6.20下的调试心得

    这两天调试了AT91RM9200+pcf8563在linux2.6.20下的驱动,记录一下我的调试过程以及调试心得,呵呵      在linux2.6.20/drivers/rtc目录下面已经有了pc ...

  2. 浅谈四轴PID调试心得

    以下内容转自阿莫论坛,写得很详细,是调试大四轴的.小四轴调试也可参照着调. PID调试心得 本人不是自动化出身,也没有受过专业训练,都是自己摸索,在这里浅述一下自己的PID参数整定心得.所言之物皆由实 ...

  3. 调试心得plc做主站(客户端)

    ##调试心得plc做主站(客户端) 调试软件,西门子博图15,PLC采用1200,协议抓包采用Wireshark抓包工具 发协议工具采用网络助手,绿色是PLC给我发的请求数据,蓝色我发的报文格式, 1 ...

  4. Ti ub954/953 Sensor调试心得

    Ti ub954/953 Sensor调试心得 前言 TI以及美信的串行器以及接串器是目前车载领域用的比较多的厂家,目前最近一直再用TI的954以及953进行双目sensor的调试,下面就简单记录下调 ...

  5. 阻容压降电路调试心得

    阻容压降电路调试心得 阻容压降电通常用于LED灯电源,智能电表等对成本要求较高的产品中.先说一下LED电源,L线进来后,串联0.39微法油铁电容,后面是全桥整流,然后是滤波,电容容量越大,电路输出的电 ...

  6. 记spi nor flash的调试心得

    flash 调试心得 前言 调试目的 调试步骤 检查 驱动 flash操作 改写 复位 访问模式 tips 内核下相关 文件系统 nor和nand的区别 前言 在工作中或者在开发板上或多或少都会遇到n ...

  7. NXP新出的Cortex-M7核单片机imx.rt1050调试心得

    感谢琳的出现,陪我度过开心的每一天.开心的日子总是过得很快,离上次写博客已经快两个月了.历经一年半的阴云密布,终于迎来了久违的万丈阳光,希望未来的岁月带来的是更多美好甜蜜,开心认真过好每一天. 乘着周 ...

  8. Linuxcnc-Ighethercat 调试心得

    Linuxcnc-Ighethercat调试心得 一.前言 如果想通过linuxcnc和ighethercat来实现对伺服电机的控制.那就要搞明白你需要经过哪几个步骤才能实现伺服控制. ① Linux ...

  9. JLINK在ADS中的调试心得

    JLINK在ADS中的调试心得 分类: ARM2010-01-03 19:39 138人阅读 评论(0) 收藏 举报 [分享]JLINK在ADS下调试心得 前两天一个客户用jlink在ADS来调试LP ...

最新文章

  1. 07/11/08 资料整理
  2. 第四范式亮相中关村论坛 共话科技创新与技术发展
  3. Hive启动报错org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeE...
  4. 中国游戏大数据:市场规模全球第一,直播已进入黄金期
  5. php 将表情存入数据库,php + mysql 存入表情 【如何轉義emoji表情,讓它可以存入utf8的數據庫】...
  6. java RMI 笔记
  7. matlab2c使用c++实现matlab函数系列教程-cumprod函数
  8. 2021,前方路艰,与君共勉
  9. 《MySQL必知必会》学习笔记——第七章(数据过滤)
  10. sql 时间日期格式转换
  11. 计算机中缺失freeimage.dll,修复freeimage.dll
  12. 网页配色网页设计常用色彩搭配表 《配色表》
  13. 根据输入的姓氏,随机获取对应的男生和女生姓名
  14. oracle百分比转数字_子分公司一把手谈企业数字化转型——新疆能源
  15. CGCS2000国家大地坐标系参数
  16. 如何开启系统打印机服务器,windows7系统如何开启打印机服务
  17. MyBatis之Base64加密数据源
  18. Android-通讯卫士
  19. usb禁止重定向_谈USB重定向的方式
  20. R数据分析:结合APA格式作图大法讲讲ggplot2和ggsci,请收藏

热门文章

  1. 2019美研计算机录取,2019美研录取更新 | 哥伦比亚大学、芝加哥大学OFFER携手来袭...
  2. 杰里之用于做对讲机【篇】
  3. django一:windows及linux下安装django
  4. 由于不可抗力,这是我今年最后一篇博文了
  5. 增量式PID到底是什么?
  6. 电路设计常用软件介绍
  7. MindManager中文版免费下载使用序列号V20.0.334
  8. 最中二的性能测试工具--vegeta
  9. 学生党怎么选购蓝牙耳机不容易踩雷?老司机热心分享选购技巧
  10. 拓商:如何解决客户流失率高的问题