2

arm コード ソース (arm-none-eabi-gcc) を使用してコードをコンパイルしました (Lite Edition だと思います)。

関数内で構造体変数を定義し、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 は通過しますが、2 番目の memcpy はアボートを引き起こしています。

gcc が memcpy を最適化し、アラインされていない構造体アクセスが発生していると聞きましたか?

構造体変数を単語境界などに合わせてみましたがうまくいきませんでした。

gcc の memcpy とアライメントの問題について詳しく教えてください。

ありがとう!

4

1 に答える 1

2

ARMのmemcopy()の問題は、私が理解している限り、コンパイラによる最適化された実装の使用に関連しています。

「多くの場合、memcpy()の呼び出しをコンパイルすると、ARM Cコンパイラは代わりに特殊な最適化されたライブラリ関数の呼び出しを生成します。RVCT2.1以降、これらの特殊な関数はARMアーキテクチャ(AEABI)のABIの一部であり、含む:

  • __aeabi_memcpy

この関数は、戻り値が無効であることを除いて、ANSICmemcpyと同じです。

  • __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 に答える