2. DMA基础与星载适配

星载高速数据搬运的核心矛盾在于:载荷源(如相机、SAR、激光通信终端)持续以数十至数百MB/s的速率产生数据,而CPU既要处理协议、又要响应中断,若逐字节搬运,很快会被数据流淹没。DMA(Direct Memory Access,直接存储器访问)正是为解决这一矛盾而存在的硬件机制——它让数据在外设与存储器之间直接流动,CPU只负责“下达任务”和“处理完成事件”。理解DMA,必须同时理解它的三个层面:工作原理、传输模式、以及地址空间与总线主控关系。

一、DMA工作原理:从“CPU搬”到“控制器搬”

没有DMA时,一次外设到存储器的传输通常由CPU执行“读—写”循环:从外设数据寄存器读入,再写入存储器,每个字都要占用指令周期。DMA的做法是把这套循环交给独立的DMA控制器(DMAC)。CPU只需在DMAC中填写源地址、目的地址、传输长度、传输宽度和触发方式,然后启动通道;此后DMAC向总线仲裁器申请总线使用权,获得授权后直接产生地址与读写控制信号,把数据从源搬到目的。每完成一个数据单元,DMAC内部地址寄存器递增、长度计数器递减,直到计数归零,再置位完成标志并产生中断,通知CPU“这批数据已就绪”。

这里有一个星载场景必须注意的细节:DMAC是总线主控(Bus Master),它和CPU一样能发起总线周期。因此系统中存在多个主设备竞争同一总线或交叉开关。若仲裁策略不当,DMA大块传输可能长时间占用总线,导致CPU取指、中断响应被延迟。工程上通常通过突发长度限制、通道优先级和总线时间片来约束DMA的占用行为,而不是简单追求“一次搬完”。

二、三种传输模式:块、散列、链式

块传输(Block Transfer)是最基础的模式:源地址、目的地址、长度一次设定,DMAC连续搬运一整块。它适合连续帧数据,例如把相机一行或一帧从接口FIFO搬到DDR帧缓存。优点是控制开销小、吞吐高;缺点是传输期间地址固定递增,无法处理不连续的目标区域。

散列传输(Scatter-Gather)解决“数据在物理上不连续”的问题。它用一张描述符表记录多个“源—目的—长度”三元组,DMAC依次读取描述符并完成各段搬运。星载存储器常因EDAC、坏块管理或分区隔离而呈现非连续物理页,散列模式让上层仍可按连续逻辑缓冲区组织数据,由DMA完成物理拼接。描述符本身也存放在存储器中,因此DMAC需要具备读取描述符的能力,这会额外消耗少量带宽。

链式传输(Chained / Linked-List)是散列的进阶:每个描述符末尾带一个“下一描述符地址”指针,形成链表。DMAC完成当前段后自动跳转到下一描述符,无需CPU逐段干预。它特别适合“多帧连续采集、每帧长度可能变化”的载荷,例如变长压缩包或分包遥测。链式模式的关键风险是链表断裂或指针错误,一旦描述符被辐射翻转破坏,DMA可能写入错误地址。因此星载设计中常对描述符区加CRC校验,并在链尾设置哨兵描述符。

DMA 三种传输模式与总线主控关系 CPU 配置 / 响应中断 DMA 控制器 DMAC 源地址 / 目的地址 长度 / 宽度 / 触发 总线仲裁 优先级 / 时间片 DDR / SRAM 帧缓存 / 描述符 配置 完成中断 总线请求 授权 ① 块传输 Block 源:连续地址 目的:连续地址 一次设定,连续搬运 适合:整帧 / 整行 风险:长时间占用总线 对策:限制突发长度 ② 散列 Scatter-Gather 描述符表(多段) 段1 段2 段3 段4 物理不连续 → 逻辑连续 适合:EDAC / 分区页 代价:读描述符耗带宽 ③ 链式 Chained 描述符1 描述符2 描述符3 哨兵 自动跳转,无需CPU干预 适合:变长帧 / 多包遥测 风险:链表断裂 / 指针翻转 对策:描述符CRC + 哨兵

