赞
踩
目录
XAPP1052我们学过每一次DMA请求开始后,只能传输PC 1个连续的物理内存块,如果要传输下一个内存块,则必须重新初始化内存并配置好DMA寄存器,再次启动DMA才可以完成。我们知道驱动申请一块连续的物理内存是否成功取决于系统内存大小,应用进程的多少等等因素,所以XAPP1052一次DMA的传输的最大值是不确定的。我在测试时,主机为2GB内存、开的应用也不多的情况下申请连续的4MB内存会时常失败。
我们假设我们外部视频的带宽为800MB/s,我们现在需要采集外部视频,并且确保视频不会丢失,如果使用XAPP1052,每次DMA传输2MByte,则每秒至少需要400次DMA请求才能确保视频被安全的传输到主机PC,这对于主机来说太难做到了。
链式的DMA传输可以解决上述问题,我们通过多个描述符把要传输的离散的物理内存块进行一个一个的描述并形成描述符表,我们把第1个描述符的地址装载到XDMA的描述符基址寄存器(后面详解)里面,然后开启DMA请求,XDMA一次便可以完成n个内存块的传输,大大提高了传输效率,具体细节如下。
(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.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。
下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。