使用CCS5调试C6678多核DSP时,使用cache,当多个核对同一片存储空间进行访问时,cache将数据写回的时机是程序员编程控制的,这样可以保证不同核在操作同一片数据时的正确性。但是在调试时,从不同的核看同一片存储区域,假设这片区域已经被多个核的cache读走并做了更改且还未写回到存储区域,这个时候查看这片地址,我看到的是原始数据还是被某个核修改过的数据?
chang liu1:
回复 yang cao1:
也就是说,勾选memory里的L1D,L2时,trace结构会从各个核自己的cache里读数据显示出来,如果勾选了的话,就是把ddr里面的数据显示出来,调试过程不会破坏ddr原来的数据内容是这样吗?
yang cao1:
memory本来就只是显示,勾谁就显示谁,又不会对ddr或者cache进行操作。至于ddr里面的数据如果cache满了也会自动写回的,如果cache足够大,那么ddr里面的数据在写会之前是不会变的。
ziye:
回复 yang cao1:
您好!请问我这里不同的核都需要频繁地读写DDR的数据,为了保证读到正确的数据,是不是就得把cache设置得很小,以便及时改变DDR数据呢?希望得到您的解答,谢谢!
Andy Yin1:
回复 ziye:
对C66 DSP,对于共享memory如果相应的MAR寄存器cache属性使能,如果多个master去访问这块memory,就必须软件维护cache一致性,与cache大小无关,cache大小会影响miss、hit概率,从而影响程序运行的性能。
ziye:
回复 Andy Yin1:
明白了,多谢Andy的解答!
user1746900:
回复 Andy Yin1:
Andy 您好!
您说的相应的MAR寄存器cache属性使能,在哪里看到还是要编写者自己设置的?另外DDR也算共享memory吧? 比如,那我核1上想得到核0上在ddr里存放的一段数据,我先把核0上这段数据的首地址传到核1,然后从这个地址去把数据读出来使用,这个cache一致性该怎么去维护啊???
期待您的回答,谢谢。
yang cao1:
回复 user1746900:
mar在6678的数据手册上有,ddr的第一块16mb地址对应的好像128,CACHE_enableCaching (128) 就是使能首地址为0x80000000的16Mb的地址的cache属性。共享的话,在核0把数据写回,即把cache里的数据写回到ddr里面,用cache_wb()函数,而在核1里面把cache里的数据丢弃,cache_inv(),cache里面原来对应于ddr的数据是旧的数据,无效以后,下次核1要使用ddr里对应的数据,cache就会重新读取ddr里面更新了的数据。
user1746900:
回复 yang cao1:
谢谢您的回答!
我是这样操作的,在核0上CACHE_wbL1d();
在核1上CACHE_invL1d();
这两个核第一个核跑得是BIOS,核1跑得是正常的配.cmd工程,这两个工程我都没开L2cache,核1上读出来的结果不对,
然后我就分别在前面加了CACHE_wbL2(); 核1:CACHE_invL2().可是结果还是不对,,不知为什么?
PS::另一个问题,像上面的函数,我能不能直接换成CACHE_wbAllL1d()核CACHE_invAllL1d()这样的,应该不会有影响吧?
Enoeht lea:
回复 user1746900:
没用L2 cache,为啥要加CACHE_wbL2( ),用CACHE_wbL1就可以了。