0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DMA控制器介绍及示例演示详解

OpenFPGA 来源:OpenFPGA 作者:碎碎思 2022-05-17 09:47 次阅读

ZYNQ从放弃到入门(九)-PS和PL交互-DMA

我们上一节谈到使用 DMA(直接内存访问)的好处已经变得显而易见。到了这一步,我们留下了人类长期以来一直在思考的问题:DMA到底是什么?

DMA介绍

在最基本的层面上,一旦处理器设置了传输,DMA 将数据传入或传出内存而无需CPU干预。DMA 可以显着提高系统性能,具体取决于所采用的方法。在我们更详细地了解 Zynq DMA 之前,我想先解释一些 DMA 控制器的通用原理。通常 DMA 控制器以以下三种模式之一运行:

  • Burst Mode突发模式 - 在一次连续操作中传输整个数据块。在许多应用中,突发模式传输时拒绝总线访问处理器。这种模式好与坏还是取决于系统。
  • Cycle Stealing – 为了克服上诉的不足,DMA支持Cycle Stealing将单个 DMA 字节或字传输与处理器访问系统总线交错运行。
  • 透明模式——最有效的模式。仅当处理器执行不需要访问系统总线的任务时才传输数据。

DMA 控制器的一项非常有用的功能是支持分散/收集(scatter/gather)操作的能力。此功能允许将多个数据源传输到单个目标地址或允许单个源地址提供多个输出目标(也称为“缓冲区”)。Zynq SoC 的基于 ARM 的处理系统 (PS) 有一个 DMA 控制器 (DMAC),它连接到 Zynq 的 AXI4 互连并使用 AXI 总线执行传输。DMAC 在系统存储器和 Zynq 的可编程逻辑 (PL) 之间采用 64 位 AXI 传输。如下所示,Zynq DMAC 有 8 个通道,允许 DMAC 同时执行 8 个 DMA 线程,并通过 AXI 互连实现流控制。

d4b74410-d579-11ec-bce3-dac502259ad0.png

虽然 Zynq DMAC 允许在系统存储器和 PL(包括 PL 中的 Zynq 外设)之间进行双向传输,但它不支持 Zynq PS 中的外设的 DMA,因为这些外设没有流控制信号来支持 DMA 操作。然而,Zynq SoC 中的一些 IO 外设具有自己的 DMA 控制器,以支持进出 IOP 和系统内存的高数据速率传输。这些外围设备是:

  • GigE Controller 千兆以太网控制器
  • SDIO Controller SDIO 控制器
  • USB Controller USB控制器
  • Device Configuration Controller 设备配置控制器

如果设备使用 ARM TrustZone,Zynq SoC 还支持安全寄存器访问。Xilinx 同时也提供了一个简单的驱动程序文件 (xdmaps.h),我们可以在独立 BSP 中使用它来配置和启动 DMA 传输。在下一节中,我们将了解如何使用此文件创建简单的 DMA 传输。

示例演示

本节创建一个非常简单的示例来演示如何设置和使用 DMA。

为了演示这示例,将使用一个 DMA 控制器通道将一个内存位置传输到另一个内存位置。

首先需要在BSP中包含一部分Vivado中生成的头文件。这些头文件提供了我们可以用来驱动 DMA 的宏和函数。对于这个例子,我们需要包括:

#include"xscugic.h"
#include"xdmaps.h"
#include"xil_exception.h"

Xscugic.h 和 xil_exceptions.h 允许使用中断控制器,而 xdmaps.h 允许配置并使用DMA。

使用 xparamters.h 提供的参数,我们可以定义 DMA 和中断控制器的设备标识、将使用的中断以及我们将传输的数据长度:

#defineDMA_DEVICE_IDXPAR_XDMAPS_1_DEVICE_ID
#defineINTC_DEVICE_IDXPAR_SCUGIC_SINGLE_DEVICE_ID
#defineDMA_FAULT_INTRXPAR_XDMAPS_0_FAULT_INTR
#defineDMA_DONE_INTR_0XPAR_XDMAPS_0_DONE_INTR_0
#defineDMA_LENGTH1024

开发的下一阶段是编写三个函数来配置DMA,配置中断控制器,并在DMA传输完成时充当中断服务程序。

在 DMA 配置函数中,我们首先使用 xdmaps.h 提供的命令结构创建一个 DMA 命令。DMA 命令由通道控制、块描述符、用户定义的程序、指向生成的程序的指针和传输结果组成。由于这是一个简单的示例,我们不需要所有这些组件,但是我们将配置 DMA 控制器,如下所示:

DmaCmd.ChanCtrl.SrcBurstSize=4;
DmaCmd.ChanCtrl.SrcBurstLen=4;
DmaCmd.ChanCtrl.SrcInc=1;
DmaCmd.ChanCtrl.DstBurstSize=4;
DmaCmd.ChanCtrl.DstBurstLen=4;
DmaCmd.ChanCtrl.DstInc=1;
DmaCmd.BD.SrcAddr=(u32)Src;
DmaCmd.BD.DstAddr=(u32)Dst;
DmaCmd.BD.Length=DMA_LENGTH*sizeof(int);

下一步设置运行中断函数以将 DMA 中断连接到中断控制器之前初始化和配置 DMA 控制器:

