我正在为STM32F4控制器(Cortex M4)开发一些软件。前几天,我正在将我的代码移植到一个新的HW平台上,在“for STM32”IDE中创建一个新项目。
当我试图运行这个新项目时,我发现memcpy()导致了一个UsageFault,这是由32位宽的Load/Store访问一个不均匀的地址引起的。
然后,我发现旧的工作代码已经与"-specs=nano“链接,而崩溃代码却没有,所以问题可以很容易地解决。我检查了memcpy()的反汇编,发现Nano库实际上有一个与标准(?)非常不同的实现。libc.
尽管如此,我还是很困惑!为什么memcpy()的实现不支持字节对齐地址?这将是一个相当微不足道的错误。一定还有更多吗!有人知道吗?
发布于 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()是一个最小的实现,可以缓慢地逐字节复制.
还可以尝试将指针转换回字节大小的类型:
uint32_t *pa,*pb;
memcpy((uint8_t*)pa,(uint8_t*)pb, MEMCPY_SIZE);这应该提示编译器不要使用对齐敏感的内置。
https://stackoverflow.com/questions/51840342
复制相似问题