dma基本原理、结构与应用(上)

上传人:第*** 文档编号:32940980 上传时间:2018-02-13 格式:DOC 页数:7 大小:277.50KB
返回 下载 相关 举报
dma基本原理、结构与应用(上)_第1页
第1页 / 共7页
dma基本原理、结构与应用(上)_第2页
第2页 / 共7页
dma基本原理、结构与应用(上)_第3页
第3页 / 共7页
dma基本原理、结构与应用(上)_第4页
第4页 / 共7页
dma基本原理、结构与应用(上)_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《dma基本原理、结构与应用(上)》由会员分享,可在线阅读,更多相关《dma基本原理、结构与应用(上)(7页珍藏版)》请在金锄头文库上搜索。

1、直接存储器存取基本原理、结构与应用(上)直接存储器存取(DMA)控制器是一种在系统内部转移数据的独特外设,可以将其视为一种能够通过一组专用总线将内部和外部存储器与每个具有 DMA 能力的外设连接起来的控制器。它之所以属于外设,是因为它是在处理器的编程控制下来执行传输的。值得注意的是,通常只有数据流量较大(kBps 或者更高)的外设才需要支持 DMA 能力,这些应用方面典型的例子包括视频、音频和网络接口。 一般而言,DMA 控制器包括一条地址总线、一条数据总线和控制寄存器。高效率的 DMA 控制器将具有访问其所需要的任意资源的能力,而无须处理器本身的介入,它必须能产生中断。最后,它必须能在控制器

2、内部计算出地址。 一个处理器可以包含多个 DMA 控制器。每个控制器有多个 DMA 通道,以及多条直接与存储器站(memory bank)和外设连接的总线,如图 1 所示。在很多高性能处理器中集成了两种类型的 DMA 控制器。第一类通常称为“系统 DMA 控制器”,可以实现对任何资源(外设和存储器)的访问,对于这种类型的控制器来说,信号周期数是以系统时钟(SCLK)来计数的,以 ADI 的 Blackfin 处理器为例,频率最高可达133MHz。第二类称为内部存储器 DMA 控制器(IMDMA),专门用于内部存储器所处位置之间的相互存取操作。因为存取都发生在内部(L1L1、L1L2,或者 L2

3、L2),周期数的计数则以内核时钟(CCLK)为基准来进行,该时钟的速度可以超过 600MHz。 每个 DMA 控制器有一组 FIFO,起到 DMA 子系统和外设或存储器之间的缓冲器的作用。对于MemDMA(Memory DMA)来说,传输的源端和目标端都有一组 FIFO 存在。当资源紧张而不能完成数据传输的话,则 FIFO 可以提供数据的暂存区,从而提高性能。 因为你通常会在代码初始化过程中对 DMA 控制器进行配置,内核就只需要在数据传输完成后对中断做出响应即可。你可以对 DMA 控制进行编程,让其与内核并行地移动数据,而同时让内核执行其基本的处理任务那些应该让它专注完成的工作。 图 1:系

4、统和存储器 DMA 架构。 广告插播信息维库最新热卖芯片: TL431AIDR PC829 TPS65010RGZR NDT452AP CL450-P160 SAH-C164SL-6RM MAX814LESA AM27S43DC IR21365S T062 在一个优化的应用中,内核永远不用参与任何数据的移动,而仅仅对 L1 存储器中的数据进行读写。于是,内核不需要等待数据的到来,因为 DMA 引擎会在内核准备读取数据之前将数据准备好。图 2 给出了处理器和 DMA 控制器间的交互关系。由处理器完成的操作步骤包括:建立传输,启用中断,生成中断时执行代码。返回到处理器的中断输入可以用来指示“数据已

5、经准备好,可进行处理”。 图 2: DMA 控制器。 数据除了往来外设之外,还需要从一个存储器空间转移到另一个空间中。例如,视频源可以从一个视频端口直接流入 L3 存储器,因为工作缓冲区规模太大,无法放入到存储器中。我们并不希望让处理器在每次需要执行计算时都从外部存储读取像素信息,因此为了提高存取的效率,可以用一个存储器到存储器的 DMA(MemDMA)来将像素转移到 L1 或者 L2 存储器中。 到目前为之,我们还仅专注于数据的移动,但是 DMA 的传送能力并不总是用来移动数据。我们可以用代码覆盖的办法来提高性能,将 DMA 的控制器配置为在执行前把代码送入 L1 指令存储器。代码往往存储于

