)
AXI DMA编译和使用ZYNQ4EV petalinux实验过程PL添加AXIDMA IP导出硬件平台编译BOOT和内核编译AXI DMA驱动由于内核版本不一样需要对源码进行几处修改。加载5. 测试源码编译内核指定petalinux的编译的文件夹就行比如petalinux/build/tmp/work/zynqmp_generic_xczu4ev-xilinx-linux/linux-xlnx/6.1.5-xilinx-v2023.1git999-r0/linux-xlnx-6.1.5-xilinx-v2023.1git999/。问题记录编译DMA报错ERROR: modpost: module xilinx-axidma uses symbol dma_buf_attach from namespace DMA_BUF, but does notimportit.|ERROR: modpost: module xilinx-axidma uses symbol dma_buf_map_attachment from namespace DMA_BUF, but does notimportit.|ERROR: modpost: module xilinx-axidma uses symbol dma_buf_unmap_attachment from namespace DMA_BUF, but does notimportit.|ERROR: modpost: module xilinx-axidma uses symbol dma_buf_get from namespace DMA_BUF, but does notimportit.|ERROR: modpost: module xilinx-axidma uses symbol dma_buf_put from namespace DMA_BUF, but does notimportit.|ERROR: modpost: module xilinx-axidma uses symbol dma_buf_detach from namespace DMA_BUF, but does notimportit.解决模块添加MODULE_IMPORT_NS(DMA_BUF);参考符号命名空间传输长度一致内容不一致未解决axidma_malloc出来的空间操作慢传输数据快处理速度慢和直接buffer拷贝差了10倍。原测试程序每次传输增加校验。速率差异分析结合《计算机组成原理-存储系统》DMA传输地址用于DMA传输的地址要求是连续的而且为保证FPGA和CPU之间的内存一致性通常是“非缓存Non-cacheable”或“直写Write-Through”属性。中间不使用Cache层。Linux 用 dma_alloc_coherent 进行申请将该物理地址提交给DMA进行数据搬运。写入处理器一般有写缓冲区数据发送到AXI总线即可阻塞较少。读取读取时CPU必须阻塞等待数据从DDR内存到CPU寄存器延迟比较高。所以DMA地址写入速度会比读取速度快。和普通内存对比带Cache写入时直接写入Cache。读取时也是优先访问Cache。访问内存的时间比访问Cache的时间长的多。普通内存相比DMA内存的访问更快主要是Cache提高了访问速度局部性原理。总结未测试当前驱动使用的是dma_alloc_coherent 分配的非缓存内存CPU访问比较耗时。驱动适用于CPU不需要处理DMA数据的场景。如果需要CPU处理数据改用流式 DMA 映射用支持Cache映射的内存来传输数据。dma_map_single/dma_unmap_single。