STM32H753IIT6 HEX文件错误地包含了RAM段
该芯片包含多个RAM段...即ITCMRAM(0x00000000)、DTCMRAM(0x20000000)、RAM_D1(0x24000000)、RAM_D2(0x30000000)、RAM_D3(0x38000000)。出现的问题是:当将变量 specifically 加载到RAM_D2和RAM_D3(0x30000000)时,生成的Hex文件将该段作为可加载段包含在内,这进而导致STM32CubeProgrammer加载该段时出现问题。当在链接脚本中应用(NOLOAD)选项时,确实解决了这个问题,但不想用这个选项,因为这样我们就必须特殊处理代码中的变量初始值...
STM32H753IIT6的RAM_D2和RAM_D3属于非紧密耦合内存,通常用于存储运行时数据而非初始化代码。 在SECTIONS中强制指定变量存储位置,同时避免生成加载段 这些变量在 RAM_D2/RAM_D3 上,而 HEX 不应该包含这些 RAM 区域的初始值 在代码中使用编译器扩展属性强制变量进入指定段,同时保持初始化能力 生成.map文件:确认变量已正确分配到指定段
二进制对比:使用binwalk等工具分析Hex文件结构
内存验证:在调试器中查看RAM_D2/D3的实际内容
边界检查:确保不超出各RAM段的物理边界
将某些全局变量放到特定的 RAM 区域 通过编译器属性+链接脚本实现细粒度控制 在代码中显式地将变量放置到指定的RAM段中,使用__attribute__((section(".ram_d2")))和__attribute__((section(".ram_d3")))。 在启动文件中添加自定义初始化函数,确保非加载段变量正确初始化 为什么NOLOAD会导致问题? 配置内存保护单元(MPU)限制访问权限,防止意外加载 配置没问题,生成的HEX就不会有问题。 RAM_D3位于备份域 保留变量初始值在Hex文件中 为RAM_D2/D3添加NOLOAD属性仅影响加载行为 初始化数据可能未在启动代码中正确处理,导致加载时地址冲突或数据无效 ST官方提供的H7系列工程中,RAM_D2/D3通常通过__attribute__或链接脚本管理,可查阅其分散加载文件配置 可以考虑使用NOLOAD选项来避免生成的Hex文件包含RAM段。 频繁访问RAM_D2/D3可能因总线仲裁导致延迟
页:
[1]
2