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.

[参考译文] TMS320F28375S:在一个闪存地址链接的同一应用程序从两个闪存组正确运行 — C2000 上是否有预期行为?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1612284/tms320f28375s-same-application-linked-at-one-flash-address-runs-correctly-from-both-flash-banks---expected-behavior-on-c2000

器件型号: TMS320F28375S

TI 团队大家好、

我正在开发一个具有双闪存组(闪存组 0 和闪存组 1)和自定义 CAN 引导加载程序的 C2000 器件。 我试图了解观察到的与链接器地址和闪存执行相关的行为、该行为似乎与常见指导有所不同。

我的应用程序从地址 0x088000(闪存组 0)开始链接闪存。 根据该构建结果、我生成一个 TI-TXT 文件。 刷写到闪存组 0 时、我的引导加载程序会按照生成的内容完全对 TI-TXT 文件进行编程。 当将同一应用程序刷写到闪存组 1 时、在读取文件时、我会在将其编程到闪存之前为每个地址添加一个固定偏移 0x40000。 这样、相同的应用映像存在于两个具有相同内部布局的组中、仅偏移了恒定值。 表示一个代码从 0x88000 到末尾(闪存存储体 0)、相同的代码从 0xc8000 到末尾(闪存存储体 1)。

在引导时、引导加载程序选择活动组并跳转到该组中的相应应用程序入口点。 即使应用程序仅针对 0x088000 闪存地址进行链接、并且没有实施明确的运行时重定位逻辑、该应用程序也能从闪存组 0 和闪存组 1 正确运行。

在大型应用中可以观察到这种行为、且不限于简单的测试用例。 该应用使用 PIE 和多个中断、包含切换实例语句、使用 Driverlib、并且从任一闪存组正常运行、不会发生崩溃或不正确的行为。

从一般 C2000 文档和 LFU 示例中、通常会指出、应用程序应专门链接它们执行的闪存地址、并且从不同的闪存组运行时、需要单独的链接器文件或重定位逻辑。 根据这一指导、我预计这种方法在从闪存组 1 运行时会失败、但在实践中它运行可靠。

我想澄清一下 C2000 器件上是否会出现这种行为。 如果不是、在什么具体条件下、这种方法会失败? 这种做法被认为是不受支持的、但实际上是可行的、还是正式不鼓励? 此外、是否有可能导致此行为意外中断的编译器选项或未来工具链更改?

我正在尝试了解这种做法在实践中发挥作用的建筑原因,以及在适当的限制下依赖是否安全。

我将连接链接器文件 FYR.2837xS_FLASH_CLA_lnk_cpu1.zip 

感谢您抽出宝贵的时间提供指导。

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

    您好、

    该专家目前正在运营、将于下周返回。 请等待他们返回后的回复。  

    此致、
    Aj Favela.  

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

    您好:

    如果在跳转命令中使用了任何绝对地址、程序将返回到原始固件。 鉴于您正在对完全相同的应用进行两次编程、 您能否确认新固件是否正在执行? 如果您不从闪存组 0 应用修改 codestart、那么无论如何、器件都会从闪存组 1 分支回闪存组 0 的 codestartbranch。

    此致、
    马特

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

    尊敬的 Matt:

    感谢您的解释。 这有助于阐明关于绝对分支的关注点和codestart

    我的后续行动是关于双组更新的推荐架构方法。 我的要求是、当前运行的应用保持在活动组中、同时新固件始终编程到非活动组中、然后交换组。 从我看到的内容来看、常见的指导是维护两个使用两个不同链接器文件的单独编译版本、每个文件都链接到特定的闪存组。

    但是、这在更新期间会产生一个实际问题、因为它需要手动跟踪哪个映像与哪个组相对应。

    是否有一种更干净的 TI 支持方法、即引导加载程序处理组选择、同时仍保持应用结构一致? 在这里、我想了解 TI 认为正确的长期解决方案。

    此致、

    Muzammil

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

    您好:

    F28x 器件不支持真正的 A-B 闪存组交换(但现在最新的 F29x 架构支持)。  F28x 的一般建议是维护与每个闪存组的构建配置相对应的不同链接器命令文件。

    我知道这种方法不切实际、但另一个选择是利用 C2000 Hex Utility 来唯一地命名 组 0 和组 1 版本的 TI-TXT 输出。 这可以帮助 您 跟踪不同构建配置中的应用程序。

    此致、
    马特