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

记一次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 = 384K
  DTCMRAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 128K
  RAM_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.kler.cn/a/520134.html

相关文章:

  • 随笔十七、eth0单网卡绑定双ip的问题
  • 27. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表服务
  • Go语言开发项目文件规范
  • RocketMQ 的 Topic 和消息队列MessageQueue信息,是怎么分布到Broker的?怎么负载均衡到Broker的?
  • 网盘资源查找工具---AI功能
  • 【Nginx】【SSE】【WebSocket】Nginx配置SSE,WebSocket的转发请求
  • 不同操作系统(Windows、Linux)上安装和配置Tomcat的详细教程
  • Java 从数组中查找重复元素的几种方法
  • Scratch游戏作品 | 僵尸来袭——生存大战,保卫你的领地!
  • introJs去实现新手指引
  • 第十四讲 JDBC数据库
  • 在亚马逊云科技上使用Luma AI Ray2视频模型生成炫酷视频 (上)
  • Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)
  • Coze插件开发之基于已有服务创建并上架到扣子商店
  • 论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)
  • Java 多线程编程介绍
  • linux-ubuntu学习笔记碎记
  • Git 分支管理与多人协作实战指南
  • 【学习笔记】深度学习网络-深度前馈网络(MLP)
  • ios swift画中画技术尝试
  • 使用Docker构建Node.js应用的详细指南
  • chrome源码剖析—进程通信
  • 99.16 金融难点通俗解释:营业总收入
  • 关于CAN(FD)转以太网详细介绍
  • Hive的安装与部署
  • 算法随笔_23: 通过删除字母匹配到字典里最长单词