Compilation ARM裸机程序编译-控制闪存写入

Compilation ARM裸机程序编译-控制闪存写入,compilation,linker,arm,embedded,bare-metal,Compilation,Linker,Arm,Embedded,Bare Metal,我试图编译一些C代码以在ARMv6模拟器上运行,闪存从@0x0开始,RAM从0x800000开始。现在,我可以把二进制文件从模拟器上传送出去了 但是,我希望生成的指令不包括对闪存的任何写入,并且仅在复制RAM后在RAM内存中操作。这可能吗 我正在使用GNU工具链进行编译 这是我当前的链接器脚本: MEMORY { rom(rx) : ORIGIN = 0x00000000, LENGTH = 0x00800000 ram(!rx) : ORIGIN = 0x40000000, L

我试图编译一些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);

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

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

您的链接器脚本缺少.data部分,这似乎不寻常:

没有这一点,就不清楚链接器将如何处理静态初始化数据


您的问题还指出RAM从0x800000开始,但链接器脚本明确地将其定位在0x40000000。可能是对内存映射的误解导致您错误地认为正在对ROM区域进行写入?

我不完全理解问题所在。难道你不需要故意调用写flash的函数吗。解决方案不仅仅是不调用这些函数吗?所以0x00000000是只读代码区域,0x800000是读写数据区域。这应该是常见的几乎每一个裸露的金属手臂的例子…你检查了这篇文章吗@巴特:我的问题是,当我编译C代码时,我不确定模拟器中是否有写入flash的ARM指令。如果你能提供证据证明这实际上是与导致它的代码一起发生的,这将非常有用。谢谢,我包括了我的链接器脚本。我将ROM部分指定为不可写。但是,当我在编译后查看反汇编时,如果我的C代码包含printf、fprintf等函数,我会看到写入闪存的情况。有可能改变吗?您必须编写不会写入无效地址空间的代码。工具链无法阻止这一点。工具链将要做的是,当它在memory.text、.data、.bss中分配项时,它将把这些项放在您要求的位置。.text在执行时的作用是您的问题。where.text也是您的问题,但您要求工具将其放在那里。感谢您的回答:where.test是一个问题,这是什么意思?@person314314314他说的是,显然,编写flash很可能是您的代码的问题,而不是工具链的问题。
.data : { *(.data) } > ram