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.发送调试:
- CPU有待发送的数据,首先请求描述符,再分配描述符中的buf,启动DMA。接收到中断,则会把数据发送出去。
- 关于内存分配:是有CPU分配,由于不知道发送的数据什么时候被使用完毕,在调试的过程中并没有对描述符中的buf进行释放。
- 发送时的内存释放有谁来管理?
4.2.接收调试 - AXI_DMA申请了固定个数的描述符,根据以太网报文最大长度,对每个描述符申请了固定长度的buf。
- AXI_DMA设置为了循环模式,描述符可循环使用
- 存在的问题是,应用层何时使用完了数据,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:中断合并丢包,暂时没解决
待优化的部分:
中断合并
一个中断对应两个包