You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM Cortex-M3 SRAM超出4K地址无法访问问题求助

为何修改链接脚本后无法访问0x20002000内存?

你的问题根源是QEMU模拟的STM32VLDISCOVERY硬件本身的RAM范围有限,这和ARM Cortex-M3架构规格无关——Cortex-M3只是处理器架构,具体芯片的RAM大小与地址范围由厂商定义。

核心原因

STM32VLDISCOVERY开发板搭载的STM32F100RB芯片,其内置RAM的有效范围是0x20000000 到 0x20001FFF(共8KB,即0x2000字节)。你修改后的链接脚本把RAM起始地址设为0x20002000,这个地址已经超出了该芯片的实际RAM边界,QEMU严格模拟硬件行为,因此会返回"无法访问内存"的错误。

额外问题点

  1. 你设置的__stack_end = 0x20001000虽然在有效RAM范围内,但链接脚本中定义的RAM段从0x20002000开始,栈区域与后续的.data/.bss段完全分离,既浪费了中间的RAM空间,也不符合常规的内存布局(通常栈从RAM高地址向下生长,.data/.bss从RAM低地址向上分配)。
  2. 调试信息中dst_end = 0x0,是因为链接器发现你定义的RAM区域(0x20002000-0x20004FFF)与硬件实际RAM不匹配,导致无法正确计算.data段的结束地址,进而让你的手动拷贝逻辑出现异常。

解决方法

将链接脚本的RAM配置改回符合STM32F100RB硬件的范围,示例如下:

MEMORY
{
    MEM : ORIGIN = 0x08000000, LENGTH = 0x400000
    RAM : ORIGIN = 0x20000000, LENGTH = 0x2000  /* 8KB RAM,匹配STM32F100RB规格 */
}

__stack_end = 0x20002000;  /* 栈从RAM最高地址开始向下生长 */

你可以继续保留手动拷贝.data段的逻辑,也可以使用标准启动文件完成初始化,避免手动操作的潜在错误。

内容的提问来源于stack exchange,提问作者devilbuild

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:16:14