1. DMA 基础概念

DMA(Direct Memory Access,直接存储器访问)是嵌入式系统中一项关键的硬件加速技术。它允许外设或存储器之间直接传输数据,而无需 CPU 的逐字节干预。本章作为课程的开篇,将深入剖析 DMA 的工作原理、与 CPU 搬运的对比以及三种核心传输类型,为后续的设备树配置和驱动开发奠定坚实的理论基础。

1.1 DMA 工作原理

DMA 传输的核心思想是“解放 CPU”。在传统的 PIO(Programmed I/O)模式下,CPU 必须亲自执行每一条加载/存储指令来搬运数据。而 DMA 控制器(DMAC)作为一个独立的硬件总线主控器,可以接管总线控制权,在源地址和目的地址之间直接建立数据传输通道。

核心工作流程:
  1. CPU 配置 DMAC: 软件设置源地址、目的地址、传输长度、传输宽度、突发大小等参数。
  2. CPU 启动传输: 向 DMAC 发出启动请求(硬件触发或软件触发)。
  3. DMAC 获取总线控制权: 通过总线仲裁,DMAC 成为总线主设备。
  4. DMAC 执行传输: 在源与目的之间直接搬运数据,每次传输后更新地址和计数器。
  5. 传输完成中断: 当计数器归零,DMAC 向 CPU 发出中断信号,通知传输结束。
DMA 工作原理流程图 CPU 配置 DMAC CPU 启动传输 DMAC 获取总线 DMAC 搬运数据 传输完成 → 触发中断 关键点:DMA 传输期间,CPU 可以执行其他任务(如处理中断、运行操作系统),实现真正的并行处理。 DMA 传输的粒度可以是字节、半字、字,甚至支持链表描述符(Scatter-Gather)。

1.2 DMA 与 CPU 数据搬运对比

理解 DMA 的优势,最好的方式是与 CPU 直接搬运进行对比。下表从多个维度量化了两者的差异:

对比维度 CPU 直接搬运(PIO) DMA 控制器搬运
CPU 占用率 100%(搬运期间无法执行其他任务) 仅配置和中断处理阶段占用(通常 < 5%)
传输速率 受限于 CPU 指令执行速度(通常几十 MB/s) 接近总线带宽(可达数 GB/s,如 AXI 总线)
功耗 高(CPU 持续高负载运行) 低(专用硬件高效传输)
实时性 差(受中断和调度影响) 好(硬件级传输,延迟可预测)
适用场景 小数据量(< 64 字节)、控制寄存器操作 大数据块(音频、视频、网络包、存储)
编程复杂度 低(直接 memcpy 或循环) 中(需配置 DMA 描述符、处理回调)
实战经验: 在嵌入式 Linux 中,对于小于 64 字节的传输,CPU 直接搬运往往比 DMA 更快,因为 DMA 的描述符设置和中断开销会超过传输本身的时间。因此,驱动开发中通常会设置一个“DMA 阈值”,低于该阈值时使用 PIO 模式。
DMA vs CPU 数据搬运对比 CPU 直接搬运(PIO) CPU 从外设读取数据到寄存器 CPU 将数据写入内存 重复直到传输完成 CPU 占用率:100% 速率:受限于 CPU 频率 DMA 控制器搬运 CPU 配置 DMA 描述符 DMA 直接在外设与内存间传输 CPU 可执行其他任务 CPU 占用率:< 5% 速率:接近总线带宽

1.3 DMA 传输类型

根据数据流的源和目的方向,DMA 传输分为三种基本类型。理解这三种类型是配置设备树 DMA 属性和编写 DMA Engine 驱动的关键前提。

1.3.1 内存到内存(Memory-to-Memory, M2M)

  • 数据流: 内存 → 内存
  • 触发方式: 软件触发(CPU 写启动寄存器)
  • 典型应用: 快速 memcpy、帧缓冲拷贝、加密/校验预处理
  • 特点: 不需要外设请求信号,完全由软件控制;通常用于系统内部数据搬移。

1.3.2 内存到外设(Memory-to-Peripheral, M2P)

  • 数据流: 内存 → 外设(如 UART TX、SPI MOSI、I2S 输出)
  • 触发方式: 外设硬件请求(如 TX FIFO 空标志)
  • 典型应用: 音频播放、网络发包、LCD 显示数据刷新
  • 特点: 外设作为“消费者”,DMA 从内存读取数据推送给外设。

1.3.3 外设到内存(Peripheral-to-Memory, P2M)

  • 数据流: 外设 → 内存(如 UART RX、SPI MISO、ADC 采样结果)
  • 触发方式: 外设硬件请求(如 RX FIFO 非空标志)
  • 典型应用: 音频录音、网络收包、传感器数据采集
  • 特点: 外设作为“生产者”,DMA 将外设数据存入内存。
常见误区: 并非所有 DMA 控制器都支持 M2M 传输。例如,某些低功耗 MCU 的 DMA 只支持外设触发(M2P/P2M),不支持软件触发的 M2M。在配置设备树时,必须查阅芯片手册确认 DMA 控制器的能力。
三种 DMA 传输类型架构图 系统内存(DDR/SRAM) 外设(UART/SPI/I2S) DMA 控制器 M2M M2P P2M 传输类型说明 • M2M:内存 ↔ 内存(软件触发) • M2P:内存 → 外设(外设请求) • P2M:外设 → 内存(外设请求) 箭头方向表示数据流方向 虚线表示可选的反馈路径

1.4 关键术语速查表

术语 英文 说明
源地址 Source Address 数据读取的起始地址(内存或外设寄存器地址)
目的地址 Destination Address 数据写入的起始地址
传输宽度 Transfer Width 单次传输的数据宽度(8/16/32/64 位)
突发传输 Burst Transfer 连续传输多个数据单元,减少总线仲裁开销
描述符 Descriptor 描述一次 DMA 传输的元数据结构体(地址、长度、控制标志)
Scatter-Gather 分散-聚集 通过链表管理多个不连续内存块的 DMA 传输
流控制 Flow Control 决定传输何时停止(由 DMA 控制器或外设控制)
课程要点回顾:
  • DMA 的核心价值是“CPU 卸载”,让 CPU 从繁重的数据搬运中解放出来。
  • 三种传输类型(M2M、M2P、P2M)决定了设备树中 dma-requests 和 dma-channel 的配置方式。
  • 在后续章节中,我们将学习如何将这些概念映射到实际的设备树绑定和 DMA Engine API 调用中。