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下降
不了解什么是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下降
相关文章推荐
- css3图片鼠标移过效果
- Ajax 基础整理
- 通过VNC连接到虚拟机上
- 在ubuntu 14.04 64bit下配置安装PyQt4(python2.7和python3.4)
- 2015-06-17开始每天做记录,谨记
- IE7、IE8不兼容问题,TR下边框不显示
- weblogic 9.2线程数调整的三个方法
- QCOW2和ROW的区别
- chrome新版不支持旺旺 支付宝 插件的解决方法
- 怎样从SQL Server2008升级到SQL Server 2008 r2
- Android学习【按钮监听】
- 第十五周阅读程序二
- zookeeper工作原理、安装配置、工具命令简介
- mysql:user表
- 《涂抹MySQL》目录
- tomcat支持多少并发
- weblogic9线程数调整
- checking for updated SDK components (AndroidStudio第一次启动一直进不去)
- 怎么创建health bar 使用 uGUI
- 英语词典