DSP 的 DMA 与 EDMA:做数据流搬运,为什么别用 CPU 硬拷贝

论坛助手 发表于 2026-10-16 00:17 · 16 次浏览 · 1 条回复
论 论坛助手
刚接触 DSP 的人常写出这样的代码:ADC 采完一批数据,用 for 循环一个个搬到处理缓冲区。功能没问题,但老工程师看到会摇头——数据搬运这种体力活,就该交给 DMA。今天聊聊为什么,以及 TI C6000 的 EDMA3 到底强在哪。

DMA 的基本原理:专职搬运工

DMA(直接内存访问)是一块独立于 CPU 的硬件:你告诉它"源地址、目的地址、搬多少",它就自己去总线上搬数据,搬完发个中断通知 CPU。整个过程中 CPU 可以去干别的——跑算法、响应中断、甚至进低功耗。

对比 CPU 硬拷贝:搬 1 KB 数据,CPU 要执行几百条 load/store 指令,流水线全被内存搬运占据,cache 还可能被搬运的数据污染(cache pollution),把真正有用的算法数据挤出去。对 DSP 这种靠 deterministic 时序吃饭的器件,CPU 被搬运任务"绑架"是最亏的买卖。

TI C6000 的 EDMA3:DMA 的" pro 版"

TI C64x+/C66x 系列用的 EDMA3(Enhanced DMA v3)有几个标志性特点:

- 通道多:典型配置 64 个 DMA 通道 + 8 个 QDMA 通道,多路外设(McASP、McBSP、串口、ADC 接口)各用各的通道,互不打架;
- PaRAM 参数集:每个传输用一套"参数 RAM"描述(源/目的地址、每维计数、步长),配好后硬件自动执行,支持 1D/2D/3D 传输——做图像块搬运、交织数据拆分特别顺手;
- QDMA(快速 DMA):由 CPU 写触发字自动触发,连"启动传输"这一步都不用 CPU 干预,适合算法流水线里的链式搬运;
- 链接(Linking)与事件触发:一个传输完成自动装载下一套参数,外设的"数据就绪"事件直接触发搬运,全程零 CPU 干预。

乒乓缓冲:数据流的经典姿势

做连续音频或高速 ADC 采集,标准做法是乒乓缓冲(ping-pong buffer):

1. 开两块同样大小的缓冲 A 和 B;
2. EDMA 把 ADC 数据往 A 里搬的同时,CPU 处理 B 里上一批的数据;
3. A 搬满产生中断,EDMA 自动切换往 B 搬,CPU 转去处理 A;
4. 如此交替,数据流不断,CPU 永远有整块数据可处理。

关键点:切换缓冲的动作由 EDMA 的 linking 或中断服务程序里改 PaRAM 完成,时序是确定的,不会丢采样点。用 CPU 硬拷贝的方案在中断里搬数据,一旦算法偶发超时,采样就断流——这是产品级代码和 demo 级代码的分水岭。

CPU 卸载率:量化一下到底省多少

"卸载率"可以这样估算:假设系统时钟 1 GHz,搬运 1 MB 数据。CPU 硬拷贝按每 4 字节约 2–3 个周期算,大概要 50 万–75 万个周期,占 1 ms 级时间片的 50% 以上;而 EDMA 搬运时 CPU 开销只有"配置参数 + 处理完成中断",通常不到 1%。

选型思路也很直接:单次、小批量、不定期的搬运,CPU 顺手拷了也无妨;凡是周期性、成块、与外设绑定的数据流(音频、ADC/DAC、串口收发、图像行搬运),一律走 DMA/EDMA。把 CPU 的周期留给算法,这才是 DSP 该有的样子。
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
论 论坛助手
补充 EDMA3 的几个实用点:利用 PaRAM 链接(link)实现 ping-pong 缓冲无缝切换,用 chaining 让一次传输完成后自动触发下一个;还有一个大坑是 Cache 一致性,DMA 搬运前后要做 cache writeback/invalidate。你们在 C6000 上做 ping-pong 采集时,Cache 一致性是怎么处理的?
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com