TI论坛
直播中

郭静

7年用户 202经验值
私信 关注
[问答]

读写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
请高手帮忙解答下这是怎么回事?谢谢!

回帖(6)

李晶

2018-10-29 10:51:47
楼主说的RAM全部清零是指CAN mailbox部分呢?还是指所用的RAM?楼主有使用eCAN模块吗?
可以的话,将你的项目打包贴上来看一下。
举报

郭静

2018-10-29 11:02:53
引用: Ehunt 发表于 2018-10-29 18:31
楼主说的RAM全部清零是指CAN mailbox部分呢?还是指所用的RAM?楼主有使用eCAN模块吗?
可以的话,将你的项目打包贴上来看一下。

就是打算写入的那个区域被清零了。当然这些区域现在就是处于mailbox里。
我的eCAN没有使用,mailbox在使能寄存器里面也是被禁用的。
这部分与其他部分无关,我把这部分代码放在main函数里面测试就这结果。
举报

李晶

2018-10-29 11:17:18
引用: 韩程瑞1 发表于 2018-10-29 18:42
就是打算写入的那个区域被清零了。当然这些区域现在就是处于mailbox里。
我的eCAN没有使用,mailbox在使能寄存器里面也是被禁用的。
这部分与其他部分无关,我把这部分代码放在main函数里面测试就这结果。

楼主你好!
按你的描述测了一下,确实使用memcpy后会将操作的相应的mailbox RAM地址清零。其实写一个字节也会出问题,只是因为你写的是0,所以看不出来,以为写成功了。
我试了一下用下面的方法来做,搬20字也没有问题,而MemCopy()函数在附件中有。
Uint16* from=(Uint16*)0x6240;
Uint16* des=(Uint16*)0x6300;
MemCopy(from, from+20,des1);
举报

郭静

2018-10-29 11:35:21
引用: Ehunt 发表于 2018-10-29 18:56
楼主你好!
按你的描述测了一下,确实使用memcpy后会将操作的相应的mailbox RAM地址清零。其实写一个字节也会出问题,只是因为你写的是0,所以看不出来,以为写成功了。
我试了一下用下面的方法来做,搬20字也没有问题,而MemCopy()函数在附件中有。

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

更多回帖

发帖
×
20
完善资料,
赚取积分