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

时间:2019-05-30 22:00:06

标签: compilation linker arm embedded bare-metal

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

1 个答案:

答案 0 :(得分:0)

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

[在链接脚本添加到问题后添加]

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

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

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

您的问题还指出RAM从0x800000开始,但是链接脚本清楚地将其定位在0x40000000。也许您对内存映射的这种误解使您错误地认为正在发生对ROM区域的写操作?