scfor123456 发表于 2019-9-2 12:48:41

这段数据拷贝加上了跳HardFault_Handler,看不出问题在哪

uint8_t gSendToMotorDataBuff1;
uint8_t gSendToFunctionDataBuff1;

uint16_tgSendToFunctionDataBuff;
uint16_tgSendToMotor2MsDataBuff;


copy_Data1(&gSendToFunctionDataBuff1,&gSendToFunctionDataBuff,95);
copy_Data2(&gSendToMotor2MsDataBuff,&gSendToMotorDataBuff1,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);
}
}

tgw860910 发表于 2019-9-2 13:37:02

读地址不能读奇数

发表于 2019-9-2 13:41:56

从代码上看没有什么问题,楼主,您再仿真模式下,进入hardfault后,通过查看代码看一下,是哪个函数产生的。一般是因为超出数组区空间导致。把数组定义大一些试试。可能是指针上的使用。另外入口时,如果时数组的。不用取地址,直接把数组放入接口即可。
copy_Data1(gSendToFunctionDataBuff1,gSendToFunctionDataBuff,95);

哀歌与世无争 发表于 2019-9-2 13:46:18

两个函数里移动位数搞错了
这里是右移8位不是16
*dest++ = (uint8_t)(((*src++)&0xff00)>>16);
这里是左移8位
*dest++ = (Uint16)tmp1 + ((Uint16)tmp2<<16);

而且你实现的内存拷贝是低字节在前,刚好stm32也是小端模式,所以直接用C标准头文件string.h里的
memcpy函数就能实现,没必要自己写,像这样
memcpy(&gSendToFunctionDataBuff1,&gSendToFunctionDataBuff,200);
memcpy(&gSendToMotor2MsDataBuff,&gSendToMotorDataBuff1,200);
C标准库里的函数一般都有编译器优化,效率不会低

scfor123456 发表于 2019-9-2 14:16:00

哀歌与世无争 发表于 2019-9-2 13:46
两个函数里移动位数搞错了
这里是右移8位不是16
*dest++ = (uint8_t)(((*src++)&0xff00)>>16);


memcpy()不是只能8位数据拷贝吗?

tgw860910 发表于 2019-9-2 14:22:09

tmp1 = *src++;
tmp2 = *src++;

应该是这里出问题了,读内存地址不能读奇数地址,否则会异常的,你试试改一下

哀歌与世无争 发表于 2019-9-2 14:33:58

scfor123456 发表于 2019-9-2 14:16
memcpy()不是只能8位数据拷贝吗?
不是哦,函数输入参数void *指针,所以任何类型的数据都能拷贝,只是长度是按字节个数来算的。
uint8_t gSendToFunctionDataBuff1 在内存里是200个字节的一段连续内存数据,而uint16_t类型是两个字节,uint16_tgSendToFunctionDataBuff,其实也是2*100个字节的一段连续内存数据,而且小端模式,所以低字节在前,相互拷贝完全没有问题。

scfor123456 发表于 2019-9-2 15:09:00

哀歌与世无争 发表于 2019-9-2 14:33
不是哦,函数输入参数void *指针,所以任何类型的数据都能拷贝,只是长度是按字节个数来算的。
uint8_t gS ...

我先试下

scfor123456 发表于 2019-9-2 16:14:39

memcpy(&gSendToMotor2MsDataBuff,&gSendToMotorDataBuff1,95);
用这个没问题,
memcpy(&gSendToMotor2MsDataBuff,&gSendToMotorDataBuff1,182);
用这个跳HardFault_Handler,我两个数组一个是100字,一个是200字节,咋报错?

哀歌与世无争 发表于 2019-9-2 21:01:53

scfor123456 发表于 2019-9-2 16:14
memcpy(&gSendToMotor2MsDataBuff,&gSendToMotorDataBuff1,95);
用这个没问题,
memcpy(&gSendToMoto ...

最好检查一下其他部分的代码,因为试了一下copy_Data1和copy_Data2只是位移不对,导致拷贝数据值不对,但是不会进hardfault的,memcpy也不会,其他地方可能还有问题。
最好单步调试一下,定位执行哪一步的时候才进的hardfault
页: [1] 2
查看完整版本: 这段数据拷贝加上了跳HardFault_Handler,看不出问题在哪