关键词:gcc,ARM,Eclipse,STM32,嵌入式
在“【002】搭建开源嵌入式集成开发环境”和“【003】使用GNU ARM工具链进行STM32开发”两篇博文中介绍了基于GUN的STM32开发环境搭建。在编译和连接的过程中,均采用系统默认的设置,生成的文件可以在嵌入式系统中正常运行,并符合预期的结果。嵌入式开发需要根据具体的需求来合理剪裁,以实现性能和成本的双赢局面。本文对于基于ARM gcc的编译和连接指令进行介绍,以方便产生紧凑可靠地文件。
图1 EclipseTarget Processer 截图
如图1所示为Eclipse创建工程中Target Processer页面的截图,下面为该页面下编译指令解析:
-mthumb-interwork 生成支持在ATM和Thumb指令之间互相调用的代码。
-mfloat-abi=name 指定要使用的浮点ABI。可以是“soft”生成的代码使用软件模拟浮点计算,“softfp”生成的代码使用硬件浮点指令,但是软件浮点调用规则,“hard”生成硬件浮点指令代码且使用特定FPU调用规则。(softfp的意义在哪里?)
-mlittle-endian 采用小端模式
-mbig-endian 采用大端模式
-march=name 指定ARM架构,如“armv7-a”,“armv7-m”,“armv7-r”,“armv7e-m”等
-mcpu=name 指定ARM处理器的型号,如“cortex-m4”等
-mfpu=name 指定硬件FPU型号,如“vfpv2”等
-mthumb 使用Thumb指令集
-marm 使用ARM指令集
-munaligned-access
-mno-unaligned-access 使能(失能)从非对其的16位或32位地址处读写16为或32位数值
图2优化选项页面截图
如图2所示为Eclipse创建工程中优化页面截图,下面为相关编译指令解析:
-00(-O1,-O2,-O3)编译优化等级,数字越大优化越多。
-fmessage-length=n 格式化错误输出信息,如果n=0,那么每条错误信息为一行
-fsigned-char 设置char为有符号类型
-ffunction-sections 在编译的时候把每个函数作为一个section
-fdata-sections 在编译的时候把每个数据作为一个section。其中每个sections名与function或data名保持一致,能够减小生成文件的大小。
-fno-common 在编译过程中,禁止将未初始化的全局变量放到common段。
-fno-inline忽略代码中的 inline 关键字,该选项使编译器将内联函数以普通函数对待;等同无优化选项时的处理。
-ffreestanding 按独立环境编译,该环境可以没有标准库,且对main()函数没有要求。最典型的例子就是操作系统内核。该选项隐含设置了 -fno-builtin,且与 -fno-hosted 等价。
-fno-builtin 不适用C语言内建函数。
-fsingle-precision-constant 将浮点常量作为单精度常量对待。
-fPIC 生成PIC(Position-IndependentCode),以达到动态链接的目的。
-flto 优化连接时间。
-fmove-loop-invariants 使能循环优化,将不变部分放在循环外执行。
图3 Eclipse Warning配置页面
如图3所示为Eclipse创建工程中Warning页面截图,下面为相关编译指令解析:
-fsyntax-only 检查程序中的语法错误,但是不产生输出信息。
-pedantic 允许发出ANSI C标准所列的全部警告信息。
-pedantic-errors 允许发出ANSIC标准所列出的错误。
-Wall 编译后显示所有警告
-W 与-Wall类似,会显示警告,但是仅显示编译器认为会出现错误的警告。
-Wunused 提升为使用的函数或变量。
-Wuninitialised 提示为初始化的变量。
-Wextra 打印一些额外的警告信息。
-Wmissing-declarations 提示声明确实。
-Wconversion 提示非显示转换。
-Wpointer-arith 对函数指针或者void *类型的指针进行算术操作时给出警告。
-Wpadded 打开包含padding提示。
-Wshadow 当局部变量遮蔽了参数,全局变量时,进行提示。
-Wlogical-op 警告表达式中逻辑运算符的可疑用法。
-Wfloatequal 警告使用了浮点数相等判定
-Werror 将所有的警告当做错误来处理
图4Eclipse 连接页面
如图4示为Eclipse创建工程中连接页面截图,下面为相关编译指令解析:
-nostartfiles 在连接之时不使用标准的系统启动文件。
-nodefaultlibs 在连接之时,不使用标准的系统库
-nostdlib 在连接之时,即不使用标准的系统启动文件也不使用标准的系统库。
-Xlinker option 传递选项作为连接器的选项,可以用来提供特定系统下GCC不能识别的连接选项
联系作者