【单片机】添加printf函数后,gcc编译出来的固件大小明显比armcc大

在使用 GCC 编译器(如 arm-none-eabi-gcc)和 ARMCC 编译器时,可能会注意到它们生成的固件大小有所不同。这种差异可能是由于以下原因造成的:

  1. 优化设置:不同编译器的优化选项和优化策略可能导致生成的二进制文件大小不同。尝试调整优化级别,例如使用 -Os 选项(针对大小优化)或 -O2(平衡性能和大小),以减小 GCC 生成的固件大小。

  2. 库差异:GCC 和 ARMCC 可能使用不同的库实现,例如 C 标准库、启动文件和其他辅助库。这些库实现的差异可能导致生成的固件大小有所不同。在使用 GCC 时,可以考虑使用较小的库实现(如 newlib-nano),以减小固件大小。

  3. 链接选项:在链接过程中,可以通过设置链接器选项来移除未使用的代码和数据。在 GCC 的链接选项中,可以添加 –gc-sections 来去除未使用的代码段和数据段:

    arm-none-eabi-gcc ... -Wl,--gc-sections ...
    
  4. 在编译和链接过程中,使用 -ffunction-sections-fdata-sections 选项将每个函数和数据对象放入独立的代码段和数据段,以便链接器可以更有效地移除未使用的代码和数据:

    arm-none-eabi-gcc ... -ffunction-sections -fdata-sections ...
    
  5. 特定功能的实现:GCC 和 ARMCC 可能在实现某些功能(如 printf 函数)时采用不同的策略。在使用 GCC 编译代码时,可以考虑使用更简单的 printf 替代品(如 iprintf),以减小生成的固件大小。

要减小使用 GCC 编译器生成的固件大小,请尝试调整优化设置、库实现和链接选项。这些调整可以帮助生成更紧凑的二进制文件,同时在很大程度上保持性能。

你可能感兴趣的:(单片机,单片机,嵌入式硬件)