当前位置: 首页 > news >正文

DMA控制器(Direct Memory Access Controller)是什么?

DMA控制器(Direct Memory Access Controller)是什么?

DMA控制器(Direct Memory Access Controller,直接内存访问控制器) 是计算机系统或微控制器(MCU)中一个至关重要的专用硬件模块。它的核心使命是在不需要中央处理器(CPU)介入的情况下,高效地完成数据在外设(如UART、ADC、SPI)与内存(RAM)之间,或者内存不同区域之间的大批量搬运工作

简而言之,DMA控制器扮演着**“数据搬运工”** 的角色,把CPU从繁重的、重复性的数据复制任务中解放出来,使其能专注于计算、逻辑控制等核心任务,从而显著提升整个系统的效率和实时响应能力


核心工作原理与工作流程

  1. CPU 初始化 DMA:
    • CPU 通过配置 DMA 控制器的寄存器来“下达任务”。
    • 关键配置参数包括:
      • 源地址: 数据从哪里来?(例如:ADC数据寄存器的地址、内存块A的起始地址)。
      • 目标地址: 数据到哪里去?(例如:发送到UART数据寄存器的地址、内存块B的起始地址)。
      • 传输方向: 外设 -> 内存、内存 -> 外设、内存 -> 内存。
      • 传输数据量: 需要传输多少个数据项(字节、半字、字)。
      • 数据宽度: 每次传输的数据大小(如8位、16位、32位)。
      • 传输模式:
        • 单次传输: 完成一次配置的传输量后停止。
        • 循环传输: 传输完成后自动重装初始值,循环往复(常用于ADC连续采集填充缓冲区)。
      • 优先级: 当多个DMA通道同时请求时,谁先执行?
      • 触发源: 什么事件启动传输?(例如:ADC转换完成信号、UART接收寄存器满信号、定时器溢出信号)。
      • 中断使能: 传输完成、传输一半、传输错误时是否通知CPU?
  2. 触发传输:
    • 当配置的触发事件发生时(如ADC完成一次转换),外设或定时器会向DMA控制器发出传输请求
  3. DMA 接管总线,执行传输:
    • DMA控制器收到请求后,向系统总线仲裁器申请总线控制权
    • 获得总线控制权后,DMA控制器直接访问源地址读取数据,然后直接访问目标地址写入数据
    • 整个传输过程完全绕过CPU,CPU的指令执行流和寄存器不受影响。
  4. 传输完成/中断:
    • DMA控制器完成指定数量的数据传输后:
      • 自动停止(单次模式)。
      • 或自动重装计数器/地址,等待下一次触发(循环模式)。
    • 如果配置了中断,DMA控制器会向CPU发出中断信号,通知CPU“数据搬完了”或“搬了一半了”,CPU可以在中断服务程序中对数据进行处理(如处理接收到的完整数据包、填充新的发送数据)。

为什么需要DMA?解决了什么问题?

  1. 解放CPU,提升效率:
    • 传统方式: CPU需要不断轮询外设状态(如查询UART接收寄存器是否满),然后执行LOAD(从外设读数据)和STORE(向内存写数据)指令。对于高速数据流(如音频、视频、网络包、高速ADC采集),这会消耗大量CPU时间(可能高达80%+),CPU忙于“搬砖”,无法执行更有价值的计算任务。
    • DMA方式: CPU仅需初始化一次DMA,后续的数据搬运工作由DMA硬件完成。CPU在传输期间可以休眠(省电)或执行其他任务,系统吞吐量和响应性大幅提升。
  2. 降低延迟,提高实时性:
    • 对于需要快速响应的外设事件(如高速ADC采样点到达),DMA可以立即响应请求并搬运数据,避免了CPU轮询或中断响应延迟造成的数据丢失风险
  3. 支持大数据量高速传输:
    • DMA控制器通常设计有优化的总线访问机制(如突发传输),能高效利用总线带宽,实现比CPU软件复制更高的数据传输速率
  4. 降低系统功耗:
    • 在传输过程中,CPU可以进入低功耗休眠模式,由DMA独自完成搬运工作,显著节省能耗。

DMA在系统中的位置与关键特性

  • 位置: 位于CPU、内存、外设之间,连接在系统总线(如AHB、APB)上。
  • 独立性: 是一个独立运行的硬件模块。
  • 多通道: 现代DMA控制器通常有多个独立通道。每个通道可单独配置,用于服务不同的外设或不同的传输任务(如一个通道负责ADC采集数据到内存,另一个通道负责从内存发送数据到UART)。
  • 总线仲裁: 通过总线仲裁器与其他总线主设备(如CPU、另一个DMA控制器)协调总线使用权。
  • 外设集成: 在MCU中,DMA控制器紧密集成在外设(如UART、SPI、I2C、ADC、DAC、Timers)中,这些外设通常都有专门的DMA请求线连接到DMA控制器。

