2

我使用 arm 代码源 (arm-none-eabi-gcc) 编译了我的代码(我认为是精简版)。

我在函数中定义了一个结构变量,然后做一个 memcpy

typedef struct  {
  char        src[6];           
  char        dst[6];          
  uint16_t    a;          
  uint16_t    b;    
  uint32_t    c;       
  uint16_t    d;       
} Info_t;

Info_t Info;

    memcpy(Info.src, src, sizeof(Info.src));
    memcpy(Info.dst, dst, sizeof(Info.dst));

第一个 memcpy 通过,但第二个导致中止。

我听说 gcc 优化了 memcpy 并导致非对齐的结构访问?

我尝试将 struct 变量与单词边界等对齐。但它不起作用。

谁能提供有关 gcc 的 memcpy 和对齐问题的更多详细信息。

谢谢!

4

1 回答 1

2

据我了解,ARM 中的 memcopy() 问题与编译器对优化实现的使用有关。

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

  • __aeabi_memcpy

此函数与 ANSI C memcpy 相同,只是返回值为 void。

  • __aeabi_memcpy4

该功能与__aeabi_memcpy 相同;但可以假设指针是 4 字节对齐的。

  • __aeabi_memcpy8

此函数与 __aeabi_memcpy 相同,但可能假定指针是 8 字节对齐的。”

详细信息可以在这里找到: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ ka3934.html

于 2012-05-18T21:33:28.993 回答