首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARMCC: memcpy (对齐异常)的问题

ARMCC: memcpy (对齐异常)的问题
EN

Stack Overflow用户
提问于 2014-07-22 09:18:08
回答 2查看 7.1K关注 0票数 9

我正在移植一些软件从gcc工具链到武器-工具链(处理器保持不变(Cortex-A9))。在C代码中使用memcpy。armcc通过调用__aeabi_memcpy替换对memcpy的调用。常见问题是关于__aeabi_memcpy (ARM编译器如何处理memcpy()?)的以下内容:

在许多情况下,当编译对memcpy()的调用时,ARM C编译器将生成对专用、优化的库函数的调用。自从RVCT 2.1以来,这些专门的功能是ARM体系结构(AEABI) ABI的一部分,包括:

代码语言:javascript
复制
__aeabi_memcpy
This function is the same as ANSI C memcpy, except that the return value is void.

但是与gcc不同的是,在我的所有情况下,调用memcpy都很好,而armcc --对memcpy的调用--对memcpy的调用不断地产生对齐异常。同时,我发现,对memcpy的调用可以处理源地址和目标地址不对齐的调用,但前提是它们都不是对4字节的。例如:

代码语言:javascript
复制
    volatile uint32_t len = 10;
    uint8_t* src = (uint8_t*)0x06000002;         // 2-byte aligned
    uint8_t* dst = (uint8_t*)(0x06000002 + 20);  // 2-byte aligned
    memcpy(dst, src, len);

会起作用的。但例如:

代码语言:javascript
复制
    volatile uint32_t len = 10;
    uint8_t* src = (uint8_t*)0x06000002;         // 2-byte aligned
    uint8_t* dst = (uint8_t*)(0x06000002 + 22);  // 4-byte aligned
    memcpy(dst, src, len);

将导致对齐异常。SInce我使用的是uint8_t*类型的指针,我显式地告诉编译器地址可以有任何对齐。但是很明显,这个__aeabi_memcpy不能处理所有对齐的组合。我如何解决这个问题(最好不要用特定于用户的memcpy版本更改现有代码中对memcpy的所有调用)?谢谢你帮忙。

EN

回答 2

Stack Overflow用户

发布于 2014-07-22 09:34:56

如果您不想更改代码,下面有两个选项:

1)禁用皮质上的未对齐异常-A9。这完全解决了问题,但可能会影响性能。

2)对图书馆进行整理。您可以在链接的lib文件中重命名符号__aeabi_memcpy。然后,您可以实现您自己的__aeabi_memcpy,它检测对齐错误,使用专门的例程处理它,或者跳转到原始的memcpy函数。如果您使用的是linux,您甚至不需要重命名该符号。链接器允许您重写函数。

这两种解决方案都有点脏,但如果您不想更改代码,这就是我所能考虑的全部。

哦,你应该提交一份错误报告。你所看到的行为肯定是个错误。Memcpy对任何对齐都应该很好。

票数 0
EN

Stack Overflow用户

发布于 2014-11-03 11:04:35

也许这仍然有帮助: ARM编译器armcc应该有一个选项,您可以用它告诉编译器不要做未对齐的访问,也不要使用内置的库来实现这一点:

--no_unaligned_access

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472k/chr1359124947629.html

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

https://stackoverflow.com/questions/24883410

复制
相关文章

相似问题

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