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.

[参考译文] 编译器/TMS320F2.8379万D:从TI C++ 6.4 11传输到TI C++ 15.12 .3.LTS的项目上的链接器问题

Guru**** 2609075 points
Other Parts Discussed in Thread: MSP430F2618

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/634171/compiler-tms320f28379d-linker-problems-on-project-transferred-from-ti-c-6-4-11-to-ti-c-15-12-3-lts

部件号:TMS320F2.8379万D
主题中讨论的其他部件:MSP430F2618

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

大家好!

我们有一个测试硬件接口和外部存储器设备的现有项目。 该项目设计用于使用CCS 6.1 .................................................................2和TI C++ 6.4 ................................................................11编译器开发的TMS320F2.8377万D AS目标。 二进制文件仅设计为基于RAM。 对于此项目,一切都很好,运行完美。

对于新的硬件平台,我们希望切换到TMS320F2.8379万D。  由于F2.8377万D和F2.8379万D在硬件接口方面非常相似(或相同),因此我们也希望将此测试项目用于F2.8379万D器件。 F2.8379万D在CCS 6.1 .0中不受支持,因此我们更新到了CCS 6.2 .0。 使用CCS 6.2 0时,编译器也更新到版本15.12 .3.LTS。 我们在CCS 6.2 的新CCS工作区中导入了测试项目,并复制了所有文件,因此我们拥有了项目的完整副本。 如果我们在CCS 6.2 0.0中重建测试项目,但使用TI C++ 6.4 Tm11编译器和链接器(额外安装),一切都正常,我们将得到一个新的二进制文件。 但是,我们切换到TI C++ 15.12 .................3 LTS编译器和链接器,由于新的目标文件不适合RAM内存,我们会遇到一些链接器错误。 我不对配置或项目进行任何其他更改。 如果将原始F2.8377万D项目和新F2.8379万D项目的配置进行比较,除了所请求的编译器和链接器版本之外,所有配置都是相同的。

如果我比较两个内存分配视图, 基于TI C++ 6.4 .................................................................11 (图像1)和 TI C++ 15.12 >3 LTS (图像2)我在原始项目中看到TI库"rts2800_fpu32.lib"在多个函数中被分割,并且目标文件位于不同的内存部分。 在新编译的项目上, “rts2800_fpu32.lib”似乎被处理为单片代码块,因此无法将其放入RAM内存中。

图1

图2.

