[STM32H7] STM32H753IIT6 HEX文件错误地包含了RAM段

[复制链接]
1763|27
SocialButterfly 发表于 2025-10-1 09:11 | 显示全部楼层 |阅读模式
该芯片包含多个RAM段...即ITCMRAM(0x00000000)、DTCMRAM(0x20000000)、RAM_D1(0x24000000)、RAM_D2(0x30000000)、RAM_D3(0x38000000)。

出现的问题是:当将变量 specifically 加载到RAM_D2和RAM_D3(0x30000000)时,生成的Hex文件将该段作为可加载段包含在内,这进而导致STM32CubeProgrammer加载该段时出现问题。当在链接脚本中应用(NOLOAD)选项时,确实解决了这个问题,但不想用这个选项,因为这样我们就必须特殊处理代码中的变量初始值...

biechedan 发表于 2025-10-6 21:32 | 显示全部楼层
STM32H753IIT6的RAM_D2和RAM_D3属于非紧密耦合内存,通常用于存储运行时数据而非初始化代码。
1988020566 发表于 2025-10-6 22:48 | 显示全部楼层
在SECTIONS中强制指定变量存储位置,同时避免生成加载段
eefas 发表于 2025-10-7 21:44 | 显示全部楼层
这些变量在 RAM_D2/RAM_D3 上,而 HEX 不应该包含这些 RAM 区域的初始值​
sdlls 发表于 2025-10-8 08:56 | 显示全部楼层
在代码中使用编译器扩展属性强制变量进入指定段,同时保持初始化能力
mmbs 发表于 2025-10-8 09:26 | 显示全部楼层
生成.map文件:确认变量已正确分配到指定段
二进制对比:使用binwalk等工具分析Hex文件结构
内存验证:在调试器中查看RAM_D2/D3的实际内容
边界检查:确保不超出各RAM段的物理边界
vivilyly 发表于 2025-10-8 12:27 | 显示全部楼层

将某些全局变量放到特定的 RAM 区域
pmp 发表于 2025-10-8 13:10 | 显示全部楼层
通过编译器属性+链接脚本实现细粒度控制
cashrwood 发表于 2025-10-8 13:57 | 显示全部楼层
在代码中显式地将变量放置到指定的RAM段中,使用__attribute__((section(".ram_d2")))和__attribute__((section(".ram_d3")))。
chenci2013 发表于 2025-10-8 15:15 | 显示全部楼层
在启动文件中添加自定义初始化函数,确保非加载段变量正确初始化
belindagraham 发表于 2025-10-8 16:59 | 显示全部楼层
为什么NOLOAD会导致问题?              
robertesth 发表于 2025-10-8 19:56 | 显示全部楼层
配置内存保护单元(MPU)限制访问权限,防止意外加载
643757107 发表于 2025-10-8 21:32 | 显示全部楼层
配置没问题,生成的HEX就不会有问题。
loutin 发表于 2025-10-10 11:38 | 显示全部楼层
RAM_D3位于备份域              
mickit 发表于 2025-10-10 12:46 | 显示全部楼层
保留变量初始值在Hex文件中              
ccook11 发表于 2025-10-10 15:40 | 显示全部楼层
为RAM_D2/D3添加NOLOAD属性仅影响加载行为
uytyu 发表于 2025-10-10 16:45 | 显示全部楼层
初始化数据可能未在启动代码中正确处理,导致加载时地址冲突或数据无效
albertaabbot 发表于 2025-10-11 12:28 | 显示全部楼层
ST官方提供的H7系列工程中,RAM_D2/D3通常通过__attribute__或链接脚本管理,可查阅其分散加载文件配置
sanfuzi 发表于 2025-10-11 15:17 | 显示全部楼层
可以考虑使用NOLOAD选项来避免生成的Hex文件包含RAM段。
robincotton 发表于 2025-10-11 16:07 | 显示全部楼层
频繁访问RAM_D2/D3可能因总线仲裁导致延迟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

62

帖子

0

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