在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,你可以比较分别使用这两个函数时生成的汇编代码,应该能发现点什么。