您的位置:首页 > 其它

EDMA使用中遇到cache一致性的问题

2016-02-03 10:35 537 查看
DMA在嵌入式中很常用,使用中需要控制好cache一致性问题,最近项目出现了搬移数据异常的问题,再次明确了该问题的重要。
本文简单介绍cache原理、DMA原理、DMA与cache一致性问题、项目中EDMA的使用、遇到的问题和解决方法

1. Cache简介

Cache,是CPU缓存的简称,是位于CPU与内存(Memory)之间的临时存储器,与内存相比,它容量小、交换速度、价格昂贵,cache主要是为了解决CPU运算速度与内存读写速度不匹配的问题(CPU运算速度远远快于内存读写速度),cache中存储CPU短时间内即将访问的内容,跟cache相关的一个概念叫命中,即CPU访问数据或调用代码时,先从cache中寻找(成功叫命中),失败后再转向memory,获取的同时,也把它拷进Cache。只要Cache的空间与主存空间在一定范围内保持适当比例的映射关系,Cache的命中率还是相当高的。一般规定Cache与内存的空间比为4:1000,即128kB
Cache可映射32MB内存;256kB Cache可映射64MB内存。在这种情况下。命中率都在90%以上。

感兴趣可以深入研究
1)Cache的3种基本结构和详细原理:全相联Cache、直接映像Cache、组相联Cache。
2)CPU和Cache及主存之间读写方式:贯穿读出式(Look Through)、旁路读出式(Look Aside)、写穿式(Write Through)、回写式(Copy Back)

2. DMA简介

当CPU需要处理大量数据时,为了防止将CPU的有限资源浪费在数据搬移,用独立于CPU运行的DMA将数据从片外空间(DDR DRAM)搬进片内空间(L2SRAM),就可避开内存直接从缓存中调用,从而加快读取速度。

3.DMA和cache一致Edma3_CacheInvalidate性问题

该问题是指:cache中数据与内存中数据的不同步。由于缓存存在于cpu与内存中间,所以任何外设对内存的修改并不能保证cache中也得到同样的更新,DMA直接操作内存,与cache无关,所以进行DMA搬移和CPU处理数据的时候会出现两个问题:

DMA 从片外读取数据到片内供CPU使用(DDR->L2)。DMA 将外部数据直接传到内存中,但cache 中仍然保留的是旧数据,这样CPU在访问数据时仍认为cache即内存数据,直接访问缓存将得到错误的数据。 
DMA 将CPU提供的片内数据写到片外(L2->DDR)。CPU在处理数据时数据会先存放到cache中,此时cache中的数据有可能还没来得及写回到内存中的数据。如果这时DMA直接从内存中取出数据传送到外设,外设将可能得到错误的数据。

4.使用中存在的问题

目的是用pingpong将DDR搬入L2,计算后再搬出去,原理如下图,结果发现DDR Data Out中的数据有部分是错误的。



5.如何正确使用

错误的原因正是第3条中提出的两点,为了正确进行DMA 传输,必须进行必要的cache 操作。EDMA3中cache 操作主要分为 flush(清理)和invalidate (作废)。

Flush用在片内->片外时,DMA传输前告诉CPU将cache放入内存,保证DMA传出的是CPU最新提供的数据;
Invalidate用在片外->片内时,CPU计算前告诉CPU直接从内存中获取数据,保证CPU计算的是最新从DMA传入的。

在上图中即在1前使用Flush,告诉CPU计算最新的数据,在4后使用Invalidate,告诉CPU将内存刷新以保证DMA搬移最新的数据。

部分内容转自:http://blog.csdn.net/michaelcao1980/article/details/19191167
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  EDMA 缓存 内存