首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memcpy()崩溃Cortex M4

memcpy()崩溃Cortex M4
EN

Stack Overflow用户
提问于 2018-08-14 11:26:52
回答 1查看 1.2K关注 0票数 0

我正在为STM32F4控制器(Cortex M4)开发一些软件。前几天,我正在将我的代码移植到一个新的HW平台上,在“for STM32”IDE中创建一个新项目。

当我试图运行这个新项目时,我发现memcpy()导致了一个UsageFault,这是由32位宽的Load/Store访问一个不均匀的地址引起的。

然后,我发现旧的工作代码已经与"-specs=nano“链接,而崩溃代码却没有,所以问题可以很容易地解决。我检查了memcpy()的反汇编,发现Nano库实际上有一个与标准(?)非常不同的实现。libc.

尽管如此,我还是很困惑!为什么memcpy()的实现不支持字节对齐地址?这将是一个相当微不足道的错误。一定还有更多吗!有人知道吗?

EN

回答 1

Stack Overflow用户

发布于 2018-08-14 14:45:35

当我试图运行这个新项目时,我发现memcpy()导致了一个UsageFault,这是由32位宽的Load/Store访问一个不均匀的地址引起的。

您确定这是32位访问,而不是64位访问(LDRD/STRD指令)吗?前者不应该崩溃在一个皮质-M4在任何情况下,除非单片机明确设置这样做。

所有Armv7-M (包括每个Cortex-M但Cortex-M0)都支持具有奇数内存地址的LDR和STR指令。默认情况下,只有64位变体LDRD/STRD在失调时崩溃。

不幸的是,当-M4F错误对齐时,FPU加载和存储也会崩溃。这让我在移植旧的8位的东西时得到了几次。

为什么memcpy()的实现不支持字节对齐地址?

现代GCC可以使用内置的memcpy(),特别是当有固定的传输大小和指向大于一个字节的类型的指针时(例如uint32_t*float*)。Nano memcpy()是一个最小的实现,可以缓慢地逐字节复制.

还可以尝试将指针转换回字节大小的类型:

代码语言:javascript
复制
uint32_t *pa,*pb;
memcpy((uint8_t*)pa,(uint8_t*)pb, MEMCPY_SIZE);

这应该提示编译器不要使用对齐敏感的内置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51840342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档