ARM裸机程序编译-控制flash写入

ARM bare-metal program compilation -control flash writes

我正在尝试在 ARMv6 模拟器上将一些 C 代码编译为 运行,FLASH 内存从 @ 0x0 开始,RAM 从 0x800000 开始。现在,我可以很好地从模拟器中传递二进制文件...

但是,我希望生成的指令不包括对闪存的任何写入,并且只在 RAM 内存中运行(在复制 RAM 之后)。这可能吗?

我正在使用 GNU 工具链进行编译。

这是我当前的链接描述文件:

MEMORY
{
    rom(rx) : ORIGIN = 0x00000000, LENGTH = 0x00800000
    ram(!rx) : ORIGIN = 0x40000000, LENGTH = 0x00800000
    h : ORIGIN = 0x40000000, LENGTH = 0x00400000
}

SECTIONS
{
    .text : { *(.text*) } > rom
    .bss : { *(.bss*) } > ram
    .heap : { *(.heap*) } > h
}

    end = ORIGIN(h) + LENGTH(h);

_stacktop = ORIGIN(ram) + LENGTH(ram);

您的构建 linker 脚本(通常是 .ld 文件)确定设备内存的位置以及 linker 部分如何映射到该位置。您的 link 映射不应包含 read-only 内存中的可写部分,否则会失败。

[在 linker 脚本添加到问题后添加]

您的 linker 脚本似乎不正常,因为缺少 .data 部分:

.data : { *(.data) } > ram

如果没有它,就不清楚 linker 将如何处理静态初始化数据。

您的问题还指出 RAM 从 0x800000 开始,但 linker 脚本清楚地将其定位在 0x40000000。也许这种对内存映射的误解导致您错误地认为正在写入 ROM 区域?