ARM裸机程序编译-控制flash写入
ARM bare-metal program compilation -control flash writes
我正在尝试在 ARMv6 模拟器上将一些 C 代码编译为 运行,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);
您的构建 linker 脚本(通常是 .ld 文件)确定设备内存的位置以及 linker 部分如何映射到该位置。您的 link 映射不应包含 read-only 内存中的可写部分,否则会失败。
[在 linker 脚本添加到问题后添加]
您的 linker 脚本似乎不正常,因为缺少 .data
部分:
.data : { *(.data) } > ram
如果没有它,就不清楚 linker 将如何处理静态初始化数据。
您的问题还指出 RAM 从 0x800000
开始,但 linker 脚本清楚地将其定位在 0x40000000
。也许这种对内存映射的误解导致您错误地认为正在写入 ROM 区域?
我正在尝试在 ARMv6 模拟器上将一些 C 代码编译为 运行,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);
您的构建 linker 脚本(通常是 .ld 文件)确定设备内存的位置以及 linker 部分如何映射到该位置。您的 link 映射不应包含 read-only 内存中的可写部分,否则会失败。
[在 linker 脚本添加到问题后添加]
您的 linker 脚本似乎不正常,因为缺少 .data
部分:
.data : { *(.data) } > ram
如果没有它,就不清楚 linker 将如何处理静态初始化数据。
您的问题还指出 RAM 从 0x800000
开始,但 linker 脚本清楚地将其定位在 0x40000000
。也许这种对内存映射的误解导致您错误地认为正在写入 ROM 区域?