典型应用场景(MCU中)

  1. ADC 数据采集:
    • 将ADC连续转换的结果自动存入内存缓冲区,CPU只需在缓冲区满或半满(通过DMA中断)时处理整块数据。
  2. DAC 数据输出:
    • 将内存中存储的波形数据(如音频)自动发送给DAC进行连续播放。
  3. UART / SPI / I2C 通信:
    • 接收: 将串口接收到的数据直接存入内存缓冲区,避免CPU逐个字节读取。
    • 发送: 将内存中待发送的数据块自动加载到串口发送寄存器,CPU只需准备数据。
  4. 内存初始化/复制:
    • 快速将一段内存区域清零,或将数据从一块内存复制到另一块内存(memcpy/memset硬件加速)。
  5. 摄像头接口 / LCD显示:
    • 将图像数据从内存(或摄像头接口)高速搬运到LCD显示控制器的显存。
  6. SD卡 / 外部存储器读写:
    • 在读写SD卡或外部SRAM/Flash时,搬运数据块。

使用DMA的注意事项

  1. 资源冲突:
    • 多个DMA通道或DMA与CPU同时竞争总线时,需合理设置优先级。
    • 避免源/目标地址区域重叠导致的未定义行为(尤其内存到内存传输)。
  2. 数据一致性:
    • Cache问题(重要!): 如果系统有Cache(缓存),DMA直接操作的是物理内存。CPU看到的是Cache中的数据副本。必须在DMA传输前使Cache失效(保证DMA写入新数据后CPU能读到),在CPU处理DMA数据前刷新Cache(保证CPU写入Cache的数据被DMA看到)。ARM Cortex-M7等带Cache的MCU需特别注意。
  3. 错误处理:
    • 配置好DMA传输错误中断,处理总线错误等异常。
  4. 外设FIFO配合:
    • 许多外设有FIFO(先入先出缓冲区),可与DMA深度协作,进一步提升效率。
  5. 传输完成确认:
    • 在复用缓冲区或开始下一次传输前,务必确认当前DMA传输已完成(查询状态标志或等待中断)。

总结

DMA控制器是一个高效的数据搬运专家。它通过接管CPU的数据复制职责,让CPU专注于核心计算和逻辑控制,从而显著提升系统整体性能、实时性和能效比。它是现代高性能嵌入式系统(尤其是涉及高速数据流处理的设备,如音视频设备、网络设备、仪器仪表、工业控制)中不可或缺的关键硬件组件。理解并熟练运用DMA是嵌入式开发者优化系统性能、实现复杂功能的重要技能。在配置DMA时,务必注意地址、数据量、触发源、传输模式的正确设置,并妥善处理Cache一致性问题。

http://www.lryc.cn/news/593868.html

相关文章:

  • 用户端功能清单设计指南:从核心模块到优先级排序
  • 面试150 添加与搜索单词--数据结构设计
  • 前端的测试
  • 详解Mysql索引合并
  • 二、Spark 开发环境搭建 IDEA + Maven 及 WordCount 案例实战
  • 每日一题7.20
  • Spring之事务使用指南
  • 【Vue进阶学习笔记】Vue 路由入门指南
  • 18.TaskExecutor获取ResourceManagerGateway
  • 【已解决】GitHub SSH 连接失败解决方案:Permission Denied (publickey) 错误修复指南
  • ant+Jmeter+jenkins接口自动化,如何实现把执行失败的接口信息单独发邮件?
  • XILINX JESD204B/C IP的AXI配置
  • 【HarmonyOS】ArkUI - 自定义组件和结构重用
  • 基于FPGA的多级流水线加法器verilog实现,包含testbench测试文件
  • Python基础-列表
  • Python趣味算法:借书方案知多少 | 排列组合穷举法详解
  • 06 51单片机之矩阵键盘
  • Laravel 框架NOAUTH Authentication required 错误解决方案-优雅草卓伊凡
  • Autosar RTE实现观测量生成-基于ETAS软件
  • MYSQL:从增删改查到高级查询
  • 技术演进中的开发沉思-40 MFC系列:多线程协作
  • [特殊字符] 小程序 vs 智能体:下一代应用开发,谁主沉浮?
  • 社交圈子系统开源社交源码 / 小程序+H5+APP 多端互通的底层技术分析
  • 分享如何在保证画质的前提下缩小视频体积实用方案
  • 敏捷开发的历史演进:从先驱实践到全域敏捷(1950s-2025)
  • Hiredis 构建 Redis 命令实战指南
  • 音视频学习(四十一):H264帧内压缩技术
  • 【AI】文生图文生视频
  • 吴恩达机器学习笔记(3)—线性代数回顾(可选)
  • 17.TaskExecutor与ResourceManager交互