资讯动态

第四篇 STM32MP157-M4:Makefile 完整详解

发布时间:2026/8/15 22:49:31 来源:尧图企业网站定制
STM32MP157-M4Makefile 完整逐段详解【高危前置提醒】必须开启--gc-sections死代码回收避免 SRAM 溢出编译参数必须携带-DCORE_CM4os_config/必须在-I列表首行。0 前言纯 GNU Make 构建工程不依赖任何 IDE。Makefile 自动遍历源码目录支持递归子文件夹、区分大小写汇编文件.svs.S一键生成.elf/.bin/.hex/.map文件并且内置make flash一键 OpenOCD 烧录。1 工具链基础定义CROSS_COMPILE ? arm-none-eabi- CC : $(CROSS_COMPILE)gcc AS : $(CROSS_COMPILE)gcc -x assembler-with-cpp LD : $(CROSS_COMPILE)gcc OBJCOPY : $(CROSS_COMPILE)objcopy OBJDUMP : $(CROSS_COMPILE)objdump SIZE : $(CROSS_COMPILE)size TARGET : m4_liteos PROJ_ROOT : . BUILD_DIR : build关键设计AS重用gcc而非as带预处理器的汇编.S后缀需要经过 C 预处理PROJ_ROOT设为.Makefile 和工程根目录同层所有路径相对引用2 核心编译参数# CPU 浮点配置M4 硬浮点 FPv4-SP-D16 CPUFLAGS : -mcpucortex-m4 -mthumb -mfloat-abihard -mfpufpv4-sp-d16 # 芯片宏CORE_CM4 必须缺失会导致 HAL/CMSIS 丢失 M4 相关定义 CHIP_DEFS : -DSTM32MP157Cxx -DSTM32MP1 -DCORE_CM4 # LiteOS 场景宏 LITEOS_DEFS : -DLOSCFG_LIB_CONFIG-los_builddef.h # C 编译标志-Os 空间优化 debug 符号 段分离用于 gc-sections CFLAGS : $(CPUFLAGS) $(CHIP_DEFS) $(LITEOS_DEFS) $(INCLUDES) CFLAGS -Wall -Wextra -g3 -Os CFLAGS -ffunction-sections -fdata-sections # 每个函数/变量独立一个段 CFLAGS -fno-common -fmessage-length0 CFLAGS --specsnano.specs # 使用 newlib-nano 减小体积 # 汇编标志 ASFLAGS : $(CPUFLAGS) $(CHIP_DEFS) $(INCLUDES) # 链接标志 LDFLAGS : $(CPUFLAGS) -T$(PROJ_ROOT)/stm32mp157_m4.lds LDFLAGS -Wl,-Map$(BUILD_DIR)/$(TARGET).map,--cref # 生成完整 map LDFLAGS -Wl,--gc-sections # 死代码回收 LDFLAGS --specsnano.specs -lnosys # nano 库无系统调用--gc-sections的作用编译器把每个函数 / 全局变量放进独立段-ffunction-sections -fdata-sections链接时未被引用的段自动丢弃。开启前固件可能超过 SRAM 上限开启后省下几十 KB。3 源文件收集规则# 汇编源文件手动指定避免 wildcard 漏抓 ASM_SRC Core/Startup/startup_stm32mp15xx.s # 启动文件纯汇编 .s ASM_SRC kernel_liteos_m/kernel/arch/arm/cortex-m4/gcc/los_dispatch.S ASM_SRC kernel_liteos_m/kernel/arch/arm/cortex-m4/gcc/los_exc.S # HAL 驱动过滤 ll_ 文件 HAL_SRC : $(filter-out %ll_%, $(wildcard Drivers/STM32MP1xx_HAL_Driver/Src/*.c)) # LiteOS 内核 C 源码 LITEOS_SRC : $(wildcard kernel_liteos_m/kernel/src/*.c) LITEOS_SRC $(wildcard kernel_liteos_m/kernel/arch/arm/cortex-m4/gcc/*.c) # 用户应用 C 源码 APP_SRC : $(wildcard Core/Src/*.c) APP_SRC $(wildcard Drivers/BSP/**/*.c) APP_SRC $(wildcard Drivers/SYSTEM/**/*.c)注意GNU Make 的wildcard不支持**递归通配符。深层子目录需要分层单独写 wildcard或使用foreachshell find组合。4 编译规则大小写汇编分开# C 文件编译 $(BUILD_DIR)/%.o: %.c mkdir -p $(dir $) $(CC) -c $(CFLAGS) -MMD -MP $ -o $ # 大写 .S 汇编含预处理需要传递 INCLUDES $(BUILD_DIR)/%.o: %.S mkdir -p $(dir $) $(AS) -c $(ASFLAGS) $ -o $ # 小写 .s 纯汇编无预处理 $(BUILD_DIR)/%.o: %.s mkdir -p $(dir $) $(CC) -c $(CPUFLAGS) $ -o $大写.S和小写.s必须分开.S文件含 C 宏和#include必须经过 C 预处理-x assembler-with-cpp并且需要-I头文件路径.s是纯汇编直接汇编即可。5 链接与产物生成$(BUILD_DIR)/$(TARGET).elf: $(OBJS) echo Linking $(BUILD_DIR)/$(TARGET).elf... $(LD) $(OBJS) $(LDFLAGS) -o $ echo BUILD SUCCESS: $(TARGET).elf $(BUILD_DIR)/$(TARGET).bin: $(BUILD_DIR)/$(TARGET).elf $(OBJCOPY) -O binary $ $ $(BUILD_DIR)/$(TARGET).hex: $(BUILD_DIR)/$(TARGET).elf $(OBJCOPY) -O ihex $ $6 内置命令一览命令功能make完整编译生成 elf/bin/hexmake clean清空 build 目录make flash调用 OpenOCD 自动下载并运行需 OpenOCD 已安装make info打印源码数量、工具链版本、固件大小7 flash 目标OpenOCD 一键烧录OPENOCD ? D:/tools/xpack-openocd-0.12.0-5-win32-x64/xpack-openocd-0.12.0-5/bin/openocd.exe OCD_SCRIPTS ? D:/tools/xpack-openocd-0.12.0-5-win32-x64/xpack-openocd-0.12.0-5/openocd/scripts # 从 elf 动态取 Reset_Handler 符号地址避免硬编码 ENTRY $(shell $(OBJDUMP) -t $(BUILD_DIR)/$(TARGET).elf | grep Reset_Handler | awk $$2!{print 0x$$1}) READELF $(CROSS_COMPILE)readelf flash: all $(OPENOCD) -s $(OCD_SCRIPTS) \ -f openocd/board_stm32mp157_m4.cfg \ -c init -c targets stm32mp15x.cm4 -c halt \ -c load_image $(BUILD_DIR)/$(TARGET).elf \ -c reg pc $(ENTRY) \ -c resume -c shutdown关键设计ENTRY从 elf 符号表动态解析Reset_Handler地址永不硬编码。每次make后入口地址可能因代码量变化而漂移硬编码必翻车。⚠️ 本节踩坑速览现象根因修复wildcard 无法递归遍历内核多层文件夹GNU Make 不支持**分层单独写 wildcard 子目录大写.S汇编头文件找不到误用小写.s编译规则分开编写.s与.S两套规则编译后固件过大、SRAM 溢出未开启--gc-sectionsCFLAGS LDFLAGS 成对添加大量 GPIO / UINT32 未定义缺失-DCORE_CM4CHIP_DEFS 添加-DCORE_CM4printf 打印浮点数运行崩溃未链接 nano 浮点库LDFLAGS 增加-u _printf_floatmake flashPC 地址错误硬编码 Reset_Handler 地址改用 elf 符号表动态解析编译 memcpy/memset 等函数未定义--specsnano.specs依赖 newlib-nano确认工具链已安装 newlib-nano

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价