各位大侠:
正在调试的工程里有一段是将64*640*8B的数据用edma3从ddr3的地址0x90000000搬移到msmc中,有一个奇怪的现象:
如果msmc中的目的地址是0x0c100000和0x0c300000的话,数据全部正确。而如果msmc中的目的地址是0x0c000000和0x0c200000的话数据有错误,还不是全都错,是一段错一段对,太奇怪了。
另外在edma3之后我用 CACHE_wbL1d ((void *)msmc中的目的地址, 64*640*2*sizeof(float)), CACHE_FENCE_WAIT); 将其writeback了。
CACHE_wbL2 ((void *)msmc中的目的地址, 64*640*2*((float)), CACHE_FENCE_WAIT)
是在6678le开发板上跑的,加载的是evmc6678l.gel。
请教各位专家!
Andy Yin1:
你的memory是咋分配的,有没有可能是一块memory同时存放多种数据呢。
对于cache一致性的维护,需要对源地址在搬移之前使用cacche write back,对目的地址则在搬数之前进行cache invalid。
把你的map文件及代码发上来看看,SL2的有效地址范围是0x0c000000~0x0c1FFFFF总共2MB的空间。
kai guo:
回复 Andy Yin1:
To Andy Yin1:
1. 没有一块memory同时存放多种数据
2.对于cache一致性的维护,我理解是要读一个地址前先要cache invalid以读到真实的。写一个数到地址中,写完要cacche write back,确保真的写进去而不是写到cacche里,对吗?
3.请问你说的map文件是不是设置cache的方式,我设置的是L1d,L1p全cache,L2为sram,SL2和ddr3为sram。另外SL2不是0x0c000000~0x0c3FFFFF共4MB吗?
Andy Yin1:
回复 kai guo:
关于cache一致性维护,读的时候不需要invalid;如果是Core去写,则在写完之后write back;如果是其他的如EDMA写则在启动EDMA之前可以对数据进行invalid,这样可以避免core往外刷cache把EDMA写的数据覆盖。
map是编译之后生成的文件,存放在工程debug目录下。6678的SL2是4MB.
kai guo:
回复 Andy Yin1:
to Andy Yin1:
问题解决,我之前在启动EDMA之前对数据进行invalid,进行invalidL1D和invalidL2,现在把invalidL1D去掉,仅仅invalidL2后数据正常了。
貌似invalidL1D只针对L2,而invalidL2针对SL2.
还有两个问题:1.文档好像写着invalidL2一次最多256kB,但我一次invalidL2大于256kB好像也正常。
2.现在我的应用要求多个core同时用EDMA Controller 0来从ddr3不同地址搬移数据到SL2的不同地址,不知可行否?
kai guo:
回复 Andy Yin1:
to Andy Yin1:
我是对目的地址invalid。
再问个问题:如果我的L1d配置成全部32Kcache,L2配置成全部512K都是SRAM,那么对于操作L2、SL2和DDR3中的数据只需要维护对应的L1d的一致性了,对吗?
谢谢!