首页 > 解决方案 > ARM 裸机程序编译 - 控制闪存写入

问题描述

我正在尝试编译一些 C 代码以在 ARMv6 模拟器上运行,闪存从 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);

标签: compilationlinkerarmembeddedbare-metal

解决方案


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

[在链接描述文件添加到问题之后添加]

您的链接描述文件似乎不寻常,因为缺少一个.data部分:

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

否则,尚不清楚链接器将如何处理静态初始化数据。

此外,您的问题指出 RAM 从 开始0x800000,但链接描述文件清楚地将其定位在0x40000000。也许对内存映射的这种误解导致您错误地认为正在发生对 ROM 区域的写入?


推荐阅读