问题是这样的:核0和核1通信,在MSMC上定义了一段内存区,用于存放核间共享的数据,每次将数据copy到内存区之后使用notify通知另外一个核去读取,数据长度大概1400Byte,数据内容中特定字段包含了包序号,接收端使用读取数据并检查连续的两包数据包序号是否连续,测试结果发现出现1/10000的概率的包序号重复,重复的两包刚好是丢了中间一包,现象看似发送端没有将数据copy到共享内存区,但实际copy成功了,目前不知道如何解决,急求解答!
另外,系统只使用了L1D(L2 cache size 为0),从之前的帖子看说是MSMC需要关闭prefetch,使用下面的代码应该是关闭了吧
void Osal_InvalidCache(void * blockPtr, Uint32 byteCnt)
{
if(byteCnt>0xFFFF*4)
byteCnt= 0xFFFF*4;
if((Uint32)blockPtr>=0x0C000000&&(Uint32)blockPtr<0x0D000000) //SL2
{
CACHE_invL1d((void *)blockPtr, byteCnt, CACHE_WAIT);
CSL_XMC_invalidatePrefetchBuffer();
}
else if((Uint32)blockPtr>=0x10000000) //DDR or other cores
{
CACHE_invL2((void *)blockPtr, byteCnt, CACHE_WAIT);
CSL_XMC_invalidatePrefetchBuffer();
}
_mfence();
_mfence();
}
请问这可能是什么问题?急需各位大神帮助
Xiaohua Cao:
缓存的一致性维护从一开始就做了,应该不会是缓存维护的问题吧
Thomas Yang1:
回复 Xiaohua Cao:
应该是notify和copy之间的timing优化问题,请问您的notify是怎么实现的,接收侧是在中断中去读取copy的帧号码的吗
Xiaohua Cao:
回复 Thomas Yang1:
使用NotifySendEvent发送一个事件,接收端在中断中去读取共享内存区的数据