DmaCfg=XDmaPs_LookupConfig(DeviceId);
XDmaPs_CfgInitialize(DmaInst,DmaCfg,DmaCfg->BaseAddress);
SetupInterrupt(&GicInstance,DmaInst);

在此之后,在我们连接完成处理程序并开始传输之前,源内存位置被设置并清除目标位置,为了跟踪进度,我们还调用了 DMA 进度函数:

DmaCfg=XDmaPs_LookupConfig(DeviceId);
XDmaPs_CfgInitialize(DmaInst,DmaCfg,DmaCfg->BaseAddress);
SetupInterrupt(&GicInstance,DmaInst);
XDmaPs_Print_DmaProg(&DmaCmd);

当附加的源代码文件在ZYNQ上运行时,以下结果显示串口输出上。

d4e8b0cc-d579-11ec-bce3-dac502259ad0.png

源码:

https://gitee.com/openfpga/zynq-chronicles/blob/master/part_29.c

原文标题:ZYNQ从放弃到入门(九)-DMA

文章出处:【微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15223

    浏览量

    171175
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99018
  • Zynq
    +关注

    关注

    9

    文章

    600

    浏览量

    46620

原文标题:ZYNQ从放弃到入门(九)-DMA

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CapSense®控制器的代码示例设计指南

    本文档提供了详细的介绍的10个CapSense的代码示例的意图,以帮助客户体验和评估赛普拉斯的CapSense控制器,CapSense的工具包,以及CapSense用户模块的功能。该文件还介绍
    发表于 11-20 16:37

    DMA控制器介绍

    本帖最后由 yyeee312 于 2015-11-12 15:17 编辑 DMA控制器是一种在系统内部转移数据的独特外设,可以将其视为一种能够通过一组专用总线将内部和外部存储与每个具有
    发表于 11-04 22:50

    基于微控制器的功率控制器示例

    使用MIC5013 MOSFET预驱动设计和构建的基于微控制器的功率控制器示例
    发表于 05-22 09:06

    浅析DMA控制器与FSMC控制器

    直接存储存取DMACPU太忙了,那DMA你来帮我吧,这样很多事情CPU就不用停下来去管了。在DMA模式下,CPU只须向DMA控制器下达指令
    发表于 12-09 06:00

    一文读懂DMA控制器

    DMA控制器的主要特性有哪些?DMA控制器通道的配置过程该怎样去完成呢?
    发表于 12-13 06:12

    Zynq DMA第七篇:Adam Taylor 玩转MicroZed 系列29

    前期博客中介绍了 Direct Memory Access,本博客将主要介绍利用简单示例演示如何设置和使用DMA。要
    发表于 02-09 05:47 220次阅读
    Zynq <b class='flag-5'>DMA</b>第七篇:Adam Taylor 玩转MicroZed 系列29

    基于AMBA总线的DMA控制器IP核设计

    制造厂商都有自己的解决方案。本文通过介绍一种基于ARM总线之一的AHB总线的DMA控制器的IP核设计,简述了IP核设计的流程和需要重点注意的地方。
    发表于 12-06 13:41 3380次阅读
    基于AMBA总线的<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>IP核设计

    Crossbar的多通道DMA控制器设计

    为了具体介绍本多通道 DMA 控制器的设计方案,下面首先对基于 Crossbar 的多通道 DMA 控制器的工作原理进行详细分析,接着具体说
    发表于 12-07 09:37 4665次阅读
    Crossbar的多通道<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>设计

    dma控制器芯片8257资料介绍

    DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA
    发表于 12-07 10:23 1.6w次阅读
    <b class='flag-5'>dma</b><b class='flag-5'>控制器</b>芯片8257资料<b class='flag-5'>介绍</b>

    dma控制器由什么组成

    DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA
    发表于 12-07 16:08 5191次阅读
    <b class='flag-5'>dma</b><b class='flag-5'>控制器</b>由什么组成

    dma控制器的组成

    一个DMA控制器,实际上是采用DMA方式的外围设备与系统总线之间的接口电路,这个接口电路是在中断接口的基础上再加DMA机构组成。习惯上将DMA
    的头像 发表于 04-01 16:08 1w次阅读

    dma控制器是什么_dma控制器工作方式

    DMA(Direct Memory Access)控制器是一种在系统内部转移数据的独特外设,可以将其视为一种能够通过一组专用总线将内部和外部存储器与每个具有DMA能力的外设连接起来的控制器
    发表于 11-15 10:25 1.3w次阅读

    ZNEO CPU 上的 DMA 控制器特性分析

    本应用笔记介绍了 ZNEO CPU 中的 DMA 控制器及其突出的特性,例如 DMA 和 CPU 带宽共享控制以及四个独立的
    的头像 发表于 06-21 17:28 1377次阅读
    ZNEO CPU 上的 <b class='flag-5'>DMA</b> <b class='flag-5'>控制器</b>特性分析

    Arduino语法详解示例详解

    Arduino语法详解_含示例详解
    发表于 07-19 14:09 6次下载

    AN4104_STM32F0xx的DMA控制器的使用

    AN4104_STM32F0xx的DMA控制器的使用
    发表于 11-21 08:11 2次下载
    AN4104_STM32F0xx的<b class='flag-5'>DMA</b><b class='flag-5'>控制器</b>的使用