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

文章探讨了GCC和ARMCC编译器在生成固件大小上的差异,主要因素包括优化设置、库选择和链接选项。调整GCC的-Os选项、使用newlib-nano库、添加--gc-sections链接选项以及利用-ffunction-sections和-fdata-sections来删除未使用代码,可以有效减小固件大小。此外,替换函数实现,如用iprintf代替printf,也是减小尺寸的策略之一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西西洛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值