DMA介绍和几个问题

我学习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下降

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值