我正在尝试编译一些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);
答案 0 :(得分:0)
您的构建链接程序脚本(通常是.ld文件)确定设备内存的位置以及链接程序节如何映射到该位置。您的链接映射不应在只读内存中包含可写部分,否则会失败。
[在链接脚本添加到问题后添加]
您的链接描述文件似乎缺少.data
部分,很不寻常:
.data : { *(.data) } > ram
不清楚不清楚链接器将如何处理静态初始化数据。
您的问题还指出RAM从0x800000
开始,但是链接脚本清楚地将其定位在0x40000000
。也许您对内存映射的这种误解使您错误地认为正在发生对ROM区域的写操作?