您的位置:首页 > 其它

关于DMA基础知识

2016-10-09 17:14 190 查看
(大部分内容来源于网络,有本人整理总结+个人见解所得)

概念:DMA(direct memoryaccess直接内存访问),是一种避开CPU,可以直接对外设和内存进行访问的技术,可以实现外设与内存、内存之间、外设之间数据的访问和搬移。

目的:不需要CPU的干预而直接服务外设,这样CPU就可以去处理别的事务,从而提高系统的效率。(附录举例补充)

构成

·一般而言,DMA控制器将包括一条地址总线、一条数据总线和控制寄存器。

·DMA属于外设,因为它是在处理器的编程控制下来执行传输的。

·一个处理器可以包含多个DMA控制器。每个控制器有多个DMA通道。

·处理器DMA分成两种,系统DMA(可访问任何资源)和内部存储器DMA(专门用于内部存储器之间数据存取,速度更快)。

·每个DMA控制器有一组FIFO,起到DMA子系统和外设或存储器之间的缓冲器的作用

设置

目前有两类主要的DMA传输结构:寄存器模式和描述符模式。

寄存器模式

       在基于寄存器的DMA内部,处理器直接对DMA控制寄存器进行编程,来启动传输。

       基于寄存器的DMA由两种子模式组成:自动缓冲(Autobuffer)模式和停止模式。在自动缓冲DMA中,当一个传输块传输完毕,控制寄存器就自动重新载入其最初的设定值,同一个DMA进程重新启动,开销为零。自动缓冲DMA特别适合于对性能敏感的、存在持续数据流的应用。DMA控制器可以在独立于处理器其他活动的情况下读入数据流,然后在每次传输结束时,向内核发出中断。

       停止模式的工作方式与自动缓冲DMA类似,区别在于各寄存器在DMA结束后不会重新载入,因 此整个DMA传输只发生一次。停止模式对于基于某种事件的一次性传输来说十分有用。例如,非定期地将数据块从一个位置转移到另一个位置。

 

描述符模式

       基于描述符(descriptor)的DMA要求在存储器中存入一组参数,以启动DMA的系列操作。该描述符所包含的参数与那些通常通过编程写入DMA控制寄存器组的所有参数相同。不过,描述符还可以容许多个DMA操作序列串在一 起。在基于描述符的DMA操作中,我们可以对一个DMA通道进行编程,在当前的操作序列完成后,自动设置并启动另一次DMA传输。

描述符管理

一种是软件链式管理,它需要设定多种描述符,并将其串连到一起,一个描述符指向下一个描述符,描述符的载入是自动的。

一种是硬件队列管理DMA,这种在一些高级处理器才会用到。

 

最后使用DMA需要注意的问题:

DMA使用物理地址,程序是使用虚拟地址的,所以配置DMA时必须将虚拟地址转化成物理地址。
因为程序使用虚拟地址,而且一般使用cache地址,所以Cache中的内容与其物理地址(内存)的内容不一定一致,所以在启动DMA传输前一定要将该地址的cache刷新,即写入内存。

OS并不能保证每次分配到的内存空间在物理上是连续的。尤其是在系统使用过一段时间而又分配了一块比较大的内存时。所以每次都需要判断地址是不是连续的,如果不连续就需要把这段内存分成几段让DMA完成传输
(举例补充:对于慢速设备,如UART,其作用只是降低CPU的使用率,但对于高速设备,如硬盘,它不只是降低CPU的使用率,而且能大大提高硬件设备的吞吐量。因为对于这种设备,CPU直接供应数据的速度太低。因CPU只能一个总线周期最多存取一次总线,而且对于ARM,它不能把内存中A地址的值直接搬到B地址。它只能先把A地址的值搬到一个寄存器,然后再从这个寄存器搬到B地址。也就是说,对于ARM,要花费两个总线周期才能将A地址的值送到B地址。而DMA就不同了,一般系统中的DMA都有突发(Burst)传输的能力,在这种模式下,DMA能一次传输几个甚至几十个字节的数据,所以使用DMA能使设备的吞吐能力大为增强。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DMA 基础知识 嵌入式