2011-12-14 21 views
3

libcを使用しないベアメタルのツールチェーンを使用しているcortex-m3ボードで作業しています。GCCの組み込み関数を腕で使用する

データをバイト単位でコピーするmemcpyを実装しましたが、遅すぎます。 GCCのマニュアルでは、__builtin_memcpyを提供していると私はそれを使用することに決めました。そこで、__builtin_memcpyを使った実装があります。

#include <stddef.h> 

void *memcpy(void *dest, const void *src, size_t n) 
{ 
    return __builtin_memcpy(dest,src,n); 
} 

このコードをコンパイルすると、決して終了しない再帰関数になります。

$ arm-none-eabi-gcc -march=armv7-m -mcpu=cortex-m3 -mtune=cortex-m3 \ 
    -O2 -ffreestanding -c memcpy.c -o memcpy.o 
$ arm-none-eabi-objdump -d memcpy.o 

memcpy.o:  file format elf32-littlearm 


Disassembly of section .text: 

00000000 <memcpy>: 
    0: f7ff bffe  b.w  0 <memcpy> 

私は間違っていますか?コンパイラが生成したmemcpyのバージョンを使用するにはどうすればよいですか?

答えて

4

組み込み関数は、それ自体を実装するために使用されることになっていない:)

組み込み機能は、アプリケーション・コードで使用することになっている - 次に、コンパイラは、またはではないかもしれないいくつかの特別のinsn配列またはへの呼び出しを生成することができます根底にある本当の機能は

は比較:

int a [10], b [20]; 

void 
foo() 
{ 
    __builtin_memcpy (a, b, 10 * sizeof (int)); 
} 

これは、その結果

foo: 
    stmfd sp!, {r4, r5} 
    ldr  r4, .L2 
    ldr  r5, .L2+4 
    ldmia r4!, {r0, r1, r2, r3} 
    mov  ip, r5 
    stmia ip!, {r0, r1, r2, r3} 
    ldmia r4!, {r0, r1, r2, r3} 
    stmia ip!, {r0, r1, r2, r3} 
    ldmia r4, {r0, r1} 
    stmia ip, {r0, r1} 
    ldmfd sp!, {r4, r5} 
    bx  lr 

しかし:memcpy関数の呼び出しで

void 
bar (int n) 
{ 
    __builtin_memcpy (a, b, n * sizeof (int)); 
} 

結果:

bar: 
    mov  r2, r0, asl #2 
    stmfd sp!, {r3, lr} 
    ldr  r1, .L5 
    ldr  r0, .L5+4 
    bl  memcpy 
    ldmfd sp!, {r3, lr} 
    bx  lr 
1

理論的には、ライブラリは、Cコンパイラではなくツールチェーンの一部の一部ではありません。 したがって、memcpy(&a,&b,sizeof(a))コンパイラは、サブルーチンコールを生成しなければなりません。

__builtinの考え方:コンパイラに通知するために、関数は標準であり、最適化することができます。したがって、__builtin_memcpy(&a,&b,sizeof(a))コンパイラがサブルーチン呼び出しを生成するかもしれないが、ほとんどの場合、それは起こらない。たとえば、コンパイル時にサイズが4と指定されている場合は、movコマンドが1つだけ生成されます。 (別の利点 - たとえサブルーチン呼び出しコンパイラに通知されても、そのライブラリ関数には副作用がありません)。

memcpyではなく__builtin_memcpyを使用する方がよいでしょう。現代の図書館では、の文字列で行われました

しかし、あなたはまだどこかでmemcpyを実装する必要があり、呼び出しは精巧な場所で生成されます。 ARMの文字列関数については、4バイトの実装を強くお勧めします。

+0

この質問は2年前に尋ねられ、既に回答があります。これらのタイプの質問を返さないようにしてください。 – Mic1780

関連する問題