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

这段数据拷贝加上了跳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个回答
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[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位数据拷贝吗?
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] 在内存里是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
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版