6、较大的外部存储器中,而根据需要有选择性的送入 L1。 DMA 控制器的编程 让我们考察一下在定义 DMA 活动的过程中可以有哪些选项。我们将从最简单的模型开始,并在此基础上过渡到更为灵活的模型,这反过来增加了设置的复杂度。 对于任何类型的 DMA 传输,我们都需要规定数据的起始源和目标地址。对于外设 DMA 的情况来说,外设的 FIFO 可以作为数据源或者目标端。当外设作为源端时,某个存储器的位置(内部或外部)则成为目标端地址。当外设作为目标端,存储的位置(内部或者外部)则成为源端地址。 即 DMA 不能进行外设和外设的传输!在最简单的 MemDMA 情况中,我们需要告诉 DMA 控制器源端地

7、址、目标端地址和待传送的字的个数。采用外设 DMA 的情况下,我们规定数据的源端或者目标端,具体则取决于传输的方向。每次传输的字的大小可以是 8、16 或者 32 位。这种类型的事务代表了简单的 1 维(“1D”)统一“跨度”(unity stride)的传输。作为这一传输机制的一部分,DMA 控制器连续跟踪不断增加的源端和目标端地址。采用这种传输方式时,8 位的传输产生 1 字节的地址增量,而 16 位传输产生的增量为 2 字节,32 位传输则产生 4 字节的增量。上面的参数是基本的 1D DMA 传输的设置参数。 我们只需要改变数据传输每次的数据大小,就可以简单地增加一维 DMA 的灵活性

8、。例如,采用非单一大小的传输方式时,我们以传输数据块的大小的倍数来作为地址增量。也就是说,若规定 32 位的传输和4 个采样的跨度,则每次传输结束后,地址的增量为 16 字节(4 个 32 位字)。 虽然 1D DMA 得到了广泛的应用,但用处更大的则是 2 维(2D) DMA,特别是在视频应用中。2D 功能是我们所讨论的 1D DMA 的情形的一种直接扩展。除了 XCOUNT 和 XMODIFY 值之外,我们还需对对应的YCOUNT 和 YMODIFY 值进行编程设定。2D DMA 可以简单地理解为一个嵌套的循环,即内循环由 XCOUNT 和XMODIFY 来规定,外循环由 YCOUNT 和

9、 YMODIFY 规定。一个 1D DMA 可以被简单的视为 2D 传输的“内循环”,如下形式: for y = 1 to YCOUNT /* 2D 的外循环*/ for x = 1 to XCOUNT /* 1D 的内循环 */ /* 传输循环主体转移到这里 */ XMODIFY 决定了 XCOUNT 每次减少时的 DMA 控制器的跨度值,而 YMODIFY 则决定了 YCOUNT 每次减少时对应的跨度值。与 XCOUNT 和 XMODIFY 一样,YOUNT 可以以传输数量来定义,而 YMODIFY 则以字节数来定义。值得注意的是,YMODIFY 可以为负值,这会让 DMA 控制器回转到缓

10、冲器的起始点。 对于外设 DMA 来说,传输的“存储器端”可以是 1D 或 2D。不过,在外设端,传输始终是 1D 的。唯一的限制是在 DMA 每一端(源端和目标端)传输的字节总数必须相同。例如,如果我们从 3 个 10 字节的缓冲器向外设发送数据,外设必须被设定为传送 30 字节,具体方式则可以是任何可能的、所支持的传输宽度和传输计数值的组合。 MemDMA 提供的灵活度则要更高一些。例如,如果我们可以建立一个 1D1D 传输、一个 1D2D 传输、1 个 2D1D 传输,且可自然而然建立一个 2D2D 传输,唯一的限制条件是,在 DMA 传输模块的两端所传送的字节总数必须相等。 DMA 的

11、设置 目前有两类主要的 DMA 传输结构:寄存器模式和描述符模式。无论属于哪一类 DMA,表 1 所描述的几类信息都会在 DMA 控制器中出现。当 DMA 以寄存器模式工作时,DMA 控制器只是简单地利用寄存器中所存储的参数值。在描述符模式中,DMA 控制器在存储器中查找自己的配置参数。 表 1: DMA 寄存器 基于寄存器的 DMA 在基于寄存器的 DMA 内部,处理器直接对 DMA 控制寄存器进行编程,来启动传输。基于寄存器的 DMA提供了最佳的 DMA 控制器性能,因为寄存器并不需要不断地从存储器中的描述符上载入数据,而内核也不需要保持描述符。 基于寄存器的 DMA 由两种子模式组成:自

