大家好!
6678 & ccs5.3
有如下代码:
Program.sectMap[".my_sec"] = new Program.SectionSpec();
Program.sectMap[".my_sec"].fill = 0x00000000;
Program.sectMap[".my_sec"].loadSegment = "DDR3";
#pragma DATA_SECTION (test, ".my_sec");
unsigned char test[30];
{
unsigned char* lvDataTbl ;
。。。
(1)memcpy(test,"fdasfasf",sizeof(test))
char temp[3] = 0;
(2)memcpy(temp,lvDataTbl,sizeof(char)*3);
if(!test)
printf("test is NULL\n");
else
(2)memcpy(test+lvJobIdx*3,lvDataTbl,sizeof(char)*3);
}
括号中的这段代码是八个核并行跑的。其中每个lvDataTbl是一个三个字符组,abc、def、ghi,一次类推,共八个,每核一个,lvJobIdx是0-7的数字对应每个核。
我的问题是,(1)处的拷贝,test的输出显示拷贝成功。(2)处的拷贝,temp输出显示拷贝也成功。但是就是在(3)处,从lvDataTbl每三个向test的对应位置拷贝却不成功,输出test是空。我输出lvDataTbl和lvJobIdx的值都是正确的。
请问是哪里出了错,求解!
谢谢!
Andy Yin1:
单步调测一下看看memcpy(test+lvJobIdx*3,lvDataTbl,sizeof(char)*3);是否有执行,其中的源和目的地址是否正确。
ruijie yang:
回复 Andy Yin1:
谢谢Andy!
我单步调试了一下。我通过Expressions窗口观察了一下,memcpy有执行,源核目的地址都正确,且tr(抱歉换了个名字,之前帖子写的名字是test,是同一个变量)确实在DDR3中,应该是共享的。但是当我依次让core0、core1执行一步memcpy之后,发现它们各自的tr只有它们各自执行的memcpy的内容,而其他核拷贝的内容并没有共享。而由于最终输出tr的是core0,且core0并不一定拷贝的是abc前三个字符,因此以%s的方式输出的时候,要么只有abc要么输出为空。
下面依次是core0执行memcpy和core1执行memcpy之后的变量值:
请问:
相同的tr地址,里面的数据却没有共享,这是为什么呢,求解!
谢谢!
Andy Yin1:
回复 ruijie yang:
可能跟cache有关,每个core都向共享memory相应地址copy数据,但是由于没有write back cache,导致其他master看不到更新的数据。由于L1 cache需要64B对齐,像你这种使用的方法进行刷cache的话可能还会导致数据被覆盖,所以如果一定要这样用的话可以将这段memory属性定义为noncacheable。