memcpy的海合会代码的Sourcery为ARM(memcpy on gcc code sourc

2019-09-17 07:53发布

我一直在使用ARM代码的Sourcery(臂无 - EABI - 海合会)(我想精简版版)我的代码编译。

我定义一个函数内部结构变量,做像的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,并导致一个非对齐结构接取?

我试过结构变量对准一个单词边界等,但没有奏效。

任何人都可以给gcc和对齐问题的memcpy的更多细节。

谢谢!

Answer 1:

在ARM的存储器复制()问题与由编译器使用优化的实施,据我理解有关。

“在许多情况下,编译调用时memcpy的(),在ARM C编译器将生成专门的优化,库函数,而不是调用。自RVCT 2.1,这些专业的功能是ABI的ARM架构(AEABI)的一部分,包括:

  • __aeabi_memcpy

此功能是一样的ANSI C的memcpy,除了返回值是无效的。

  • __aeabi_memcpy4

此功能是一样的__aeabi_memcpy; 但可以假设指针是对准的4个字节。

  • __aeabi_memcpy8

此功能是一样的,但__aeabi_memcpy可以假定的指针8字节对齐“。

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



文章来源: memcpy on gcc code sourcery for ARM