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
    Github
    Keil2Makefile
    Owner
    Qrpucp
    Updated
    Jul 4, 2024
    说明
  1. ProjectConverter
    Github
    ProjectConverter
    Owner
    phodina
    Updated
    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...