uint8_t gSendToMotorDataBuff1[200]; uint8_t gSendToFunctionDataBuff1[200]; uint16_t gSendToFunctionDataBuff[100]; uint16_t gSendToMotor2MsDataBuff[100]; copy_Data1(&gSendToFunctionDataBuff1[0],&gSendToFunctionDataBuff[0],95); copy_Data2(&gSendToMotor2MsDataBuff[0],&gSendToMotorDataBuff1[0],95); //16位数据区拷贝到8位数据区 void copy_Data1(uint8_t *dest,Uint16 *src,uint16_t num) { while(num--) { *dest++ = (uint8_t)((*src)&0x00ff); *dest++ = (uint8_t)(((*src++)&0xff00)>>16); } } //8位数据区拷贝到16位数据区 void copy_Data2(Uint16 *dest,uint8_t *src,uint16_t num) { uint8_t tmp1,tmp2; while(num--) { tmp1 = *src++; tmp2 = *src++; *dest++ = (Uint16)tmp1 + ((Uint16)tmp2<<16); } } |
copy_Data1(gSendToFunctionDataBuff1,gSendToFunctionDataBuff,95);
这里是右移8位不是16
*dest++ = (uint8_t)(((*src++)&0xff00)>>16);
这里是左移8位
*dest++ = (Uint16)tmp1 + ((Uint16)tmp2<<16);
而且你实现的内存拷贝是低字节在前,刚好stm32也是小端模式,所以直接用C标准头文件string.h里的
memcpy函数就能实现,没必要自己写,像这样
memcpy(&gSendToFunctionDataBuff1[0],&gSendToFunctionDataBuff[0],200);
memcpy(&gSendToMotor2MsDataBuff[0],&gSendToMotorDataBuff1[0],200);
C标准库里的函数一般都有编译器优化,效率不会低
memcpy()不是只能8位数据拷贝吗?
tmp2 = *src++;
应该是这里出问题了,读内存地址不能读奇数地址,否则会异常的,你试试改一下
不是哦,函数输入参数void *指针,所以任何类型的数据都能拷贝,只是长度是按字节个数来算的。
uint8_t gSendToFunctionDataBuff1[200] 在内存里是200个字节的一段连续内存数据,而uint16_t类型是两个字节,uint16_t gSendToFunctionDataBuff[100],其实也是2*100个字节的一段连续内存数据,而且小端模式,所以低字节在前,相互拷贝完全没有问题。
我先试下
用这个没问题,
memcpy(&gSendToMotor2MsDataBuff[0],&gSendToMotorDataBuff1[0],182);
用这个跳HardFault_Handler,我两个数组一个是100字,一个是200字节,咋报错?
最好检查一下其他部分的代码,因为试了一下copy_Data1和copy_Data2只是位移不对,导致拷贝数据值不对,但是不会进hardfault的,memcpy也不会,其他地方可能还有问题。
最好单步调试一下,定位执行哪一步的时候才进的hardfault
不用memcpy()了,自己写了个