如果我比较"TI\cc3 6.1 15.12 6.4 .11\lib\src")中"unifile_locale.obj"("cpp _cpp .obj"在"TI\cc3 LTS.0\ccsv6\tools\tools\locale.lib"中   )的源代码"unifilot_locale.lib.i"("TI与6.2 .obj_localon\cc_location.obj.ob"c_"在中),则只包含"unifon.lib.lib.a"。 我尝试扩展命令文件中的内存空间,但 "ununified location.obj"也不适合。

目前我还不知道要做什么, 使用TI C++ 15.12 技术编译器3 LTS编译器和链接器进行构建的测试项目将再次适合RAM内存。 是否有人知道解决方案?

此致

Rudi

PS:作为附件,包含所有源代码和项目文件的测试项目。 (我希望它已上传。 上传过程显示已上传,但我目前看不到附件)

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

    已压缩的项目文件再次上传。

    e2e.ti.com/.../3200_5F00_Systemtest.zip

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

    主要的问题是,从RTS.x.LTS发行版开始,编译器15.12 库的实现非常不同。  有关MCU   编译器v15的文章中标题为STLport C++ RTS的子部分提供了更多详细信息。  在您的情况下,RTS库需要更多的空间。

    Rudolf Richter15 说:
    如果我们在CCS 6.2 中重建测试项目,但使用TI C++ 6.4 11编译器和链接器(额外安装),一切都正常,我们将获得新的二进制文件。[/QUOT]

    欢迎使用此解决方案。

    Rudolf Richter15 说:
    在新编译的项目上, 似乎"rts2800_fpu32.lib"像一个单片代码块一样处理,因此无法将其放置在RAM内存中。

    我不知道你的意思是什么。  当我比较地图文件时,我看不到。  

    谢谢,此致,

    -George

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

    您好,George,

    非常感谢您的快速回答。

    主要的问题是,从RTS.x.LTS发行版开始,编译器15.12 库的实现非常不同。  有关MCU   编译器v15的文章中标题为STLport C++ RTS的子部分提供了更多详细信息。  在您的情况下,RTS库需要更多的空间。

    欢迎使用此解决方案。

    我将测试您的解决方案。

    我不知道你的意思是什么。  当我比较地图文件时,我看不到。

    在内存分配映像1 (C++ 6.4 11编译器和链接器的原始版本)中,所有使用的库函数都单独列出,并详细列出了使用的内存空间(即 '.text.1'部分:"locale0.obj" 1567个单词;"setlocale.obj" 18个单词。 另在RAMGS0310 '.text.3'部分:"_printfi.obj" 3077字;"string.obj" 1590字;...")。 看起来像是 链接器的已知行为。   "rts2800_fpu32.lib"的每个使用过的函数 都作为单个对象代码块处理,并与"rts2800_fpu32.lib"的所有其他函数分开放置在内存空间中。

    相比15.12   之下,内存分配图像2 (C++ LTS编译器和链接程序的原始版本)看起来像"rts2800_fpu32.lib"将作为一个紧凑(“单片”)对象代码块('.text.1'部分:"Unified_locale.obj" 6.8183万字)放置在内存中。  会在每个已使用函数的单独对象代码中拆分,并且每个对象代码会分布在所有内存段中。

    此致

    Rudi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    注释:
    看起来与此类似
    e2e.ti.com/.../61.2198万
    编译器/MSP430F2618:错误#1.0099万-D:程序无法装入可用内存,对“.cinit"部分进行定位失败。将编译器从TI 4.0 v.0 b1更改为16.9 v.3.LTS之后
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [QUETE USER="Rudolf Richter15">相反 ,内存分配图像2 (使用C++ LTS.x 15.12 编译器和链接器的原始版本)看起来像 "rts2800_fpu32.lib",将作为一个紧凑("单片")目标代码块('.text.1'部分:"Unified locale.obj" 6.8183万字)放置在内存中。  会在每个已使用函数的单独对象代码中拆分,并且每个对象代码会分布在所有内存段中。[/QUOT]

    发生了什么。  首先是一些背景。  请阅读文章 链接器命令文件入门中的前半部分。  关注术语输入部分输出部分。  RTS对象文件unical_locale.obj的.text输入部分是6.8183万 (0x10a57)字。  text的内存范围是...

    FLASHE :原点= 0x8.8万,长度= 0x0.8万	/*片上闪存*/
    FLASHF : Origin = 0x9万,length = 0x0.8万	/*片上闪存*/*
    
    跳过多行*/
    
    .text :>> FLASHE | FLASHF 页面= 0 

    内存范围都不足以容纳此输入部分。 要了解为什么无法拆分输入部分,请参阅  链接器命令文件入门文章中标题为“在多个内存范围中拆分输出部分”的子部分。

    谢谢,此致,

    -George

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

    您好,George!

    感谢您的回复。

    内存范围都不足以容纳此输入部分

    这正是问题所在! 对于我们的测试程序,我们只使用RAM内存,不要在闪存中覆盖原始程序。 RAM内存大小为0x1.6万 (GSRAM),0x3000 (LSRAM)和一些更小的部分。 另一方面,我们有一个新的大尺寸代码对象"union_locale.obj",它不能放置在RAM中

    为了解决我们的问题,RAM定位测试程序,我们必须为"unsolice_locale"代码找到一个代码的替换代码。 为此,我首先分析包含树,以了解其中将包含"unified _locale"以及原因。

    此致

    Rudi

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

    由于您使用的是包括ostream等C++ I/O功能,所以包括了Unified locale.obj。 遗憾的是,这些功能与区域设置支持密切相关。

    您可以修改链接程序命令文件,将这两个闪存部分统一为一个更大的部分。

    如果确实要拆分unifone_locale.cpp,请查看该文件的源代码。 它包含多个.cpp文件。 将这些文件从库源目录复制到项目中,以便将它们作为项目的一部分生成。 现在,链接程序将不会尝试链接union_locale.obj,因为所有函数都将在您的项目中。

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

    archeologist 说:

    由于您使用的是包括ostream等C++ I/O功能,所以包括了Unified locale.obj。 遗憾的是,这些功能与区域设置支持密切相关。

    [/引述]

    你好 ,考古学家!

    这就是原因! :-)

    因此,我们有以下选项:

    • 将闪存用于"unusin_locale.obj",但这将覆盖闪存中的原始程序。 糟糕的解决方案!
    • 对库源代码的个别修改。 不可能! 禁止!
    • 重写我们的源代码,不要使用流或其他C++功能和方法。 在这种情况下,我们有一个特殊的源代码,它来自我们的通用源代码。 非常糟糕的解决方案!
    • 我们仍然使用TI C++ 6.4x编译器和链接器,并且一切正常。 我们更喜欢这种解决方案! :-)

    非常感谢您的信息和帮助。

    此致

    Rudi