TI中文支持网
TI专业的中文技术问题搜集分享网站

OMAPL138 EDMA DDR2 L2 Cache一致性问题

TI专家、各位朋友:

       最近在使用OMAPL138,ARM端OS是Linux,DSP端OS是DSP/BIOS 5.41,ARM端和DSP端通过DSPLINK进行通信。DSPLINK的开发环境的是在Linux环境下搭建的。工程中,MCASP接口上挂了两片CODEC(AIC 3104),我想先在DSP端拿到音频数据,然后通过DSPLINK传输到ARM端录音。但目前在DSP端出了一个问题,我想把音频数据传输到ARM端之前先做一个验证,于是我就让这两片CODEC分别直通。我使用EDMA来搬运数据,采用PINGPONG传输,PINGPONG传输的BUFFER都映射到DDR2上,在EDMA传输完成进入中断后,将PING(或者PONG)接收BUFFER中的数据拷贝到PING(或者PONG)的发送BUFFER中,PINGPONG交替进行,来实现直通。通过连接仿真器,打出的LOG,我发现EDMA的收发中断很正常,但通过耳机听声音,发现都是噪音。我猜测在EDMA中断我做了收发BUFFER直通的拷贝,这个是需要CPU来参与,既然CPU来做,那么数据从DDR2—->L2 Cache—–>L1D Cache的过程中是否破坏了Cache数据一致性了呢?由于Cache的不一致导致了我拷贝的是错误的数据,导致我耳机听到的都是噪音?

对于此问题的一些其他的说明:

#1:在DSPLINK的开发环境中,配置了MARn相应的寄存器,使能了L2 Cache,使用的大小为128K,另外128K当做RAM

#2:DDR2的分配,DDR2大小为64M,前32M通过U-boot参数配置分配给了ARM端,后32M通过修改DSPLINK开发环境的配置文件分配给了DSP端(对于DSP端分配的DDR2空间可能比较大,其实用的很小,只是用来暂时调试),并把DSP端的32M DDR2 使能了缓存。

#3:不使用DSPLINK,不用ARM,只使用DSP,单独写个工程来做CODEC直通,我发现这个是好的,可以通过耳机听到正常的声音。在这个工程中data和code都是映射到L2 RAM的,而上述工程是映射到DDR2的,这两个工程在内存映射上存在区别。

#4:在dsplink通信工程中,在DSP端我自己通过配置寄存器来使用的EDMA,Cache搬运代码段和数据段是不是也要使用EDMA,我不确保我配置的EDMA对系统本身要使用的EDMA没有冲突。

最后:出现上述问题,我只是怀疑是Cache 一致性的问题,导致我耳机听到的都是噪音,因为我实在想不出还有什么其他的原因还能导致这个问题。对于DDR2到L2 的Cache是否需要软件去维护一致性?

 

Tony Tang:

如果怀疑是Cache一致性的问题,在copy前加一个Cache_invalid()操作,这是BIOS的函数。

wei lee1:

回复 Tony Tang:

在拷贝之前我加了BCACHE_inv(&gBufferRcvPing[0],1024,1);,拷贝之后进行了回写BCACHE_wb(&gBufferXmtPing[0],1024,1);但发现没什么效果。

wei lee1:

回复 wei lee1:

我看手册上说,假如CPU更新了L1D的数据,并不立即传送到L2或者DDR2等,而是标记为“dirty”,等有新数据要占用当前的Line的时候才会回写。如果CPU更新后的数据对我是有用的,比如要通过EDMA传送到MCASP,那就应该调用BCACHE_wb()函数了吧?调用BCACHE_wb()函数的时候,数据是不是先从L1D Cache回写到L2 Cache,然后再从L2 Cache回写到DDR2 ?

wei lee1:

回复 wei lee1:

如果我定义一个buffer,前面加上volatile关键字,例如 volaltile  uint32_t  Rcvbuffer[1024];内存映射的时候把这个buffer放到DDR2,是不是CPU每次用到这个buffer的数据时都从DDR2直接读取,这个buffer的数据还会被缓存到 L2 Cache 和L1 D Cache 中吗?

Tony Tang:

回复 wei lee1:

这是两个方面的问题,不要弄混了。一个是针对软件编译的,一个是Cache硬件的机制。

wei lee1:

回复 Tony Tang:

嗯,我刚才看了手册,手册上说即使加了volatile关键字也会被Cache的。手册上举个例子,说对于一些特殊的地址需要用户经常去到它的物理地址去读取的,比如FPGA的状态寄存器,要按两步去操作:

#1·:使用volatile关键字,防止编译工具做错误的优化。

#2:配置MARn相应的寄存器,使其所在的内存段不被Cache.

 

wei lee1:

回复 wei lee1:

我现在有个问题,目前我把工程中的代码段、数据段、堆栈都放在了DDR2上,我使用了DSP/BIOS,没有使用CMD文件。

#1:假如我想把定义的一个buffer放到L2 RAM或者DDR2上指定的一段地址,该怎么做呢?

#2:如果代码段、数据段放到DDR2,堆栈能不能放到L2 RAM上呢?(L2 128K作为RAM,另128K作为Cache),堆栈放到L2 RAM上比放到DDR2上是不是效率更高呢?

Tony Tang:

回复 wei lee1:

#1. 另外加一个cmd文件,只需要section部分,把你定义的段指定到BIOS里定义的"memory".

#2. 可以。效率更高。原则是访问频率的放到速度快的地方。

wei lee1:

回复 Tony Tang:

#1:按照你方法在CCS环境下,通过#pragma DATA_SECTION(Rcvbuffer,"my_data_sect");  然后把通过CMD文件,只用section部分把my_data_sect映射到了L2 RAM,但在dsplink的环境下,具体该怎么做呢?

#2:我实验了下,把stack放到L2  RAM 运行也是OK的。

wei lee1:

回复 Tony Tang:

我软件维护了Cache 的一致性,但还是不行,我现在怀疑是不是DDR2的速率太慢,而EDMA 、CPU 直接或间接的都在从DDR2存取数据或指令,总线上肯定有竞争的吧? 而且板子上用了两片CODEC同步工作,采样率16K  2Slot  32bit  ,这样1秒的数据大概是 16k*2*32*2/8=256KB, 但理论上DDR2(工作在150MHZ)应付这些问题应该不是问题的吧?这个我不知道该怎么量化分析,不知道有经验的人怎么看待这个问题?

赞(0)
未经允许不得转载:TI中文支持网 » OMAPL138 EDMA DDR2 L2 Cache一致性问题
分享到: 更多 (0)