我的代码使用arm代码源编译(arm-none-eabi-gcc)(我认为精简版)。
我在函数中定义了一个struct变量,并执行了一个像
这样的memcpytypedef 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 acess?
我尝试将struct变量对齐到单词边界等。但它没有用。
任何人都可以提供有关gcc和对齐问题的更多详细信息。
谢谢!
答案 0 :(得分:2)
据我所知,ARM中的memcopy()问题与编译器使用优化实现有关。
“在许多情况下,当编译对memcpy()的调用时,ARM C编译器将生成对专用的,优化的库函数的调用。从RVCT 2.1开始,这些专用函数是ARM体系结构的ABI的一部分(AEABI) ),并包括:
此函数与ANSI C memcpy相同,但返回值为void。
此功能与__aeabi_memcpy相同;但可以假设指针是4字节对齐的。
此函数与__aeabi_memcpy相同,但可以假设指针是8字节对齐的。“
详情请见:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3934.html