Lazy loaded image
交叉编译链b
Words 1752Read Time 5 min
2024-1-30

Prequistes

  1. 交叉编译工具链 https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
 

一、Cubemx 导出

 

1.1 Makefile 文件架构

  1. TARGET
  1. building
    1. DEBUG = 1
    2. OPT = -Og
  1. paths
    1. BUILD_DIR
  1. source
    1. C_SOURCES
    2. ASM_SOURCES
  1. binaries
    1. CC
    2. AS
    3. CP
    4. SZ
    5. HEX
    6. BIN
  1. CFLAGS
    1. CPU
    2. FPU - 指定浮点单元
    3. FLOAT-ABI
    4. MCU MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
    5. AS_DEFS
    6. C_DEFS
    7. AS_INCLUDES
    8. C_INCLUDES
    9. ASFLAGS
    10. CFLAGS CFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
  1. LDFLAGS
    1. LDSCRIPT
    2. LIBS
    3. LIBDIR
    4. LDFLAGS LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

1.2 编译参数说明

参数
说明
目标架构
-mcpu=cortex-m3
指定芯片内核(必需)
cortex-a8、cortex-m3、cortex-m4
-march=<architecture>
指定目标处理器的体系结构
armv7-a
-mfpu=fpv4-sp-d16
指定浮点单元
1. 使用 VFPv4 浮点单元,支持单精度浮点运算,并且支持双精度浮点数,大小为 16 位。 2. “neon”是“neon-vfpv3”的别名, “vfp” 是 “vfpv2” 的别名。
-mfloat-abi=hard
指定使用硬件浮点单元
-mfloat-abi=soft: 完全使用软件浮点实现。 -mfloat-abi=softfp: 使用软件实现的浮点运算,但使用硬件寄存器传递浮点参数和返回浮点值。 -mfloat-abi=hard: 使用硬件浮点单元。
-mthumb
指定使用 Thumb 指令集。(必需)
优化选项
-O0
指定优化级别(从无优化到高优化)。
1. -O0, -O1, -O2, -O3: 指定优化级别(从无优化到高优化)。 2. -Og 是 GCC (GNU Compiler Collection)中的一个优化选项,通常用于在开发阶段进行优化,以提高编译速度同时保持生成的代码相对容易调试。这个选项的含义是优化等级 "Og",其中 "O" 表示优化,而 "g" 表示调试。
-Os
指定目标体积优化
1. Os 是针对目标的体积进行优化,尽可能减小体积。 2. Os 是把 O2 中所有选项,除了那些会增加体积的优化选项,都打开。
调试信息
-g
指定生成调试信息。
-gdwarf-2
指定调试信息格式的版本 2
采用 DWARF 格式版本 2 的调试信息。在实践中,你可能会看到其他版本的 DWARF,如 -gdwarf-3-gdwarf-4 等,它们分别代表 DWARF 调试信息格式的不同版本。更高版本通常提供了更多的功能和改进,但可能会占用更多的空间。
ffunction-sectionsfdata-sections:
将每个函数和数据放置到单独的段,以便在链接时进行更细粒度的优化。
预处理选项
D<macro>
定义预处理宏。
C_DEFS = \ -DUSE_HAL_DRIVER \ -DSTM32L476xx
I<include_path>
添加头文件搜索路径。
C_INCLUDES = \ -IInc \ -IDrivers/STM32L4xx_HAL_Driver/Inc \ -IDrivers/STM32L4xx_HAL_Driver/Inc/Legacy \ -IDrivers/CMSIS/Device/ST/STM32L4xx/Include \ -IDrivers/CMSIS/Include
编译选项
-MMD, -MP, 和 -MF
生成依赖关系文件
-MMD 告诉编译器生成用于描述源文件和头文件之间依赖关系的 Makefile 规则,但不包括系统头文件。 -MP 生成虚拟目标,这有助于避免一些常见的 Makefile 问题。 -MF"build/system_stm32l4xx.d" 指定生成的依赖关系文件的名称,即 Makefile 规则文件。在这个例子中,规则将被写入 build/system_stm32l4xx.d 文件。
-Wa,-a,-ad,-alms=xxx.lst
生成包含汇编代码和原始 C 代码注释的汇编输出
-Wa: 这个部分告诉编译器将其后的选项传递给汇编器。 数 -a 生成汇编代码。 -ad 生成包含汇编代码和原始 C 代码注释的汇编输出。 -alms=build/system_stm32l4xx.lst 生成包含汇编代码和原始 C 代码注释的汇编输出,并将其写入 build/system_stm32l4xx.lst 文件。
链接选项
T<ld_script>
指定链接脚本文件。
-TSTM32L476RGTx_FLASH.ld
nostartfiles
阻止链接器使用标准启动文件。
Wl,<option>
<option> 传递给链接器。
Wl,--gc-sections: 在链接阶段,-Wl,–gc-sections 指示链接器去掉不用的代码(其中-wl, 表示后面的参数 -gc-sections 传递给链接器),这样就能减少最终的可执行程序的大小,且避免一些编译错误。
-x
选项允许你显式指定源文件的类型。
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp → assembly_file.s 是包含汇编指令和 C 预处理器指令的源文件
-Map
指定连接器选项
-Wl: 这个部分告诉编译器将其后的选项传递给链接器(linker)。 -Map=build/Hal_template.map: 这个部分告诉链接器生成一个地图文件,地图文件的名称为 Hal_template.map,并且存放在 build 目录下。 --cref: 这个部分是链接器的选项,表示在地图文件中包含交叉引用(cross reference)信息,这有助于了解程序中的符号如何引用和定义。
警告和错误处理
-Wall, Werror
开启所有警告或将警告视为错误。
-Wno-*
关闭特定的警告。
-std=<standard>
指定使用的语言标准,如c99。
-nostdlib
不使用标准库
fno-exceptionsfno-rtti
禁用C++异常和RTTI支持

二、STM32-base Poeject 使用

三、STM32F4xx_LED-Makefile

 
 
 

引用

  1. ARM Options - Using the GNU Compiler Collection 13.0.0 (experimental 20221108) documentation (splichal.eu) (Detailed)
  1. arm-none-eabi-gcc GNU Arm Embedded Toolchain · Actions · GitHub Marketplace GitHub Action
  1. Arm GNU Toolchain Downloads – Arm Developer工具链下载
  1. ARM芯片型号汇总 - 知乎 (zhihu.com)架构和型号
  1. ARM architecture overview:一个波澜壮阔史诗的剪影-云社区-华为云 (huaweicloud.com)
  1. Getting started with STM32 | STM32-base project
    1. If you want to get started with the STM32-base project, you don’t have to make a lot of choices on the software side. The STM32-base project is designed to be used with the GNU Arm Embedded Toolchain. STM32-base can be used with you favorite code editor. A recommendation for an editor is Visual Studio Code.
  1. Keil2Makefile
    QrpucpUpdated Jul 4, 2024
    说明
  1. ProjectConverter
    phodinaUpdated Oct 14, 2024
  1. laneston/STM32F4xx_LED-Makefile: This is a learning template for Cross compilation chain. You can learn how to use gcc-arm-none-eabi in ubuntu to compile the bin file that can be run on STM32. (github.com) 说明
 
上一篇
模板设计模式:让你的代码结构更清晰
下一篇
Guide to Linux System

Comments
Loading...