compilation - ARM 裸机程序编译 - 控制闪存写入
问题描述
我正在尝试编译一些 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
部分:
.data : { *(.data) } > ram
否则,尚不清楚链接器将如何处理静态初始化数据。
此外,您的问题指出 RAM 从 开始0x800000
,但链接描述文件清楚地将其定位在0x40000000
。也许对内存映射的这种误解导致您错误地认为正在发生对 ROM 区域的写入?
推荐阅读
- python - Pandas 从多个其他列和行子集计算新列
- sas - SAS,切换行和列,以获得结果
- fortran - f2py 是否支持类型仅作为 intent(inout) 的函数?
- r - R:具有可变预测范围的 Arima() 每日预测序列(forecast())
- javascript - 与允许用户从输入生成函数相关的风险
- python - 无法在 Python 中使用 xattr 设置 MacOS Finder 评论元数据
- json - xml 数据解析数据正在使用 rss 的颤振应用程序中显示
- flutter - flutter-firestore:如何计算地图中所有数组中的所有元素
- node.js - 领域读取具有关系的数据
- azure - 使用 Azure AD 进行身份验证的应用程序的 JMeter 负载测试