您的位置:首页 > 其它

DMA介绍和几个问题

2015-06-17 08:52 190 查看
我学习DMA碰到的几个问题

不了解什么是DMA

不知道DMA有什么优点

不知道什么时候使用DMA

问题一

DMA简单的说就是数据的搬运工,将数据从外设搬到内存,或者将内存的一个位置搬运到另一个位置。只要开启了使能就开始搬运。

问题二

既然DMA是数据的搬运工,那么CPU就可以不用管数据的搬运了,只要DMA一个信号说我搬完了,CPU进行数据处理就可以了。这样在数据搬运期间,CPU就可以处理其他的功能了。如,当串口源源不断的接收数据时,如果没有DMA,那么CPU就需要自己不断的将数据搬运到内存然后进行处理,但是如果加入了DMA,那么只要将串口的DMA打开,DMA自己就可以将数据搬运到指定的位置(自己定义的数组),那么当搬完了,告诉CPU数据已经搬运结束,你可以处理了,然后CPU进行处理,而DMA则继续搬运数据,这样搬运与处理两不误,如果怕数据收到影响,可以开辟两个缓冲区,分别搬运。先搬运到A区此时CPU处理A区的数据,当CPU处理时,DMA将新数据搬运到B区,结束后CPU处理B区,如此循环往复

问题三

有了前面的铺垫,这个问题就简单了,当然是在搬运数据的时候开始使用DMA了。

有时,数据量很大CPU搬运数据需要耗费很多资源,这时就可以使用DMA,有时数据产生很快,如ADC如果开启多通道循环时,ADC只有一个数据寄存器,如果不立即将数据取走那么就会产生数据覆盖,此时就需要DMA在此候命,一有数据就搬走这样CPU就可以心安理得的处理数据了

当时用DMA时,没有软件的干预,但是DMA的硬件设计上会有一些问题,第一个问题就是内存只有一套地址和数据信号线,在驱动这些信号时,DMA必须保证时间上不和微处理器冲突。(这就意味着,当使用DMA在传输数据时,微处理器只能处理数据而不能读写总线的数据。事实上确实是这样,我们在用DMA采集数据的同时,让微处理器来处理我们采集的数据)

通常用下面的方法来解决



当I/O设备有数据要传输到RAM时,它发送DMAREQ信号给DMA。随后DMA发送BUSREQ给微处理器。当微处理器正好释放总线时微处理器发送BUSACK信号给DMA,然后,DMA将要写入数据的地址放到地址总线上,再发送DMAACK信号给I/O和写信号(WRITE)给RAM。此时I/O设备将数据放到数据总线上让RAM读取,这样就完成了整个写周期。在写数据完成之后,DMA将释放DMAACK,恢复地址总线状态,并且释放BUSREQ信号。微处理器释放BUSACK信号后继续执行后面的指令。

那么DMA是如何来确定何时传输第二个数据呢,也就是说如何来确定传输完一个字节后,还有字节要传输呢?答案就是DMA的触发检测,有两种检测

DMA的边沿检测:即一旦出现DMAREQ的上升沿(或下降沿)就传输一个字节,这就要求I/O设备每传输一个字节后要使DMAREQ下降(上升),然后立即上升(下降),只要还有待传输的数据

DMA的电平触发:即只要DMAREQ保持高位就一直传输字节。这就要求在传输多个字节是I/O设备要能使DMAREQ保持足够长的时间,但在最后一给字节传输结束后必须快速使DMAREQ下降
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: