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

C6678的Cache维护的一些原则讨论

请教:

         在当前基于C6678的大型项目开发中,在cache的维护上遇到了一些问题,为此希望建立一些基本的维护规则。在应用中,变量可以认为有以下3种:仅核自身用到的变量;多核共享的标志变量(用于核间传递信息);核与外设交互的数据。cache只使用L1D,L2不作cache用。

         考虑采用下述原则:

         1、核自身用到的变量,定义于L2上,并不作任何一致性维护;

          2、多核交互变量,定义于共享内存,任何核写入后均立刻writeback,读出前Invalid;变量定义全部对齐到cache line大小(以避免对一个变量的回写和无效影响其它变量)

          3、核与外设交互的数据,当其定义于L2或MSMC上时,分别参照第1条和第2条。

          根据大家的开发经验,这些原则是否正确和全面?希望有开发经验的同学能分享经验。

Allen35065:

原则上没有问题,在C6678上请关闭MSMC的Prefetch,详见C6678 silicon errata Advisory 28.

如果在刷Cache时使用mfence指令,一个mfence是不可靠的,需要用连续两个,详见 Advisory 27.

ZQ:

回复 Allen35065:

Allen Yin 您好!

          最近在C6678上遇到cache的问题,我使用DMA将数据从cache非使能区拷贝到cache使能区(先无效化cache),在cache使能区计算完毕后又把结果存放到cache非使能区(先回写cache),DMA操作遵循cache维护一致性,但是还是偶尔出现了cache导致的数据错误,请问跟你说的这两个勘误有关吗?(Advisory 27和Advisory 28)

另外,csl库里cache回写的函数最后会有一个mfence操作的语句,你的意思是这个函数是不可靠的?需要再加一个mfence语句??

YUCHAO WANG:

回复 ZQ:

建议你使用keystone库里的writebackcache和invalidcache代码吧,CSL代码有些确实不可靠

Allen35065:

回复 ZQ:

s是这样的,必须连续调用两次mfence才能有效,一个mfence可能会出问题。

ZQ:

回复 Allen35065:

好的,谢谢回复,我也的确看到一些例程里在cache操作的函数后又调用了如下语句:
CSL_XMC_invalidatePrefetchBuffer();
_mfence();
_mfence();
就是对应你说的那两个勘误信息。
另外我想确认我如下做法是否正确可靠???????
前提:L1cache 32kL2 cache256k
无效化cache调用CACHE_invL1d()以及上面三条语句+CACHE_invL2()以及上面三条语句
回写cache同上手机写的排版可能有些奇怪,请见谅,谢谢关注!

Allen35065:

回复 ZQ:

是的;

cache回写应该调用writeback或者invalidatewriteback;invalidate只做无效化。

6678最好关闭MSMC的prefetch buffer防止数据错误,这一点就是在Advisory 28里提到的。

ZQ:

回复 Allen35065:

好的,非常感谢!

xinxin lai:

你好 ,请问多核共享的标志变量你是怎么做的,我现在也在用这个,但是不是很理解,你能具体说下吗,还有那些cache的函数在那个文件,谢谢

Zhan Xiang:

回复 xinxin lai:

建议新开一个帖子提问题,把这个帖子的链接贴到新帖里提问。

多核共享标志变量就是把全局变量通过cmd文件指定到DDR或SL2中的特定位置,所有core都能访问该共享内存。cache的函数在csl_cacheAux.h

Gangping Li:

回复 Zhan Xiang:

zhan xiang 你好!我觉得基于sys/bios的工程使用CMD比较麻烦,容易与CFG文件相冲突;请问针对基于sys/bios的工程如何去把全局变量定义到共享内存中呢?谢谢你

赞(0)
未经允许不得转载:TI中文支持网 » C6678的Cache维护的一些原则讨论
分享到: 更多 (0)