转载于http://blog.csdn.net/peasant_lee/article/details/5594753

  

  DMA一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,不需要CPU干预。整个数据传输在DMA控制器控制下进行。CPU除了在数据传输开始和结束时做一点处理外,在传输过程中CPU可以进行其他的工作。这样,在大部分时间里,CPU和输入输出都处于并行操作。

通常,DMA控制器有多个通道,有独立的请求和中断,独立可编程的源地址、目标地址和传输数目。可以将FLASH、SRAM、外SRAM、和其他外设作为源或目标

完整的DMA传输过程如下:

  1.DMA请求 CPU对DMA控制器初始化

  2.DMA响应CPU执行完当前总线周期即可释放总线控制权。

  3.DMA传输 DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作。

  4.DMA结束 当完成规定的成批数据传送后,DMA控制器即释放总线控制权。

注意到上面的一句话 “在大部分时间里,CPU和输入输出都处于并行操作”。并不是全部。 在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。通常有如下三种方式: 停止CPU访问、周期挪用方式、DMA与CPU交替访问。

STM32的DMA控制器执行直接存储器数据传输时和Cortex-M3核共享系统数据线。因此,1个DMA请求使得CPU停止访问系统总线的时间至少2个周期。为了保证Cortex-M3核的代码执行的最小带宽,在2个连续的DMA请求之间,DMA控制器必须释放系统总线至少1个周期。STM32内部有一个总线矩阵,协调着CPU和DMA到SRAM、内存和外设的访问。而DSP的DMA拥有独立的DMA总线。通用CPU中的总线是共享的,DMA使用了总线则CPU就要等待,而DSP中的DMA使用独立的DMA总线通路,可以和CPU core并发操作。

大多数带内部 DMA 控制器的器件都有总线矩阵,多个总线主设备和从设备可以在同一时间经由互不干扰的链路进行数据传输。当然,这也需要在软件设计时进行充分的考虑,尽量规避总线冲突的发生可能性,因为这个冲突检测/总线切换在很多器件上是硬件逻辑实现的,一旦实际发生冲突,软件能做的事情往往不太多(部分器件会有相应的内部外设中断)

因此如果软件没有合理规划的话,系统的性能就会极大下降,而且实时性也无法保证。

目前来说,如果是 ARM9 或者更高的处理器,则通过 Linux 内核就可以做到至少 70% 的必须由软件完成的调控工作(但如果用户软件和用户专有驱动硬是要跟器件对着干,那也没用),不过如果是 CM3 一类半高阶器件,就得纯靠自己了

DMA技术的弊端:

因为DMA允许外设直接访问内存,从而形成对总线的独占。这在实时性强的硬实时系统的嵌入式开发中将会造成中断延时过长。这在实时性要求高的系统中,要注意了。

DMA(Direct Memory Access直接存储器访问)总结的更多相关文章

  1. (转)DMA(Direct Memory Access)

    DMA(Direct Memory Access) DMA(Direct Memory Access)即直接存储器存取,是一种快速传送数据的机制. 工作原理 DMA是指外部设备不通过CPU而直接与系统 ...

  2. DMA(direct memory access)直接内存访问

    DMA(Direct Memory Access),这里的 memory,指的是计算机的内存,自然与外存(storage)相对.这里的关键词在 Direct (直接),与传统的相对低效的,需要通过 C ...

  3. DMA(Direct Memory Access)简介

    什么是DMA(Direct Memory Access) DMA绕过CPU,在内存和外设之间开辟了一条 "隧道" ,直接控制内存与外设之间的操作,并完全由硬件控制. 这样数据传送不 ...

  4. [中英对照]Introduction to Remote Direct Memory Access (RDMA) | RDMA概述

    前言: 什么是RDMA? 简单来说,RDMA就是指不通过操作系统(OS)内核以及TCP/IP协议栈在网络上传输数据,因此延迟(latency)非常低,CPU消耗非常少. 下面给出一篇简单介绍RDMA的 ...

  5. 直接存储器存取(Direct Memory Access,DMA)详细讲解

    一.理论理解部分. 1.直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输. 2.无须CPU干预,数据可以通过DMA快速移动,这就节省了CPU的资源来做其他操作. ...

  6. Remote Direct Memory Access (RDMA)

    RDMA有三类实现方式,包括RoCE,iWARP和InfiniBand.RDMA的基础是Virtual Interface Architechure (VIA). 参考文档: https://en.w ...

  7. DMA—直接存储器访问

    DMA 简介 DMA(Direct Memory Access)—直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候,CPU 可以干其他的事情,好 ...

  8. DMA (直接存储器访问)

    DMA (直接存储器访问) 编辑 DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载.否 ...

  9. numactl 修改 非统一内存访问架构 NUMA(Non Uniform Memory Access Architecture)模式

    当今数据计算领域的主要应用程序和模型可大致分为三大类: (1)联机事务处理(OLTP). (2)决策支持系统(DSS) (3)企业信息通讯(BusinessCommunications) 上述三类系统 ...

随机推荐

  1. 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理

    蛮不错的一道题,遗憾就遗憾在数据范围会导致暴力轻松跑过. 最小生成树的两个性质: 不同的最小生成树,相同权值使用的边数一定相同. 不同的最小生成树,将其都去掉同一个权值的所有边,其连通性一致. 这样我 ...

  2. 【leetcode】Department Top Three Salaries

    The Employee table holds all employees. Every employee has an Id, and there is also a column for the ...

  3. springfox-swagger

    swagger简介 swagger确实是个好东西,可以跟据业务代码自动生成相关的api接口文档,尤其用于restful风格中的项目,开发人员几乎可以不用专门去维护rest api,这个框架可以自动为你 ...

  4. vue 修饰符sync

    从 Vue 2.3.0 起,重新引入了 .sync 修饰符,作为一个编译时的语法糖存在.它会被扩展为一个自动更新父组件属性的 v-on 监听器. 实例: 父组件:<syTree :refillD ...

  5. 【java工具类】上传文件

    /**上传文件 * @param file 文件 * @param filePath 上传文件路径,不包含文件名 * @param fileName 新的文件名 * @return 返回一个路径名 * ...

  6. Spring Boot教程(三十二)多数据源配置与使用(2)

    Spring-data-jpa支持 对于数据源的配置可以沿用上例中DataSourceConfig的实现. 新增对第一数据源的JPA配置,注意两处注释的地方,用于指定数据源对应的Entity实体和Re ...

  7. python学习之路(21)

    偏函数 Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function).要注意,这里的偏函数和数学意义上的偏函数不一样. 在介绍函数参数的时候,我们讲 ...

  8. Java并发编程的艺术笔记(五)——Java中的锁

    一.Lock接口的几个功能: 显示的获取和释放锁 尝试非阻塞的获取锁 能被中断的获取锁 超时获取锁 使用方式: Lock lock = new ReentrantLock(); lock.lock() ...

  9. C++入门经典-例4.3-函数的递归调用之汉诺塔问题

    1:代码如下: // 4.3.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  10. opencv_将图像上的4个点按逆时针排序

    1:代码如下: #include "stdafx.h" #include "cxcore.h" #include "cvcam.h" #in ...