• PCIe调试心得_DMA part1


    作者 :East  FPGA那点事儿

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

    XAPP1052中包含FPGA源代码和驱动程序源代码,其中FPGA源代码最主要的文件为:
    1、《TX_ENGINE.v》:是产生TLP包的逻辑,包含读TLP请求用于DMA读;写TLP请求用于DMA写;CPLD用于BAR空间读。
    2、《RX_ENGINE.v》:是解析TLP包的逻辑,包含读TLP解析用于BAR空间读、写TLP解析用于BAR空间写、CPLD解析用于DMA读。

    DMA分为读和写种操作,两种操作在细节上不同。

    这里先简单介绍一下DMA读过程:
    1、驱动程序向操作系统申请一片物理连续的内存;
    2、主机向该地址写入数据;
    3、主机将这个内存的物理地址告诉FPGA;
    4、FPGA向主机发起读TLP请求—连续发出多个读请求;
    5、主机向FPGA返回CPLD包—连续返回多个CPLD;
    6、FPGA取出CPLD包中的有效数据;
    7、FPGA发送完数据后通过中断等形式通知主机DMA完成;

    DMA写过程如下:
    1、驱动程序向操作系统申请一片物理连续的内存;
    2、主机将这个内存的物理地址告诉FPGA;
    3、FPGA向主机发起写TLP请求,并将数据放入TLP包中—连续发出多个写请求;
    4、FPGA发送完数据后通过中断等形式通知主机DMA完成;
    5、主机从内存中获取数据;

    如果是参考XAPP1052,一定要注意几点:

    1.1连续内存
    申请的内存一定要物理连续。DMA是直接对物理内存—也就是实际的内存条进行读写操作,必须为物理连续的内存;而应用程序和驱动程序一般只能申请到逻辑上连续的内存,在物理上不一定连续。XAPP1052中可以看到申请内存上的一些特殊处理,目的就是获取物理连续的内存,可获取4KB的物理连续内存。但是XAPP1052在内存处理上也存在一些问题,实验尚可,应用则不行。如何获取内存的物理地址在XAPP1052中已经有示范,可直接参考。

    1.2将地址告诉FPGA
    XAPP1052是在BAR空间开辟了一段专用地址存放DMA读地址、DMA写地址、DMA长度、TLP包大小等参数,可直接参考。

    1.3写TLP请求
    DMA写的操作相对简单,只需要FPGA单向发起写TLP操作即可完成,至于有没有真正写入内存一般不需要FPGA关心;而驱动程序需要等待一定时间让数据正真写入内存—中断处理的时间已经足够让数据写入内存,所以也不必特别关心。

    发起写TLP请求可以连续发送,但是注意《TX_ENGINE.v》中要处理读TLP请求、写TLP请求和CPLD,所以有时会遇到三种请求竞争的情况。如果想要提高DMA的效率可以重新设定三种请求的优先级。

    1.4读TLP请求
    DMA读的操作相对复杂,需要FPGA向主机发出读请求,主机再返回数据。FPGA控制逻辑必须计算发起了多少个读TLP请求,再计算收到的数据是否足够。

    一般来说FPGA可以一次发送所有的读请求,然后按照顺序接收数据即可。但是某些主板并不一定是按照请求的顺序返回数据的情况,可能后发出的请求先返回数据,属于主机乱序执行的现象。要么FPGA一次只发一个读请求,等数据收到了再发现一个读请求—但是效率就对不起了;要么对乱序情况进行特殊处理,XAPP1052还没有解决该问题。

    1.5特殊参数
    TLP包中有很多参数,例如:TC、ATTR等等,如果不了解的话,千万不要随意修改,与参考设计保持一致即可,否则很容易导致蓝屏。

    1.6 DMA通道
    XAPP1052中只实现了一个DMA读通道和一个DMA写通道。对于很多应用,例如两路视频采集,需要两路DMA写通道:要么把两路数据按照一定的格式整合为一个流;要么实现两路DMA写通道,XAPP1052不能直接实现。

    1.7数据流量
    XAPP1052整个方案的效率并不高,数据流量非常有限。数据量较少时倒是够用,数据量大了会发现CPU使用率非常高,占用一个CPU核心,但是还会丢数据。主要原因是XAPP1052一次DMA的总长度为4KB,每一次DMA完成必须以中断形式通知驱动程序,驱动程序再配置下一次DMA。从FPGA角度来说,已经做到“尽力”了,但是数据量一大CPU不停的进入中断,时间全部浪费在处理中断上了,而且CPU使用率非常高。

    以上问题怎样解决下回分解!

    转载自:http://xilinx.eetrend.com/blog/9829

  • 相关阅读:
    ontentEditable和designMode的区别
    execCommand、queryCommandState
    ios微信h5音频audio无法自动播放
    微信二次分享图片不显示
    Airbnb javascript编码规范
    array reduce
    适配iPhoneX全屏
    web前端性能优化
    requestAnimationFrame实现动画
    js 中的forEach,for in ,for of 的使用
  • 原文地址:https://www.cnblogs.com/chengqi521/p/7095402.html
Copyright © 2020-2023  润新知