Compilation ARM裸机程序编译-控制闪存写入
我试图编译一些C代码以在ARMv6模拟器上运行,闪存从@0x0开始,RAM从0x800000开始。现在,我可以把二进制文件从模拟器上传送出去了 但是,我希望生成的指令不包括对闪存的任何写入,并且仅在复制RAM后在RAM内存中操作。这可能吗 我正在使用GNU工具链进行编译 这是我当前的链接器脚本: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
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