1. DMA 基础概念
DMA(Direct Memory Access,直接存储器访问)是嵌入式系统中一项关键的硬件加速技术。它允许外设或存储器之间直接传输数据,而无需 CPU 的逐字节干预。本章作为课程的开篇,将深入剖析 DMA 的工作原理、与 CPU 搬运的对比以及三种核心传输类型,为后续的设备树配置和驱动开发奠定坚实的理论基础。
1.1 DMA 工作原理
DMA 传输的核心思想是“解放 CPU”。在传统的 PIO(Programmed I/O)模式下,CPU 必须亲自执行每一条加载/存储指令来搬运数据。而 DMA 控制器(DMAC)作为一个独立的硬件总线主控器,可以接管总线控制权,在源地址和目的地址之间直接建立数据传输通道。
核心工作流程:
- CPU 配置 DMAC: 软件设置源地址、目的地址、传输长度、传输宽度、突发大小等参数。
- CPU 启动传输: 向 DMAC 发出启动请求(硬件触发或软件触发)。
- DMAC 获取总线控制权: 通过总线仲裁,DMAC 成为总线主设备。
- DMAC 执行传输: 在源与目的之间直接搬运数据,每次传输后更新地址和计数器。
- 传输完成中断: 当计数器归零,DMAC 向 CPU 发出中断信号,通知传输结束。
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 模式。
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 控制器的能力。
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 调用中。