你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
scfor123456 提问时间:2019-9-2 12:48 /
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);
}
}

收藏 评论10 发布时间:2019-9-2 12:48

举报

10个回答
DavidTan 回答时间: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[0],&gSendToFunctionDataBuff[0],200);
memcpy(&gSendToMotor2MsDataBuff[0],&gSendToMotorDataBuff1[0],200);
C标准库里的函数一般都有编译器优化,效率不会低
scfor123456 回答时间:2019-9-2 14:16:00
哀歌与世无争 发表于 2019-9-2 13:46
两个函数里移动位数搞错了
这里是右移8位不是16
*dest++ = (uint8_t)(((*src++)&0xff00)>>16);

memcpy()不是只能8位数据拷贝吗?
DavidTan 回答时间: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] 在内存里是200个字节的一段连续内存数据,而uint16_t类型是两个字节,uint16_t  gSendToFunctionDataBuff[100],其实也是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[0],&gSendToMotorDataBuff1[0],95);
用这个没问题,
memcpy(&gSendToMotor2MsDataBuff[0],&gSendToMotorDataBuff1[0],182);
用这个跳HardFault_Handler,我两个数组一个是100字,一个是200字节,咋报错?
哀歌与世无争 回答时间:2019-9-2 21:01:53
scfor123456 发表于 2019-9-2 16:14
memcpy(&gSendToMotor2MsDataBuff[0],&gSendToMotorDataBuff1[0],95);
用这个没问题,
memcpy(&gSendToMoto ...

最好检查一下其他部分的代码,因为试了一下copy_Data1和copy_Data2只是位移不对,导致拷贝数据值不对,但是不会进hardfault的,memcpy也不会,其他地方可能还有问题。
最好单步调试一下,定位执行哪一步的时候才进的hardfault
scfor123456 回答时间:2019-9-3 14:35:12
哀歌与世无争 发表于 2019-9-2 21:01
最好检查一下其他部分的代码,因为试了一下copy_Data1和copy_Data2只是位移不对,导致拷贝数据值不对,但 ...

不用memcpy()了,自己写了个

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版