第四篇 STM32MP157-M4:Makefile 完整详解
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

相关新闻

YOLOv8 飞鸟智能预警全栈工程|单类别 VOC/YOLO 航拍数据集、PyQt5 精美 GUI、ONNX 量化推理、全套训练评估曲线落地

YOLOv8 飞鸟智能预警全栈工程|单类别 VOC/YOLO 航拍数据集、PyQt5 精美 GUI、ONNX 量化推理、全套训练评估曲线落地

目录 一、前言 二、5416 张单类别飞鸟航拍数据集完整解析 2.1 数据集基础完整参数 2.2 飞鸟检测数据集专属优势 2.3 数据集固有短板与配套涨点方案 三、YOLOv8 飞鸟检测专属涨点核心原理 四、三大行业落地应用案例 案例 1 民航机场净空飞鸟预警系统 业务痛点机场跑道周…

2026/10/14 15:23:26 阅读更多 →
YOLOv8 八类人脸表情识别全栈工程|8038 张 VOC/YOLO 数据集、PyQt5 精美 GUI、ONNX 量化推理、全套训练评估曲线落地

YOLOv8 八类人脸表情识别全栈工程|8038 张 VOC/YOLO 数据集、PyQt5 精美 GUI、ONNX 量化推理、全套训练评估曲线落地

目录 一、前言 二、8038 张八类人脸表情数据集完整解析 2.1 数据集基础完整参数 2.2 人脸表情数据集专属优势 2.3 数据集固有短板与配套涨点优化策略 三、YOLOv8 人脸表情专属涨点核心原理 四、四大行业落地应用案例 案例 1 智慧课堂学情实时分析系统 业务痛点教师无法…

2026/9/29 0:05:10 阅读更多 →
AI智能体在制造业的应用:从工艺知识传承到实时质量控制

AI智能体在制造业的应用:从工艺知识传承到实时质量控制

1. 项目概述:当AI智能体走进工厂车间最近和几个在制造业干了十几年的老工程师聊天,大家聊得最多的不是新设备,而是“人”。不是招不到人,而是留不住人,更留不住“经验”。一个老师傅退休,带走的可能是一整套…

2026/10/13 12:55:21 阅读更多 →

最新新闻

Dubbo服务注册与暴露全流程解析:从Spring容器启动到注册中心

Dubbo服务注册与暴露全流程解析:从Spring容器启动到注册中心

1. 从一次线上故障说起&#xff1a;为什么要搞清楚服务注册与暴露很多同学用 Dubbo 做微服务&#xff0c;配置文件里写个<dubbo:service>或者加个DubboService注解&#xff0c;服务就能被调用了&#xff0c;至于背后发生了什么&#xff0c;基本靠“框架自动搞定”这句话糊…

2026/10/14 20:52:20 阅读更多 →
从零搭建私有文档问答:向量检索与RAG实战指南

从零搭建私有文档问答:向量检索与RAG实战指南

1. 从零搭建私有文档问答&#xff1a;为什么向量检索是绕不开的那道坎很多人第一次接触大模型应用&#xff0c;脑子里想的都是"我把文档丢给模型&#xff0c;它就能回答我的问题"。真动手才发现&#xff0c;模型根本读不到你的私有文档——它只认训练时见过的东西。于…

2026/10/14 20:52:20 阅读更多 →
Mahout推荐系统实训:从协同过滤原理到可调试工程实践

Mahout推荐系统实训:从协同过滤原理到可调试工程实践

1. 这不是“学个框架”那么简单&#xff1a;Mohout推荐引擎在真实实训场景中的定位与价值你点开这个标题&#xff0c;大概率是刚收到实训任务通知&#xff0c;或者正对着教学平台里“创新实训&#xff08;19&#xff09;”这行字发呆。别急着去GitHub搜安装命令——先搞清楚一件…

2026/10/14 20:52:20 阅读更多 →
LDA主题模型实战指南:从原理到可解释文本分析

LDA主题模型实战指南:从原理到可解释文本分析

1. 这不是“黑箱”&#xff0c;而是文本挖掘的基石级工具&#xff1a;LDA到底在解决什么问题&#xff1f;你可能已经听过LDA——Latent Dirichlet Allocation&#xff0c;中文常译作“潜在狄利克雷分布”。但别被这串数学味十足的名字吓退。它既不是高不可攀的理论模型&#xf…

2026/10/14 20:52:20 阅读更多 →
医疗医药AI+BI小范围试点落地路径分享

医疗医药AI+BI小范围试点落地路径分享

导语 医疗医药行业数智化转型持续推进&#xff0c;AIBI成为企业优化经营决策、提升业务效率的核心抓手&#xff0c;但不少企业在落地时容易陷入“盲目铺摊子却无法验证价值”的困境&#xff0c;小范围试点是控制项目风险、验证业务价值的关键起步阶段。医疗医药行业有合规要求高…

2026/10/14 20:52:20 阅读更多 →
5G信令流程解析实战:从NAS、RRC到NGAP的日志分析与排障指南

5G信令流程解析实战:从NAS、RRC到NGAP的日志分析与排障指南

简介&#xff1a;《5G信令流程解析信息介绍及学习技巧》面向5G通信初学者及相关从业者&#xff0c;集中讲解信令流程中的关键概念与学习方法&#xff0c;帮助读者理解用户终端、基站、核心网等通信实体及其交互机制。文档从背景知识出发&#xff0c;阐述5G相对前代在速率、延迟…

2026/10/14 20:51:17 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →