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.

[参考译文] 编译器/TM4C129DNCPDT:自定义引导加载程序将固件加载到闪存中的非标准存储器位置

Guru**** 2487425 points
Other Parts Discussed in Thread: TM4C129DNCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/734561/compiler-tm4c129dncpdt-custom-bootloader-loading-firmware-to-non-standard-memory-location-in-flash

器件型号:TM4C129DNCPDT

工具/软件:TI C/C++编译器

大家好、

我正在为 TM4C129DNCPDT 开发定制的引导加载程序。 我们需要使用 UART1执行代码更新、 由于 Tiva 的内置引导加载程序不能在该 UART 通道上使用、因此我们需要构建自己的引导加载程序(如果可以使用它、请向我指出文档的方向、我的理解是您只能将它与 UART0或 USB 配合使用)。 除了 TivaWare 库之外、我还在使用 TI-RTOS、这是值得的。

除此之外、我们还希望在闪存中进行特殊设置。 我们需要两个我们的计划所在的位置。 我们的想法是、我们始终在闪存中有一个工作版本的代码、因此、如果代码更新失败或文件损坏、我们可以返回到原始代码上、处理器继续工作。 但是、这意味着我们需要在闪存中放置固件的第二个位置。  

我对所有这些都有几个问题:

  1. FlashProgram 函数将字节直接放入闪存中。 如果我使用通过调用"tiobj2bin"生成的.bin 文件并使用 FlashProgram 将.bin 文件放入闪存中、我的代码是否会按预期运行? 如果没有、我需要做什么来使 FlashProgram 将我的代码正确地放入闪存中?
  2. 函数的寻址是相对的还是绝对的? 这意味着、如果我在位置0x00000000处有代码、并且在0x00050000处刷写了新版本的代码、在调用函数时、我的新代码集是否会跳转/分支回旧代码? 或者函数调用是否会跳转到新的代码位置? 这可以是链接器设置吗?
  3. 如何限制程序的可用闪存以避免溢出? 我相信它是通过.cmd 文件实现的、但我以前不必这么做、所以我只想确保。

我希望这是有道理的、我知道这相当复杂、与 Tiva 的通用引导加载程序不同。 如果我的一些问题将通过文档得到解答、请向我指出文档的方向。 感谢你能抽出时间。

-Tom

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

    我没有关于启动加载程序的专业知识。  但我可以给...

    [引用 user="Thomas Jacobson"]我们希望在两个位置运行我们的程序。

    TI ARM 编译器不支持您的请求。  函数必须驻留在一个地址。  全局数据也是如此。

    谢谢、此致、

    乔治

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

    [引用 USER="Thomas Jacobson]我们希望在两个位置运行我们的程序。[/引用]具有1MB 闪存的 TM4C129器件具有闪存镜像、允许闪存中同时存在多个软件副本、并通过硬件地址转换交换上部和下部存储体的地址。 请参阅 数据表中的第8.2.3.3节"闪存镜像模式"。

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

    感谢您的回答。 我认为我需要进一步澄清。 我们的产品最初会加载一个版本的固件。 当需要进行代码更新时、我们会将新固件写入备用位置、然后从该位置运行。 如果有另一个更新、它将写入原始位置、然后我们从那里运行、每次我们需要更新代码时来回 ping 通。

    我认为闪存镜像模式正是我要寻找的模式、但我不确定如何实现它。 我只想调用 FlashProgram()直到上部存储块被完全加载,然后设置 FMME 位吗? 您是否碰巧了解更多与闪存镜像模式相关的文档、或者可能是一个编码示例?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我希望我能为您提供一个示例(如果我能找到时间、编写一个示例会很有趣)。 其概念是代码的第一部分、即引导加载程序、在下部和上部存储器中都是相同的。 您读取了一些确定是否镜像闪存的内容。 可能是仿真的 EEPROM 值。 将代码编程到上半部分时、可以让引导加载程序偏移地址、也可以从链接器命令文件中的运行地址指定单独的加载地址。