[STM32F4] 为什么在Flash和RAM中都创建了“. txt”?

[复制链接]
442|10
 楼主| 我的牙白 发表于 2025-6-2 23:30 | 显示全部楼层 |阅读模式
我使用STM32 CUBDEIDE创建了一个STM32 F405 应用程序。
我在一个文件中声明了几个未初始化的变量。我知道这会影响“. xml”部分,这样会出现一个错误,"section `.bss' will not fit in region `RAM'"。
  • 下图所示为什么在闪存和RAM中都创建了“. txt”?
  • 怎样修改程序才能只使用“.rodata”/". randata”在闪存部分,而不是RAM?已经写了下面的代码块“.rodata”部分在闪存中使用C变量,但它在RAM中创建一个单独的部分称为“RO”.
float C[40000] __attribute__((section ("RO")));
3.相同的目标文件(predict.o)同时存储在“.rodata”和“. rodata”中?
10752683dbb69cdaa4.png

光辉梦境 发表于 2025-6-7 12:00 | 显示全部楼层
在STM32开发中,遇到.bss段超出RAM区域的问题,通常是由于未初始化的全局变量或静态变量过多,超出了芯片的RAM容量
别乱了阵脚 发表于 2025-6-7 12:29 | 显示全部楼层
你提到的.txt段可能是一个笔误,正确的应该是.text段(存放代码和只读数据),而.bss段(存放未初始化的全局和静态变量)超出RAM限制是常见问题
淡漠安然 发表于 2025-6-7 12:59 | 显示全部楼层
你提到使用__attribute__((section("RO")))将变量C放入自定义段RO中,但发现它仍然在RAM中。这是因为默认情况下,未初始化的全局变量会被放入.bss段,而.bss段位于RAM中。
夜阑风雨 发表于 2025-6-7 13:00 | 显示全部楼层
确保变量被声明为const,这样编译器会将其视为只读数据,并放入Flash中。
江河千里 发表于 2025-6-7 13:48 | 显示全部楼层
可以看看链接脚本(.ld文件)是否正确地将.rodata段分配到Flash中,而不是RAM中。链接脚本通常由STM32CubeIDE自动生成,但你可以检查其内容
远山寻你 发表于 2025-6-7 15:00 | 显示全部楼层
使用更小的数据类型,例如,使用float代替double,或使用int16_t代替int32_t
远山寻你 发表于 2025-6-7 15:00 | 显示全部楼层
使用更小的数据类型,例如,使用float代替double,或使用int16_t代替int32_t
三生万物 发表于 2025-6-7 18:06 | 显示全部楼层
启用编译器优化,在STM32CubeIDE中,尝试启用优化选项(如-O2),以减少代码和数据的体积
暖了夏天蓝了海 发表于 2025-6-7 19:21 | 显示全部楼层
相同的目标文件(predict.o)同时出现在.rodata和.rodata中,这可能是链接脚本或编译器选项的问题。确保链接脚本中没有重复定义段,并且编译器选项没有错误地将变量放入多个段中
冰春彩落下 发表于 2025-6-7 23:00 | 显示全部楼层
减少全局变量,尽量使用局部变量或动态内存分配
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

44

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部