对于ARM嵌入式开发,推荐使用以下基本编译选项:
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -O3 -ffunction-sections -fdata-sections
选项说明:
- -mcpu=cortex-m4
: 指定目标CPU架构
- -mthumb
: 生成Thumb指令集代码
- -mfloat-abi=hard
: 使用硬件浮点单元
- -mfpu=fpv4-sp-d16
: 指定浮点单元类型
- -O3
: 最高级别优化
- -ffunction-sections -fdata-sections
: 为链接器优化做准备
使用GCC内联汇编进行关键路径优化:
__asm__ volatile (
"mov r0, %0\n\t"
"add r0, r0, #1\n\t"
"mov %0, r0"
: "=r" (result)
: "0" (input)
: "r0"
);
-Wl,--gc-sections -Wl,--print-gc-sections -Wl,-Map=output.map
这些选项会移除未使用的代码段,减小最终二进制文件大小。
-mcpu=cortex-m7 -mtune=cortex-m7 -march=armv7e-m
-mcpu=cortex-a53 -mtune=cortex-a53 -march=armv8-a
对于纯汇编文件(.s),使用以下选项:
arm-none-eabi-gcc -x assembler-with-cpp -Wa,-mimplicit-it=always
添加调试信息以便分析:
-g -pg -fprofile-arcs -ftest-coverage
CC = arm-none-eabi-gcc
CFLAGS = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 \
-O3 -ffunction-sections -fdata-sections \
-Wall -Wextra -Werror -pedantic
LDFLAGS = -Wl,--gc-sections -Wl,-Map=$(TARGET).map -T linkerscript.ld
TARGET = firmware
SRCS = main.c peripherals.c optimized_asm.s
all: $(TARGET).elf
$(TARGET).elf: $(SRCS)
$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
clean:
rm -f $(TARGET).elf $(TARGET).map
-Og -g
编译,用gprof找出热点函数__attribute__((always_inline))
或-finline-functions
-funroll-loops
或手动展开关键循环-flto
进行链接时优化通过以上配置和实践,可以充分发挥GCC在ARM嵌入式开发中的优化潜力,同时保持代码的可维护性。