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

memcpy失败

大家好!

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。

赞(0)
未经允许不得转载:TI中文支持网 » memcpy失败
分享到: 更多 (0)