记一次STM32编译生成BIN文件过大的问题(基于STM32CubeIDE)

embedded/2025/2/3 23:03:38/

文章目录

  • 问题描述
  • 解决方法
  • 更多拓展

问题描述

最近在一个项目中使用了 STM32H743 单片机(基于 STM32CubeIDE GCC 开发),它的内存分为了 DTCMRAM RAM_D1 RAM_D2 …等很多部分。其中 DTCM 的速度是比通常的内存要快的,缺点是不支持DMA。

这个项目对性能有一定需求,所以修改了链接脚本 STM32H743VITX_FLASH.ld,需要用到DMA部分的数据手动定位到 RAM_D1 ,其它部分默认定位到 DTCMRAM

修改后的链接脚本大致如下(删除了与本文关系不大的内容):

/* Specify the memory areas */
MEMORY
{FLASH (rx)     : ORIGIN = 0x08020000, LENGTH = 384KDTCMRAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 128KRAM_D1 (xrw)   : ORIGIN = 0x24000000, LENGTH = 512K
}/* Define output sections */
SECTIONS
{/* Initialized data sections goes into RAM, load LMA copy after code */.data :{} >DTCMRAM AT> FLASH/* Uninitialized data section */.bss :{} >DTCMRAM/* User_heap_stack section, used to check that there is enough RAM left */._user_heap_stack :{} >DTCMRAM.ram_d1 :{. = ALIGN(4);. = ALIGN(4);} >RAM_D1
}

链接脚本中我把大部分数据都定位到了 DTCMRAM ,然后添加了一段 ram_d1 区域,后续代码中使用下面方式就可以把数据定位到这个区域:

__attribute__((section(".ram_d1"))) uint8_t buffer[256];

到这里正常调试或者生成 .elf .hex 文件都没啥问题,但是生成的 .bin 文件就会非常大(几百MB):
在这里插入图片描述

问题的原因是因为固件数据几个区域不连续,间断的空间都用默认数据进行了填充,导致了 .bin 文件非常大。

解决方法

使用 NOLOAD 指令可以处理该问题:

  .ram_d1 (NOLOAD):{. = ALIGN(4);. = ALIGN(4);} >RAM_D1

需要注意的是该使用该关键词后定义在该段的数据需要手动初始化(未验证)。

更多拓展

ST中文网有个文档有介绍STM32CubeIDE链接文件相关内容,《LAT0816 - STM32CubeIDE实用技巧之ld链接文件》,可以下面地址下载到:
https://gitcode.com/Open-source-documentation-tutorial/3ad05


http://www.ppmy.cn/embedded/159303.html

相关文章

【高级篇 / IPv6】(7.6) ❀ 03. 宽带IPv6 - ADSL拨号宽带上网配置 ❀ FortiGate 防火墙

【简介】大部分ADSL拨号宽带都支持IPv6,这里以ADSL拨号宽带为例,演示在FortiGate防火墙上的配置方法。 准备工作 同上篇文章一样,为了兼顾不熟悉FortiGate防火墙的朋友,我们从基础操作进行演示,熟练的朋友可以跳过这一…

解锁计算机视觉算法:从理论到代码实战

目录 计算机视觉:开启智能视觉新时代 核心算法大揭秘 传统计算机视觉算法 深度学习驱动的计算机视觉算法 基于深度学习框架的算法实现 应用领域大放送 自动驾驶 医疗影像分析 安防与监控 其他领域 挑战与应对策略 数据质量问题 计算资源需求 模型鲁棒…

汽车中控屏HMI界面,安全和便捷是设计的两大准则。

在汽车智能化的浪潮中,汽车中控屏 HMI(Human - Machine Interface,人机交互界面)界面已成为车辆与驾驶者沟通的关键桥梁。它不仅集成了众多车辆功能的控制,还承担着信息展示与交互的重任。而在其设计过程中&#xff0c…

【知识科普】HTTP相关内容说明

关于http的一些常识性知识 http头信息**示例****请求头示例****响应头示例** http响应码**状态码分类****常见状态码示例****成功****重定向****客户端错误****服务器错误** HTTP/1.1 和 HTTP/2**1. HTTP/1.1****2. HTTP/2****3. HTTP/1.1 和 HTTP/2 的区别****4. HTTP/2 的核心…

【华为OD-E卷 - 磁盘容量排序 100分(python、java、c++、js、c)】

【华为OD-E卷 - 磁盘容量排序 100分(python、java、c、js、c)】 题目 磁盘的容量单位常用的有M,G,T这三个等级, 它们之间的换算关系为1T 1024G,1G 1024M, 现在给定n块磁盘的容量&#xff0c…

深入解析 Linux 内核中的页面错误处理机制

在现代操作系统中,页面错误(Page Fault)是内存管理的重要组成部分。当程序试图访问未映射到物理内存的虚拟内存地址时,CPU 会触发页面错误异常。Linux 内核通过一系列复杂的机制来处理这些异常,确保系统的稳定性和性能。本文将深入解析 Linux 内核中处理页面错误的核心代码…

51单片机 01 LED

一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC;如果没有找到hex文件(在objects文件夹下),在keil中options for target-output- 勾选 create hex file。 如果要修改编程 :重新编译-下载/编程-单片机重…

w188校园商铺管理系统设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…