PCIe链式DMA传输原理详解

本文介绍链式DMA技术如何解决连续内存申请难题,提高数据传输效率。通过创建描述符链表,实现多块离散内存的一次性高效传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.为什么需要链式DMA

2.链式DMA传输原理详解


1.为什么需要链式DMA

XAPP1052我们学过每一次DMA请求开始后,只能传输PC 1个连续的物理内存块,如果要传输下一个内存块,则必须重新初始化内存并配置好DMA寄存器,再次启动DMA才可以完成。我们知道驱动申请一块连续的物理内存是否成功取决于系统内存大小,应用进程的多少等等因素,所以XAPP1052一次DMA的传输的最大值是不确定的。我在测试时,主机为2GB内存、开的应用也不多的情况下申请连续的4MB内存会时常失败。

我们假设我们外部视频的带宽为800MB/s,我们现在需要采集外部视频,并且确保视频不会丢失,如果使用XAPP1052,每次DMA传输2MByte,则每秒至少需要400次DMA请求才能确保视频被安全的传输到主机PC,这对于主机来说太难做到了。

链式的DMA传输可以解决上述问题,我们通过多个描述符把要传输的离散的物理内存块进行一个一个的描述并形成描述符表,我们把第1个描述符的地址装载到XDMA的描述符基址寄存器(后面详解)里面,然后开启DMA请求,XDMA一次便可以完成n个内存块的传输,大大提高了传输效率,具体细节如下。

2.链式DMA传输原理详解

(1)PC通过专门的函数申请多个连续的内存块并初始化为我们要传输的数据(假设为100块);

(2)PC创建100个描述符(描述符组成详细内容下节讲解),并且把100个内存块的地址分别给对应的描述符,并且把100个描述符进行链接形成描述符链表;

(3)PC把描述符表的第1个描述符的地址给XDMA描述符基址寄存器;

(4)PC开启DMA请求;

(5)XDMA根据描述符基地址寄存器的值先获得第1个描述符;

(6)根据描述符内容执行DMA传输,这里是把内存块1搬运到FPGA;

(7)内存块1搬运完毕后,检查第1个描述符后面还有没有描述符(根据描述符对应字段),如果有则继续获取第2个描述符;

(8)根据描述符内容执行DMA传输,这里是把内存块2搬运到FPGA;

(9)一直执行到内存块100搬运完毕,检查第100个描述符后面还有没有描述符,没有了,则请求DMA完成中断,一次DMA请求操作执行完毕。


 1.本文部分素材来源网络,版权归原作者所有,如涉及作品版权问题,请与我联系删除;

2.未经原作者允许不得转载本文内容,否则将视为侵权;

3.转载或者引用本文内容请注明来源及原作者;

4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个早起的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值