凡亿教育 · 电子工程师实战教育品牌
嵌入式硬件培训:长沙/广州校区
|
课程咨询:15989478308(同微信)
免费领取课程大纲

DMA写完了,CPU读到的还是旧数据

DMA写完了,CPU读到的还是旧数据

Cortex-M7 D-Cache、DMA接收发送缓冲与cache line主题封面

DMA完成中断已经到了,CPU读出的缓冲区却还是上一帧;关闭D-Cache后,现象又消失了。此时要怀疑的不只是DMA长度,而是CPU和DMA看到的可能不是同一份数据。对于没有硬件缓存一致性的系统,DMA访问内存,CPU则可能命中缓存里的旧副本。完成中断只说明传输状态,不负责自动更新这些副本。先把缓冲区归属与数据方向画清楚,再选择缓存维护动作。

同一个地址,可能对应两份暂时不同的数据

CPU读取可缓存内存时,数据可能先进入D-Cache。以后再次读取同一位置,如果命中缓存,就不一定重新访问外部的那份内存。DMA在另一条访问路径上更新内存后,CPU缓存中的旧内容未必自动失效。地址正确、传输计数正确,仍然可能读到旧值。

这类问题需要先限定平台:是否启用了D-Cache,缓冲区所在区域是否可缓存,DMA是否具备相应一致性能力。没有数据缓存或使用硬件一致性互连的系统,不能照搬同一处理方式。另外还要先确认DMA能够访问该内存区域;不可访问与缓存旧副本是两类故障,不能混着解决。

原理示意:CPU可命中缓存副本,DMA直接访问共享内存,两条路径未必自动一致。

原理示意:CPU可命中缓存副本,DMA直接访问共享内存,两条路径未必自动一致。

发送与接收,维护方向恰好不同

CPU准备数据交给DMA发送时,若采用写回缓存,新数据可能仍留在脏缓存行里。此时需要在移交前按平台要求把相关数据提交到内存,常称为clean。DMA接收完成后,CPU准备读取时,则需要按要求丢弃相关旧缓存副本,常称为invalidate,让后续读取拿到更新后的内存内容。

两种动作不能凭名称随意互换。只对发送缓冲区做invalidate,可能丢掉尚未提交的新数据;对已经被DMA更新的接收区盲目clean,又可能把旧脏副本写回去覆盖新数据。维护位置必须配合所有权转换,DMA使用期间,CPU不应同时修改同一缓冲区。

方向示意:CPU交给DMA前提交新数据;DMA交还CPU时失效旧副本,并遵守缓冲区所有权。

方向示意:CPU交给DMA前提交新数据;DMA交还CPU时失效旧副本,并遵守缓冲区所有权。

接收开始前也要妥善处理原有缓存状态,避免旧脏行在传输期间被写回覆盖DMA数据。接收完成后还要处理可能重新进入缓存的旧副本。具体顺序、屏障和函数行为要按芯片与软件库版本确认,不能把“中断里加一行清缓存”当成完整方案。

维护的是缓存行,不是你想象中的几个字节

按地址维护缓存时,硬件操作通常以缓存行为粒度。以所述Cortex-M7缓存维护接口的32字节边界要求为例,一个很小的缓冲区也可能与旁边的变量共享同一行。如果接收后把整行失效,而相邻变量恰好有未写回的更新,就可能连带丢失别处的数据。

因此,DMA缓冲区应按目标平台的缓存行要求对齐,并让占用范围避免与无关可写对象共用一行。长度处理也要覆盖完整维护范围,不能只把起始地址对齐就结束。具体行大小、函数参数与取整规则以当前内核和库实现为准,不把32字节推广到所有处理器。

缓存行示意:缓冲区与相邻变量共用一行时,失效操作可能影响缓冲区之外的数据。

缓存行示意:缓冲区与相邻变量共用一行时,失效操作可能影响缓冲区之外的数据。

先做可重复的小对照,再决定系统方案

验证可使用固定递增数据或帧序号,让CPU写入、DMA搬运和CPU读取的内容容易比较。保持长度与地址不变,分别检查可缓存区域和正确配置的非缓存区域,再核对维护动作。关闭整个缓存可以提供线索,但性能、时序也随之变化,不能把现象消失直接当成根因已完全证实。

长期方案可以是合理划分非缓存DMA缓冲区,也可以保留缓存并实现严格的维护和所有权协议,二者都有性能与复杂度代价。不要随意把普通RAM改成不合适的设备内存属性。配置内存保护单元时,应结合芯片手册确认区域属性、对齐和覆盖关系。

验证顺序:可访问性、内存属性、整行隔离、移交维护和完成同步逐项确认。

验证顺序:可访问性、内存属性、整行隔离、移交维护和完成同步逐项确认。

volatile只影响编译器对访问的处理,不会代替缓存提交、失效或DMA完成同步。验收应包含重复收发、边界长度和缓冲区相邻数据检查;只有数据内容和所有权时序都对应,才算真正把问题关掉。

DMA完成并不等于CPU缓存已经更新,关键是明确数据方向和缓冲区所有权。下一步先核对内存区域,再检查发送提交、接收失效以及缓存行隔离。你们当前的DMA缓冲区是否独占完整缓存行,还是和计数器、状态标志等普通变量紧挨着放在同一块内存里?

声明:


本文由凡亿教育整理,转载请注明来源!

投稿/招聘/广告/课程合作/资源置换 请加微信:13237418207



上一篇螺纹能拧上,SMA接头也可能没接通 下一篇没有了