当前位置: 首页 > news >正文

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

文章目录

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

问题描述

最近在一个项目中使用了 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.lryc.cn/news/527381.html

相关文章:

  • 【暴力洗盘】的实战技术解读-北玻股份和三变科技
  • Day42:列表的组合
  • mantisbt添加修改用户密码
  • DroneXtract:一款针对无人机的网络安全数字取证工具
  • 简单树形菜单
  • Windows 靶机常见服务、端口及枚举工具与方法全解析:SMB、LDAP、NFS、RDP、WinRM、DNS
  • RNN实现阿尔茨海默症的诊断识别
  • 14-6-1C++STL的list
  • Redis事务机制详解与Springboot项目中的使用
  • DeepSeek-R1,用Ollama跑起来
  • Leecode刷题C语言之组合总和②
  • YOLOv8改进,YOLOv8检测头融合DynamicHead,并添加小目标检测层(四头检测),适合目标检测、分割等,全网独发
  • 【PyQt】QThread快速创建多线程任务
  • 智能码二维码的成本效益分析
  • 企业财务管理系统的需求设计和实现
  • Springboot集成Swagger和Springdoc详解
  • 类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件
  • ui-automator定位官网文档下载及使用
  • 董事会办公管理系统的需求设计和实现
  • ESP32和STM32在处理中断方面的区别
  • 零售业革命:改变行业的顶级物联网用例
  • 字符串算法笔记
  • 在Ubuntu上用Llama Factory命令行微调Qwen2.5的简单过程
  • ThinkPhp伪静态设置后,访问静态资源也提示找不到Controller
  • JavaScript赋能智能网页设计
  • 基于STM32的阿里云智能农业大棚
  • 80,【4】BUUCTF WEB [SUCTF 2018]MultiSQL
  • 深入探索imi框架:PHP Swoole的高性能协程应用实践
  • 【算法篇·更新中】C++秒入门(附练习用题目)
  • 对神经网络基础的理解