12、动缓冲(Autobuffer)模式和停止模式。在自动缓冲 DMA 中,当一个传输块传输完毕,控制寄存器就自动重新载入其最初的设定值,同一个 DMA 进程重新启动,开销为零。 正如我们在图 3 中所看到的那样,如果将一个自动缓冲 DMA 设定为从外设传输一定数量的字到 L1 数据存储器的缓冲器上,则 DMA 控制器将会在最后一个字传输完成的时刻就迅速重新载入初始的参数。这构成了一个“循环缓冲器”,因为当一个量值被写入到缓冲器的最后一个位置上时,下一个值将被写入到缓冲器的第一个位置上。 图 3:用 DMA 实现循环缓冲器。 自缓冲应用场合 :自动缓冲 DMA 特别适合于对性能敏感的、存在持续数据流

13、的应用。DMA 控制器可以在独立于处理器其他活动的情况下读入数据流,然后在每次传输结束时,向内核发出中断。虽然有可能以恰当的方式阻止自动缓冲模式,但如果 DMA 进程需要定期启动和停止时,采用这种工作方式就没有什么意义。 停止模式的工作方式与自动缓冲 DMA 类似,区别在于各寄存器在 DMA 结束后不会重新载入,因此整个DMA 传输只发生一次。停止模式对于基于某种事件的一次性传输来说十分有用。例如,非定期地将数据块从一个位置转移到另一个位置。当你需要对事件进行同步时,这种模式也非常有用。例如,如果一个任务必须在下一次传输前完成的话,则停止模式可以确保各事件发生的先后顺序。此外,停止模式对于缓冲

14、器的初始化来说非常有用。 描述符模型 基于描述符(descriptor)的 DMA 要求在存储器中存入一组参数,以启动 DMA 的系列操作。该描述符所包含的参数与那些通常通过编程写入 DMA 控制寄存器组的所有参数相同。不过,描述符还可以容许多个DMA 操作序列串在一起。在基于描述符的 DMA 操作中,我们可以对一个 DMA 通道进行编程,在当前的操作序列完成后,自动设置并启动另一次 DMA 传输。基于描述符的方式为管理系统中的 DMA 传输提供了最大的灵活性。 ADI 的 Blackfin 处理器上有两种主要的描述符方式描述符阵列和描述符列表,这两种操作方式所要实现的目标是在灵活性和性能之间

15、实现一种折中平衡。 在描述符阵列模式下,描述符驻留在连续的存储器位置上。DMA 控制器依然从存储器取用描述符,但是因为下一个描述符紧跟着当前的描述符,说明到何处去寻找下一个描述符(以及它们相应的描述符取用)的两个数据字就并不必要。因为描述符并不包含这一“下一描述符”指针项,DMA 控制器希望一组描述符在存储器相互挨在一起,如同阵列一般。 当各描述符在存储器中的分布位置并非“背对背”时,可以使用一个描述符列表。实际上这里涉及多种子模式,从而再一次实现了性能和灵活性之间的折中平衡。在“小描述符”模型中,描述符包括了一个单 16 位的域,用来给出“下一描述符指针”域的低位部分;高位部分则通过寄存器来

16、独立编程设定,并且不发生改变。当然,这将描述符限制在存储器中一个特定的 64K(=216)页面上。当描述符的位置需要跨越这一边界时,也可以提供一个“大”模型,它可以为“下一描述符指针”项提供 32 位的位置。 无论采用何种描述符模式,描述符的量值数越多,则描述符取用的次数就越多。这也就是为何Blackfin 处理器定义了一个“柔性描述符方式”的原因,该模式可以修改描述符的长度,使之仅仅包括特定传输所需要的数据。例如,如果不需要 2D DMA,YMODIFY 和 YCOUNT 寄存器就不需要成为描述符数据块的一部分。 描述符管理 管理描述符列表的最佳方法是什么?其实,这个问题的答案需要根据应用来定,但要明白存在何种替代方法很重要。 我们将描述的第一种选择,其工作方式非常类似于一个自动缓冲 DMA。它需要设定多种描述符,并将其串连到一起,正如图 4a 所示的那样。“串连”一词意味着一个描述符指向下一个描述符,描述符的载入是自动的。为了使链条完整,最后一个描述符反向指向第一个描述符,于是整个流程就重复下去

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 幼儿/小学教育 > 小学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号