ZYNQ7000 pg021_axi_dma工作原理和编程步骤

1.ZYNQ7000 pg021_axi_dma工作原理:

DMA通过请求描述符BD进行数据传输,描述定义如下:
在这里插入图片描述
所有的描述符空间是一个循环链表,根据数据的传输方向不同,分为S2MM和MM2S两个链表,存储结构如下:
在这里插入图片描述

2.寄存器空间:

在这里插入图片描述

3.AXI_DMA的配置流程:

1.准备好描述符空间
2. 写当前描述法寄存器
3.开启DMA运行能开关
4. 开启中断使能开关
5.写尾部描述符寄存器,此步骤可触发DMA开始从内存中取描述符
6. 读或者写描述符中的buf,实现数据的传输

4.AXI_DMA调试结果:

4.1.发送调试:

  1. CPU有待发送的数据,首先请求描述符,再分配描述符中的buf,启动DMA。接收到中断,则会把数据发送出去。
  2. 关于内存分配:是有CPU分配,由于不知道发送的数据什么时候被使用完毕,在调试的过程中并没有对描述符中的buf进行释放。
  3. 发送时的内存释放有谁来管理?
    4.2.接收调试
  4. AXI_DMA申请了固定个数的描述符,根据以太网报文最大长度,对每个描述符申请了固定长度的buf。
  5. AXI_DMA设置为了循环模式,描述符可循环使用
  6. 存在的问题是,应用层何时使用完了数据,AXI_DMA并不知道,还是以接收的数据速率申请描述符。这样就有可能出现应用层数据还没使用完毕,下次来的数据将上一次的覆盖了
    4.根据调试过程中出现的问题,有没有好的解决方案

5.调试过程中的问题及解决方法:

Q1.接收数据时, axidma状态寄存器要设置为打开,而不是有数据来了再打开使能开关.
原因:再axidma接收使能没有打开时,即使有数据进来,DMAipcore也不会向axidma请求描述符进行数据接收.
Q2. S2MM尾部描述符要写两次,axidma才能启动接收.至于原因不得而知,是偶然的在串口中操作写了两次尾部描述符,发现可以进行数据传输的.文档中并没有相应的介绍
Q3. S2MM ,不管有没有需要接收的数据,DMAipcore一直循环请求描述符
此问题的解决方法是在论坛中找到的,写尾部描述的值不能是描述符空间的tail descriptor,而是要写一个比描述符空间中所有描述地址都要大的一个地址
Q4.缓存不一致性问题
这个问题在zynq7020trm中有相关的说明,存在这样一个问题,但并没有给出解决方法

vxworks下的解决方案:
方案1 :
在这里插入图片描述
方案2:
分配空间使用安全函数cacheDmaMalloc

Q5:当前描述符寄存器超前实际操作的描述2个,暂时规避

Q6:中断合并丢包,暂时没解决
待优化的部分:
中断合并
一个中断对应两个包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值