三、地址空间与总线主控:星载适配的关键约束

DMA的地址空间问题在星载环境中比地面系统更尖锐。地面系统通常有MMU统一映射,DMA使用物理地址即可;而星载SoC常采用“CPU虚拟地址 + DMA物理地址”的混合视图。若软件把虚拟地址直接写入DMAC,DMA会访问错误物理位置,轻则数据错乱,重则覆盖关键遥测区。因此必须明确:DMAC看到的是物理地址,驱动在配置前要完成虚拟到物理的转换,并保证缓冲区在传输期间不被换出或迁移。对于带Cache的处理器,还要处理Cache一致性问题——DMA写入DDR后,CPU可能仍读到Cache中的旧数据。常见做法是:DMA缓冲区使用非Cache属性,或在传输前后执行Cache无效/回写操作。

总线主控方面,DMAC与CPU、其他DMA通道共享总线。星载平台常采用多层AHB/AXI交叉开关,每个主设备有独立通道。设计时要回答三个问题:谁优先?一次占用多久?冲突时谁让路?典型策略是给遥测/遥控通道最高优先级,给大块图像搬运较低优先级但允许较长突发;同时用QoS或带宽配额防止某一路DMA饿死CPU。若系统有EDAC,DMA写入的地址还需经过EDAC编码,单粒子翻转可能使描述符或数据出错,因此关键DMA路径应加入ECC或CRC校验,并在中断服务中检查错误状态寄存器。

四、星载场景对DMA的三项特殊要求

可靠性:星载DMA必须能检测并报告传输错误,包括总线错误、描述符校验失败、长度异常。设计上应支持“传输完成”和“传输错误”两个独立中断,错误时能定位到具体描述符或地址。对关键数据,可采用双缓冲加校验和比对,或DMA写入后由CPU复核CRC。

功耗:DMA本身比CPU搬运更省功耗,因为专用硬件无需取指、译码。但星载功耗优化不止于此:应让DMA在无数据时进入低功耗状态,用外设FIFO水位触发而非轮询;大块传输时尽量用宽总线(如64位)降低频率;避免DMA与CPU同时高负载争抢总线导致整体功耗上升。在轨实测中,合理配置DMA突发长度往往比提高主频更有效。

实时性:星载数据流有硬截止时间,例如相机行周期内必须搬完一行,否则FIFO溢出。实时性要求DMA的延迟可预测:中断响应时间、总线仲裁延迟、描述符读取时间都要纳入预算。工程上常用“双缓冲+乒乓”结构:DMA搬缓冲区A时,CPU处理缓冲区B,搬完切换,从而把DMA传输时间隐藏在CPU处理时间内。若单次传输时间超过行周期,则必须提高总线优先级或增加FIFO深度。

星载DMA配置检查要点:① 确认DMAC使用物理地址;② 确认缓冲区Cache属性与一致性操作;③ 确认描述符区有CRC或ECC保护;④ 确认错误中断已使能并能定位;⑤ 确认总线优先级与突发长度满足最坏情况实时预算。

把以上内容落到一个具体示例:假设相机行有效数据为2048像素×2字节=4096字节,行周期为40μs,则所需带宽约102MB/s。若DMA以64位宽、每突发16拍传输,单次突发搬128字节,搬完一行需32次突发。若总线仲裁每次授权延迟约0.5μs,则仲裁开销约16μs,加上传输本身,可能逼近40μs预算。此时应增大突发长度或提高DMA通道优先级,或改用散列模式让DMA连续读取多个行描述符,减少仲裁次数。这个估算过程说明:DMA优化不是单纯调参数,而是把带宽、延迟、仲裁和缓冲深度放在同一时间轴上核算。

理解DMA的工作原理、三种传输模式以及地址空间与总线主控关系,是后续做星载高速数据搬运优化的基础。只有先看清数据从哪来、到哪去、谁在控制总线、错误如何被发现,才能在具体型号中做出可靠的DMA配置与优化决策。