ZYNQ dma数据传输问题记录

2 篇文章 0 订阅
1 篇文章 0 订阅

以前使用ZYNQ都只是对PL端编程,近期项目上做嵌入式的同事有事没法做,只能自己简单编写一点SDK程序,本次项目使用了DMA将PL端数据读到PS端DDR3上,再由UDP或者TCP发送到上位机上,但是在实际调试中发现,DMA启动数据时,数据量太大DMA无法接到LAST信号,在PL逻辑边加上ILA观察,发现在字节达到要求时是产生了一个周期的LAST高电平信号,但是在blockdesign加的AXI_DMA测加的ILA缺无法看到LAST信号。(工作在同一时钟域)(拉长PL端LAST信号也不行)
后来发现是SDK端配置出了问题,本次使用的是正点原子的AXI DMA 环路测试使用例程没有问题,但是例程中是先写一定数量字节到DDR数据,再读取出写到外部用FIFO缓存,再从FIFO中读取到DDR上,本次实验是字节书任意可设,这样就会出问题。

主要修改程序如下:

	#define MAX_PKT_LEN            	600000    //发送包长度
...
...
	   	status = XAxiDma_SimpleTransfer(&axidma, (UINTPTR) rx_buffer_ptr,
	  	MAX_PKT_LEN, XAXIDMA_DEVICE_TO_DMA);
	   	if (status != XST_SUCCESS) {
	       	return XST_FAILURE;
	  	}
	        //Xil_DCacheFlushRange 为给定的地址范围刷新数据缓存
	   	Xil_DCacheFlushRange((UINTPTR) rx_buffer_ptr, MAX_PKT_LEN);   //刷新Data Cache

MAX_PKT_LEN 表示启动DMA传输字节数,XAxiDma_SimpleTransfer是将设备中传输到DMA控制器上,传输字节数为MAX_PKT_LEN,例程写死为0X100;
在这里插入图片描述
本次DMA控制器stream接口为32bit,即4字节,而600字节,也就传输150次,所以想要传输足够多的字节,则需要将此值设置足够大的值。
当然这只是简单实用遇到的问题,以后做更复杂的应用再记录。。。。

将DDR数据读出,输出,发现数组较大就会进入异常。。。。。。。
解决方法:
转发:
————————————————
栈区(stack),堆区(heap),数据区(data seg)和代码区。

栈区:由操作系统自动分配释放,存放函数的参数值,局部变量的值;当不需要时系统会自动清除。
堆区:由new分配的内存块,不由编译器管,由应用程序控制(相当于程序员控制)。如果程序员没有释放掉,程序结束后,操作系统会自动回收。
数据区:也称全局区或者静态区,存放全局的东西类似全局变量。
代码区:存放执行代码的地方,类似if else,while,for这种语句。
在main函数里面的数组是开在栈区(stack),在函数外面的是开在数据区的。栈区的内存比较小,所以当数组非常大的时候,就会报错。假如把数组放在数据区就不会出现这个问题,因为数据区的内存很大。

也就是说,在main函数外面开一个数组,他的内存分配在数据区里;如果在main函数内部开数组,内存分配在栈区内。一般来说栈区的内存是比较小的,所以平常开一些小一点的数组是没问题的;但如果题目要求的数组比较大,那就会出现爆出的问题,程序无法访问内存就会出错;相对的,数据区的内存较大,所以开数组开在数据区/main函数外面,就不易出现这样的问题。
————————————————
原文链接:https://blog.csdn.net/m0_46153949/article/details/114263516

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值