gpt4 book ai didi

gcc - 在arm中使用GCC的内置函数

转载 作者:行者123 更新时间:2023-12-02 07:37:22 24 4
gpt4 key购买 nike

我正在使用不含 libc 的裸机工具链开发 cortex-m3 板。

我实现了 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 版本?

最佳答案

内置函数不应该用于实现自身:)

内置函数应该在应用程序代码中使用 - 那么编译器可能会也可能不会生成一些特殊 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

但是:

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

导致调用 memcpy 函数:

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

关于gcc - 在arm中使用GCC的内置函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8503194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com