PCIE的DMA和PIO介绍
百家號01-2422:14
在PCIE中有兩種數(shù)據(jù)傳輸方式:
DMA(Direct Memory Access),直接內(nèi)存訪問,在該模式下,數(shù)據(jù)傳送不是由CPU負(fù)責(zé)處理,而是由一個(gè)特殊的處理器DMA控制器來完成,因此占用極少的CPU資源。
PIO(Programmed Input-Output),可編程輸入輸出,在該模式下,數(shù)據(jù)傳送由CPU執(zhí)行I/O端口指令來按照字節(jié)或更大的數(shù)據(jù)單位來處理,占用大量的CPU資源,數(shù)據(jù)傳輸速度也大大低于DMA模式。舉例老說,在DMA方式下,如果copy文件的同時(shí)在播放mp3音樂,則不受絲毫影響;如果在PIO模式下,則會發(fā)現(xiàn)音樂聲時(shí)斷時(shí)續(xù),這是因?yàn)榇蟛糠諧PU資源被文件傳輸占用。
所以,總的來說,使用DMA模式時(shí),計(jì)算機(jī)的運(yùn)行速度會比使用PIO模式快很多。
在xilinx中生成IP核后,工程文件夾下會有這兩個(gè)文件夾:
[Xilinx_PCIe_BMD] xilinx FPGA 開發(fā) pcie BMD DMA的verilog HDL源碼[example_design] xilinx pcie總線 pio模式下的控制器代碼。包含接收發(fā)送模塊,存儲模塊,控制模塊等。
下面主要介紹PCIe的DMA數(shù)據(jù)傳輸:
在PCIe中需要使用DMA的項(xiàng)目,一定要先看XAPP1052,里面包含一個(gè)DMA的參考設(shè)計(jì),對初學(xué)者有極大的幫助。
XAPP1052中包含F(xiàn)PGA源代碼和驅(qū)動程序源代碼,其中FPGA源代碼最主要的文件為:1、《TX_ENGINE.v》:是產(chǎn)生TLP包的邏輯,包含讀TLP請求用于DMA讀;寫TLP請求用于DMA寫;CPLD用于BAR空間讀。2、《RX_ENGINE.v》:是解析TLP包的邏輯,包含讀TLP解析用于BAR空間讀、寫TLP解析用于BAR空間寫、CPLD解析用于DMA讀。
DMA分為讀和寫種操作,兩種操作在細(xì)節(jié)上不同。
這里先簡單介紹一下DMA讀過程:1、驅(qū)動程序向操作系統(tǒng)申請一片物理連續(xù)的內(nèi)存;2、主機(jī)向該地址寫入數(shù)據(jù);3、主機(jī)將這個(gè)內(nèi)存的物理地址告訴FPGA;4、FPGA向主機(jī)發(fā)起讀TLP請求—連續(xù)發(fā)出多個(gè)讀請求;5、主機(jī)向FPGA返回CPLD包—連續(xù)返回多個(gè)CPLD;6、FPGA取出CPLD包中的有效數(shù)據(jù);7、FPGA發(fā)送完數(shù)據(jù)后通過中斷等形式通知主機(jī)DMA完成;
DMA寫過程如下:1、驅(qū)動程序向操作系統(tǒng)申請一片物理連續(xù)的內(nèi)存;2、主機(jī)將這個(gè)內(nèi)存的物理地址告訴FPGA;3、FPGA向主機(jī)發(fā)起寫TLP請求,并將數(shù)據(jù)放入TLP包中—連續(xù)發(fā)出多個(gè)寫請求;4、FPGA發(fā)送完數(shù)據(jù)后通過中斷等形式通知主機(jī)DMA完成;5、主機(jī)從內(nèi)存中獲取數(shù)據(jù);
如果是參考XAPP1052,一定要注意幾點(diǎn):
1.1連續(xù)內(nèi)存申請的內(nèi)存一定要物理連續(xù)。DMA是直接對物理內(nèi)存—也就是實(shí)際的內(nèi)存條進(jìn)行讀寫操作,必須為物理連續(xù)的內(nèi)存;而應(yīng)用程序和驅(qū)動程序一般只能申請到邏輯上連續(xù)的內(nèi)存,在物理上不一定連續(xù)。XAPP1052中可以看到申請內(nèi)存上的一些特殊處理,目的就是獲取物理連續(xù)的內(nèi)存,可獲取4KB的物理連續(xù)內(nèi)存。但是XAPP1052在內(nèi)存處理上也存在一些問題,實(shí)驗(yàn)尚可,應(yīng)用則不行。如何獲取內(nèi)存的物理地址在XAPP1052中已經(jīng)有示范,可直接參考。
1.2將地址告訴FPGAXAPP1052是在BAR空間開辟了一段專用地址存放DMA讀地址、DMA寫地址、DMA長度、TLP包大小等參數(shù),可直接參考。
1.3寫TLP請求DMA寫的操作相對簡單,只需要FPGA單向發(fā)起寫TLP操作即可完成,至于有沒有真正寫入內(nèi)存一般不需要FPGA關(guān)心;而驅(qū)動程序需要等待一定時(shí)間讓數(shù)據(jù)正真寫入內(nèi)存—中斷處理的時(shí)間已經(jīng)足夠讓數(shù)據(jù)寫入內(nèi)存,所以也不必特別關(guān)心。
發(fā)起寫TLP請求可以連續(xù)發(fā)送,但是注意《TX_ENGINE.v》中要處理讀TLP請求、寫TLP請求和CPLD,所以有時(shí)會遇到三種請求競爭的情況。如果想要提高DMA的效率可以重新設(shè)定三種請求的優(yōu)先級。
1.4讀TLP請求DMA讀的操作相對復(fù)雜,需要FPGA向主機(jī)發(fā)出讀請求,主機(jī)再返回?cái)?shù)據(jù)。FPGA控制邏輯必須計(jì)算發(fā)起了多少個(gè)讀TLP請求,再計(jì)算收到的數(shù)據(jù)是否足夠。
一般來說FPGA可以一次發(fā)送所有的讀請求,然后按照順序接收數(shù)據(jù)即可。但是某些主板并不一定是按照請求的順序返回?cái)?shù)據(jù)的情況,可能后發(fā)出的請求先返回?cái)?shù)據(jù),屬于主機(jī)亂序執(zhí)行的現(xiàn)象。要么FPGA一次只發(fā)一個(gè)讀請求,等數(shù)據(jù)收到了再發(fā)現(xiàn)一個(gè)讀請求—但是效率就對不起了;要么對亂序情況進(jìn)行特殊處理,XAPP1052還沒有解決該問題。
1.5特殊參數(shù)TLP包中有很多參數(shù),例如:TC、ATTR等等,如果不了解的話,千萬不要隨意修改,與參考設(shè)計(jì)保持一致即可,否則很容易導(dǎo)致藍(lán)屏。
1.6 DMA通道XAPP1052中只實(shí)現(xiàn)了一個(gè)DMA讀通道和一個(gè)DMA寫通道。對于很多應(yīng)用,例如兩路視頻采集,需要兩路DMA寫通道:要么把兩路數(shù)據(jù)按照一定的格式整合為一個(gè)流;要么實(shí)現(xiàn)兩路DMA寫通道,XAPP1052不能直接實(shí)現(xiàn)。
1.7數(shù)據(jù)流量XAPP1052整個(gè)方案的效率并不高,數(shù)據(jù)流量非常有限。數(shù)據(jù)量較少時(shí)倒是夠用,數(shù)據(jù)量大了會發(fā)現(xiàn)CPU使用率非常高,占用一個(gè)CPU核心,但是還會丟數(shù)據(jù)。主要原因是XAPP1052一次DMA的總長度為4KB,每一次DMA完成必須以中斷形式通知驅(qū)動程序,驅(qū)動程序再配置下一次DMA。從FPGA角度來說,已經(jīng)做到“盡力”了,但是數(shù)據(jù)量一大CPU不停的進(jìn)入中斷,時(shí)間全部浪費(fèi)在處理中斷上了,而且CPU使用率非常高。
轉(zhuǎn)載:https://baijiahao.baidu.com/s?id=1590483430637574612&wfr=spider&for=pc
總結(jié)
以上是生活随笔為你收集整理的PCIE的DMA和PIO介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。