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

读写eCAN的RAM时,不能使用memcpy

在28335上,把eCAN的mailbox当做普通RAM来用。

直接对地址进行读写很正常,使用memcpy拷贝一个字节也没问题,但是如果长度大于两个写入不成功,会把ram全部清零。

代码如下:

int* from=(int*)0x6240;

int* des =(int*)0x6300;

// 直接写地址,没有问题

*(Uint16*)(0x6240) = 0x00;

*(Uint16*)(0x6241) = 0x11;

*(Uint16*)(0x6242) = 0x22;

*(Uint16*)(0x6300) = 0xAB;

*(Uint16*)(0x6301) = 0xCD;

*(Uint16*)(0x6302) = 0xEF;

memcpy(des, from,1);  // 只拷贝一次也正常

   MOV   @AL,*(0:0x6240)

   MOV   *(0:0x6300),@AL

   memcpy(des, from,3); // 拷贝多个使目标地址清零

   MOVL   XAR4,#0x006300

   MOVL   XAR7,#0x006240

   RPT    #2

||  PREAD  *XAR4++,*XAR7

请高手帮忙解答下这是怎么回事?谢谢!

Johnson Chen1:

楼主说的RAM全部清零是指CAN mailbox部分呢?还是指所用的RAM?楼主有使用eCAN模块吗?

可以的话,将你的项目打包贴上来看一下。

在28335上,把eCAN的mailbox当做普通RAM来用。

直接对地址进行读写很正常,使用memcpy拷贝一个字节也没问题,但是如果长度大于两个写入不成功,会把ram全部清零。

代码如下:

int* from=(int*)0x6240;

int* des =(int*)0x6300;

// 直接写地址,没有问题

*(Uint16*)(0x6240) = 0x00;

*(Uint16*)(0x6241) = 0x11;

*(Uint16*)(0x6242) = 0x22;

*(Uint16*)(0x6300) = 0xAB;

*(Uint16*)(0x6301) = 0xCD;

*(Uint16*)(0x6302) = 0xEF;

memcpy(des, from,1);  // 只拷贝一次也正常

   MOV   @AL,*(0:0x6240)

   MOV   *(0:0x6300),@AL

   memcpy(des, from,3); // 拷贝多个使目标地址清零

   MOVL   XAR4,#0x006300

   MOVL   XAR7,#0x006240

   RPT    #2

||  PREAD  *XAR4++,*XAR7

请高手帮忙解答下这是怎么回事?谢谢!

meng wu:

回复 Johnson Chen1:

就是打算写入的那个区域被清零了。当然这些区域现在就是处于mailbox里。

我的eCAN没有使用,mailbox在使能寄存器里面也是被禁用的。

这部分与其他部分无关,我把这部分代码放在main函数里面测试就这结果。

在28335上,把eCAN的mailbox当做普通RAM来用。

直接对地址进行读写很正常,使用memcpy拷贝一个字节也没问题,但是如果长度大于两个写入不成功,会把ram全部清零。

代码如下:

int* from=(int*)0x6240;

int* des =(int*)0x6300;

// 直接写地址,没有问题

*(Uint16*)(0x6240) = 0x00;

*(Uint16*)(0x6241) = 0x11;

*(Uint16*)(0x6242) = 0x22;

*(Uint16*)(0x6300) = 0xAB;

*(Uint16*)(0x6301) = 0xCD;

*(Uint16*)(0x6302) = 0xEF;

memcpy(des, from,1);  // 只拷贝一次也正常

   MOV   @AL,*(0:0x6240)

   MOV   *(0:0x6300),@AL

   memcpy(des, from,3); // 拷贝多个使目标地址清零

   MOVL   XAR4,#0x006300

   MOVL   XAR7,#0x006240

   RPT    #2

||  PREAD  *XAR4++,*XAR7

请高手帮忙解答下这是怎么回事?谢谢!

meng wu:

回复 Johnson Chen1:

谢谢。。

这算是一个bug吗? 更具体的原因就无从得知了是吧?

在28335上,把eCAN的mailbox当做普通RAM来用。

直接对地址进行读写很正常,使用memcpy拷贝一个字节也没问题,但是如果长度大于两个写入不成功,会把ram全部清零。

代码如下:

int* from=(int*)0x6240;

int* des =(int*)0x6300;

// 直接写地址,没有问题

*(Uint16*)(0x6240) = 0x00;

*(Uint16*)(0x6241) = 0x11;

*(Uint16*)(0x6242) = 0x22;

*(Uint16*)(0x6300) = 0xAB;

*(Uint16*)(0x6301) = 0xCD;

*(Uint16*)(0x6302) = 0xEF;

memcpy(des, from,1);  // 只拷贝一次也正常

   MOV   @AL,*(0:0x6240)

   MOV   *(0:0x6300),@AL

   memcpy(des, from,3); // 拷贝多个使目标地址清零

   MOVL   XAR4,#0x006300

   MOVL   XAR7,#0x006240

   RPT    #2

||  PREAD  *XAR4++,*XAR7

请高手帮忙解答下这是怎么回事?谢谢!

10#:

回复 meng wu:

不能说是bug,你可以比较分别使用这两个函数时生成的汇编代码,应该能发现点什么。

赞(0)
未经允许不得转载:TI中文支持网 » 读写eCAN的RAM时,不能使用memcpy
分享到: 更多 (0)