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.

[参考译文] TMS320F2812:当小于半满时、连接器无法适合存储器部分

Guru**** 2538955 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1233882/tms320f2812-linker-can-t-fit-in-memory-section-when-less-than-half-full

器件型号:TMS320F2812

您好!

 我在链接器 cmd 文件中有一个工程定义了0x30字的存储器空间。  根据链接器的说法、程序已占用0x15个字、或少于已分配字的一半。  但它会产生下面的错误(如果将其复制粘贴到记事本、可读性要高得多)。  显然"将不能放入可用存储器"这一条件不存在、因此它必须是"需要无法为该段生成 trampoline 的调用站点"。  这意味着什么、它是如何修复的?

谢谢!

 

CMD 文件

外部闪存

  第1页:my_MEM: origin = 0x000010、length = 0x000030

}

 

部分

  vars1 > my_MEM  第1页

  vars2 > my_MEM  第1页

}

链接器输出

#10099-D 程序将无法放入可用内存中,或者该段包含的调用站点需要无法为该段生成 trampoline。 针对"vars1"大小为0x11page 1的段运行对齐/分块失败。  可用存储器范围:            .cmd     /              第104行"C/C++ problem"(C/C++问题)

#10099-D 程序将无法放入可用内存中,或者该段包含的调用站点需要无法为该段生成 trampoline。 对齐/分块的运行放置在"vars2"大小0x4page 1段中失败。  可用存储器范围:            .cmd     /              第105行 C/C++问题

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

    您好!  

    报告的错误是由于代码/数据放置到段中的内存不充足。   

    您的项目中 vars1和 vars2的大小是多少? 这两个项目都被分配给 my_MEM、因此它应该有足够的空间来同时容纳这两个项目。  

    增大 my_MEM 的大小是否可以解决该问题?

    此致

    Siddharth

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

    尊敬的 Siddharth:

    提醒一下、这来自使用旧工具构建的代码和 cmd 文件。  我将对其进行修改、以便使用更新的 CCS 工具。  因此、升级到新工具时会出现问题。

    我不知道这是否会有区别、但我需要注意的是、这两个文件都来自链接到主程序的库中的汇编文件。  vars1和 vars2的大小与链接器计算的0x11和0x4大小或总计0x15相匹配。

    您的请求、原来为它们分配了0x30的旧 cmd 文件。  我现已暂时将其增加至0x71、但链接器仍然无法同时适合这两者。

    因此、我认为问题不在于存储器大小。  它必须是"trampoline"。  你知道吗?

    谢谢!

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

    Ed、  

    之前使用过哪个版本的编译器、您现在正在使用哪个版本?

    trampoline 调用是实现 长分支指令的链接器特定功能。

    假设函数 A 调用函数 B、该函数恰好对于短调用指令来说太远而无法达到。  链接器会插入一个小型 trampoline 函数 T、该函数对函数 B 执行长分支、并重写 A 的调用 、以便它实际上会调用 T。但是、T 必须靠近函数 A 放置、否则 A 中的短调用无法到达它。  因此、T 需要和 A 放在同一节中

    此致

    Siddharth

     

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

    尊敬的 Siddharth:

    感谢您对蹦床的解释。  很有道理的。  我假设访问变量存在等效关联?

    BTW 中的所有相关变量均位于相关工程的汇编文件中、并使用.usect 定义。  除了各自的项目外、它们似乎不用于其他任何地方。  因此问题可能完全出在这些项目中、而编译器切换到使用长访问只是需要的。

    这是有关编译器的信息。  由于重点关注这些工具、因此我还包括了旧工具的命令行选项。

    旧工具 v4.1.1.

    旧的附属项目

    cpp 文件:cl2000 -v28 -c -ea .cls -b -g -ss -k -mf -ml -Mn -mt -mx -PE -OS -o3

    asm 文件:cl2000 -v28 -c -eo .aob-al -as

    链接:         lnk2000 -q -m .map

     

    旧的主工程

    cpp 文件:cl2000 -v28 -c -ea .cls -b -g -ss -k -mf -ml -Mn -mt -mx -PE -OS -o3

    链接:        lnk2000 -q -m - o .abs

     

    新工具 v20.2.5.LTS。

     

    谢谢!

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

    Ed、  

    将您的问题转发给编译器团队。  

    此致

    Siddharth

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

    请确保它不是数据阻塞问题。  请参阅 C2000 MCU 编译器中的数据分块一文中的说明

    谢谢。此致、

    -George.

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

    这对乔治有用。  我将所有使用汇编语言的定义更改为非阻塞模式。  您对它为什么适用于较旧的工具有什么想法吗?

    谢谢!

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

    很显然、使用旧工具构建问题数据段时未被阻止。  为了对其进行验证和解释、需要使用测试用例来展示有关您的代码以及如何构建代码的大量信息。  我怀疑你不愿意提交这么多细节。

    谢谢。此致、

    -George.

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

    没错。  感谢你的帮助。