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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM