This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C129XNCZAD:从闪存中的两个不同位置运行主代码

Guru**** 2341520 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/603986/tm4c129xnczad-running-main-code-from-two-different-locations-in-flash

器件型号:TM4C129XNCZAD

我已经看了一段时间、但我不确定如何处理这种情况。  我有一个小引导程序、我在0x00000000加载了该程序。  它运行正常、从该程序、我想跳转到0x8000或0x14000的主代码。  想法是、我将始终在器件上拥有已知的良好版本、但可以在另一个组中升级软件、并在启动时使用该版本。  我拥有自己的引导加载程序的主要原因是、我通过专有接口而不是串行接口、USB 等进行更新

我让引导程序选择0x8000处的代码并正确运行。  此主代码已使用.cmd 文件进行编译、告知它正在加载0x8000。  从实际角度来看、假设每个版本在不同的地址加载、则有两个不同的编译版本是没有意义的、尤其是因为我不知道接下来要升级哪个银行。  引导软件将新代码加载到不包含最后已知良好版本的组中。

如何解决这个问题?  我已将相同的主代码加载到0x8000和0x14000中、引导加载程序将运行其中一个、但例如、如果我删除了0x8000处的代码、它将不会在0x14000处运行代码。

这似乎是一个相当常见的用例、因此必须有一种解决方法、我没有找到。

James

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您的编译器支持、则应该为位置无关代码提供编译器/链接选项。

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    James、

    我不太确定你可以按照你描述的方式做事情。 当您编译/链接程序时、所有地址都是"硬"定义的。 如果将应用程序编译为在从0x8000开始的组上运行、则如果将精确的代码复制到0x14000位置、该应用程序将不起作用。

    我们所做的同样目的是始终从固定位置运行"良好"程序。 引导加载程序位于0x00、有效程序在0x4000处运行。 如果我们发送更新、它将临时存储在单独的闪存区域中(它也可能位于外部存储器上)、引导加载程序将在下次引导时传输内容、由指示存在新固件的标志进行指导。

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    James 是对的、Bruno、这应该是可能的。 他的编译器是否支持这一问题是另一个问题(IAR 似乎支持它)。

    对绝对地址的调用将成为对偏移量的调用、跳转必须是相对的等。

    Robert