在ROM中组装成绝对地址。

在ROM中组装成绝对地址。

问题描述:

我正在用Keil uV5使用STMF4。我写了一个固件更新程序,它通过一个RS232将新的固件补丁复制到RAM中,然后将其写入位于0x08020000的ROM位置,该位置位于应用程序代码末尾以上的位置。 尽管是在低地址测试过的代码副本完美副本,但0x08020000上的修补程序不会运行,并且会立即发生硬故障。我已经设置了分散文件以包含更高的ROM地址和mem映射ini文件。所有40kb的应用程序完全是汇编程序的速度,实际上我不知道C的单行。我没有使用任何库!@ $#在ROM中组装成绝对地址。

我想知道处理器如何获取信息在0x08020000执行,但高兴地在这个位置读取ROM,尽管事实上我的分散文件和mem映射ini文件似乎没问题。 我很确定我可以写一些超过0x08020000的垃圾代码,其中很多,我可以擦除块并用我的更新补丁覆盖它,它会愚弄任何妨碍我的代码执行的东西。但那会很麻烦。有任何想法吗?

+1

你链接它0x08020000还是你林k它为0x08000000并试图运行它在0x08020000?向我们展示前几百字节的反汇编...... –

+0

并且由于这不是可引导代码(不是在AFAIK的那个地址),您的入口点与您在0x08000000处运行的东西不同? (反汇编应该说是相当数量的,如果因为某些原因(不使用gnu工具)不能反汇编,那么hexdump就是原始二进制文件的开头。 –

+0

等待你有多少闪存? –

潜在的答案是:

  1. 链接描述 - 定义出现在您的.text段开始(另有部分以及例如.RODATA使用位置独立设置

  2. 编译(我可以帮助你用gcc设置,但没有KEIL),我认为这篇文章是关于KEIL。http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0097a/armcc_bcfjjdfj.htm

+0

仍然必须能够分支到一个非标准的地址与cortex-m不是分支到0x0802000在这种情况下为0(如果这是用向量表构建的,则位置独立或以其他方式)。我猜OP没有回来,所以会看到这个问题去... –

+0

@old_timer - 我同意很不清楚的问题。当然,他不能从那里引导。 –