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.

[参考译文] TMS320F28379D:可重定位库

Guru**** 2539500 points
Other Parts Discussed in Thread: TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1391574/tms320f28379d-relocatable-library

器件型号:TMS320F28379D

工具与软件:

您好!

我有一个供 TMS320F28379D 的两个 CPU 使用的库(F021)。 两个 CPU 使用库中的相同函数子集、并且库在闪存中具有加载地址、在 RAM 中具有运行地址。

现在、为了节省一些闪存存储器、我需要一个 CPU (本例中为 CPU2)将库包含在闪存中、并将库复制到 RAM 中(如往常一样)。 由于两个 CPU 都无法执行共享 RAM (遗憾的是)、共享库的一个副本(例如)进入 GS0、另一个副本将复制到 GS1。 现在、由于两个副本具有不同的运行地址、我至少必须调整副本中的。

我目前的方法是将库链接两次成输出文件、使用不同的运行地址、将这两个文件转换成一个十六进制文件、然后使用手写工具在这两个十六进制文件上创建一个差异。 差异以 C 数组的形式写入到文本文件中。 然后、CPU2将与共享库的一个副本(例如、使用 CPU1的加载地址)和 C 数组链接、其中包含各展位版本之间的差异。 在启动期间、CPU2将共享库复制到 GS0和 GS1、并将差异应用于 GS1。

问题:只需使用 TI 提供的工具就可以解决这个问题吗? 我已经阅读了所有涵盖 --relocatable 选项的链接器文档、但有足够的详细信息可以查看、如果这样、我可以检索共享库中的代码位置表、如果库的运行地址发生更改、需要更正该表。

此致、请提前表示感谢、

Torsten

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

    尊敬的 Torsten:

    让我来看看这个问题、给您回过来。

    此致、

    Delaney

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

    尊敬的 Torsten:

    很抱歉耽误你的时间。 我想我对你的问题有点困惑。 如果您的库位于 say a C 文件中、并且您希望能够从 CPU1和 CPU2 (单独)调用相同的库函数 、您可以按照前面提到的那样执行、为每个 CPU 使用链接器 cmd 文件将库分配给不同的全局共享 RAM、每个 CPU 将调用它分配的库版本。 您提到的其他步骤的目的是什么?

    此致、

    Delaney

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

    尊敬的 Delaney:

    链接库以从特定但不同的 RAM 位置运行之后、生成的二进制文件会略有不同(基本上、跳转会不同、因为目标地址会不同)。 对于3k 字节的大库、如 TI 闪存库(F021)、当以静态方式链接时、与特定地址之间只有26处差异。

    我想保护一些闪存存储器(即上面的3k)并且只将库中所需的代码存储在一个 CPU 的闪存中一次。

    我目前要做的是、将库链接两次、使用两个不同的运行地址、计算生成的库的差异、并存储差异、以便我的应用可以访问它们(通过生成一些 C 代码)。 然后其中一个 CPU 将库的一个版本存储在闪存中。 然后、这个 CPU 为两个 CPU 将库从闪存复制到 RAM 中(两个副本)、然后使用构建时计算出的差异校正一个副本。

    这种方法使编译非常复杂、因为我需要之前编译该 diff 工具、这 会导致目标平台的编译(TMS320F28379D)和编译平台的编译之间存在依赖关系。

    理想情况下、我会坚持使用 TI 提供的工具(hextool、连接器、编译器等)。 因此、我想知道是否有办法在加载时生成某种可重定位库并多余的所需重定位信息来修复库中使用的 absolve 地址?

    此致

    Torsten

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

    尊敬的 Torsten:

    感谢您的澄清。 让我咨询另一位专家、然后回复您、看看我们是否有更好的解决方案可用。

    此致、

    Delaney

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

    尊敬的 Torsten:

    在咨询了其他 CLA 专家之后、我理解您的问题、非常抱歉。  我不知道使用我们的工具执行此操作的方法、但我会让编译器专家循环、看看他们是否知道方法。

    此致、

    Delaney

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

    尊敬的 Delany:

    非常感谢您的努力。 我仍很好奇我的问题是否有 TI 的解决方案! :-)

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

    尊敬的 Torsten:

    编译器专家还会为您解答一些其他问题:

    1. 您是否正在创建两个独立的.out 文件、每个 CPU 一个?
    2. 如果是这样、每个.out 文件是根据相同的源和库组合构建的、但 做出了不同的构建时间选择。 即、根据#if 语句?

    此致、

    Delaney

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

    尊敬的 Delaney:

    是的、有两个不同的输出文件。 每个 CPU 一个。 第一个缓存块只是链接到"共享"库、但该缓存块标记为"type=DSECT"、而第二个 CPU 的 out 文件则包含为 CPU2运行地址链接的实际库。 CPU2随后将库复制到 CPU1和 CPU2的共享 RAM 中、此外、还应用所需的更改来针对 CPU2的不同运行地址修复库。

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

    尊敬的 Torsten:

    明白了、感谢您的澄清。

    此致、

    Delaney

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

    尊敬的 Torsten:

    遗憾的是、我们似乎没有任何工具可以完成您尝试实现的目标。 我建议坚持您当前的方法。

    此致、

    Delaney

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

    你好、

    感谢您花时间来了解这一点!

    此致

    Torsten