查看: 76|回复: 0

[分享] GCC编译器的常用参数及用法,你都清楚吗?

[复制链接]
  • TA的每日心情
    开心
    2020-12-18 12:56
  • 签到天数: 55 天

    [LV.5]常住居民I

    75

    主题

    225

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    1632
    最后登录
    2024-4-26
    发表于 2024-4-25 11:30:17 | 显示全部楼层 |阅读模式
    在常用的硬件相关flags中,-mcpu,-mfpu和-mfloat-abi是最为重要的。
    首先是-mcpu,该选项可以由名字与合适扩展组合而成,例如-mcpu=cortex-m33+nodsp+nofp,表示为没有DSP扩展与FPU的cortex-m33编译,又如-mcpu=cortex-m7+nofp.dp表示为cortex-m7编译且不使用双精度浮点指令,在上面的两个例子中cortex-m33与 cortex-m7 是处理器名字,+nodsp,+nofp.dp与+nofp是扩展,同理其他的处理器与扩展组合也可以使用,合理即可。例如cortex-m3没有fpu,那cortex-m3+nofp.dp是不合理的。-mfpu表示使用的fpu类型,通常使用-mfpu=auto即可,同时auto也是默认值,或者在某些架构上可以手动指定,当然前提是架构包含该型号的FPU。-mfloat-abi表示使用哪种float abi,该项只有三个可用值,soft,softfp与hard,soft指定GCC调用软浮点算法实现,softfp指定GCC使用硬件浮点指令,但仍然使用软浮点的调用规则,hard则全部使用硬件规则,该项通常影响第三方库与固件之间的兼容性,根据具体情况确定。


    SPECS
    SPECS是一套预定义规则,默认SPECS已经定义了许多参数,可以通过如下命令查看:
    arm-none-eabi-gcc -dumpspecs
    在嵌入式开发中常用的有三个specs,包括nano.specs,nosys.specs与rdimon.specs。这些specs可以在”gcc-arm-none-eabi/arm-none-eabi/lib”中找到。nano.specs指定GCC使用newlib_nano代替newlib,newlib_nano是专门为嵌入式优化的C库,相比newlib有所缺失。nosys.specs消除了系统调用的实现,如果使用该specs又不自己实现一套系统调用,那会在链接过程中爆出非常多的warning:

    爆出非常多的warning

    爆出非常多的warning
    使用rdimon.specs可以使用semihosting重定向系统调用,可以在连接调试器的情况下使用系统调用,如stdout,stderr等(printf)。


    优化
    常见的优化Flags通常以-f开头,我们常用的-ON,-Os等都是一个简称,如最低级的优化-O1,实际上在GCC看来是-fauto-inc-dec,-fbranch-count-reg,-fcombine-stack-adjustments等等等等。GCC的优化参数又许多,光是-O3开启的优化就有111个,再加上一些需要手动开启的优化选项,数量太多就不一一举例。在实际使用中通常只要熟悉几个优化选项和-ON就可以了:
    fdata-sections,-ffunction-sections开启这两个优化会把每个data与function单独分配为一段,结合linkerscript可以减少指令数量,同时使用—gc-sections减少没有用到的段,最终减少产物的大小
    fno-rtti,-fno-exceptions,这两个选项在使用C++时建议使用,用来关闭C++的运行时推断和异常处理,否则最终产物的大小会非常大(而且这两个机制也没有非常多的人在用)
    ffast-math该选项建议不是必要不要开启,可能会导致错误的数**算结果
    flto,链接时优化,会减少程序体积,同时也会略微降低性能(coremark测试中)
    ffree-standing,这是一个小有争议的选项,但还是建议开启,开启此选项会同时开启-fno-common。开启这个选项会让GCC认为当前环境的标准库不是GCC标准库,从而忽略一些语义级别的优化,如memset等,在不开启该选项的情况下,在某些场景下GCC会推断这个memset的用处如同其名字,清理或设置一整块内存,从而使用GCC内置的语义优化;使用该选项后,便不执行任何推断,memset的定义如何就如何执行(通常是逐个写byte),在实际情况中会导致性能有增有减


    提示
    建议按需开启,如果遇到不规范的代码,胡乱开启警告的后果可是很恼人的。对代码标准要求较高的同学,需要使用-Werror让GCC把所有的warning全部视为error。


    小结
    在介绍以上常见GCC Flags后,希望大家能够在编译系统中设置合适的编译选项以便优化过程与结果。在MCUXpressoIDE中相关参数可以在设置中找到。

    MCUXpressoIDE中相关参数可以在设置中找到

    MCUXpressoIDE中相关参数可以在设置中找到

    MCUXpressoIDE中相关参数可以在设置中找到

    MCUXpressoIDE中相关参数可以在设置中找到
    在MCUXpresso for VSCode中:
    VSCode.png VSCode2.png
    好了,本期GCC编译器的常用参数现为大家介绍到这里,不知大家是否清晰了呢,如果屏幕前的你有任何疑问或建议,欢迎分享留言。下期再见!


    签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-4 14:05 , Processed in 0.114313 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表