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.

[参考译文] CCS/UCD3138:CCS ARM 7编译器中的优化级别移动 RAM 变量?

Guru**** 2526980 points
Other Parts Discussed in Thread: UCD3138064

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/758783/ccs-ucd3138-what-optimization-levels-in-the-ccs-arm-7-compiler-move-ram-variables-around

器件型号:UCD3138

工具/软件:Code Composer Studio

UCD3138064提供了下载新代码并切换到该代码的功能、同时仍在运行电源。  为了便于快速切换、 我们需要在 新版本的代码中使 RAM 变量保持在相同的位置。   据我所知、 CCS 仅在您使用优化级别4 -整个程序优化时才开始优化 RAM 位置。  就是这种情况、或者进行更低级别的优化有时 会根据 代码更改( 除了添加变量)移动 RAM 变量。   

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

    编译器不会尝试在连续编译上的同一位置查找变量。  当两个构建之间的变化很小时、这种情况往往会发生。  但它不是为设计或测试的要求。  因此、无法识别可能导致变量更改存储器位置的所有条件。

    以下是您可能未考虑的一个因素。 更改链接器查看目标文件和库的顺序可能会导致差异。

    删除一个变量或添加一个变量会导致更高存储器地址的所有其他变量更改位置。

    我不知道使用--opt_level=4会导致变量更改位置。  但我并不感到奇怪。  使用--opt_level=4构建的所有目标模块都合并到一个编译单元中,然后再次构建。  变量在该单元中的顺序可能与单独编译时的顺序完全不同。  在较低的优化级别上不会看到类似的效果。   

    恐怕我的帖子不是很有用。  但这就是这种情况的性质。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我知道、添加变量和更改链接器看到文件的顺序将更改存储器映射中变量的顺序。 为避免此问题、我通常会在一个文件中声明所有变量。 如果我为新版本的代码添加变量、我会在该文件的末尾添加这些变量。 这种做法迄今已奏效。

    根据我在编译器方面的经验、我怀疑您描述的内容是 opt_level = 4时发生的情况、因为我可以使用相同的代码、并通过更改为该级别来获得不同的存储器映射。 那么、这是我所期望的结果的确认。

    但我的问题实际上是、假设我将所有变量放入一个文件中、顺序相同、并且仅在该文件的末尾添加新变量、并避免优化级别4、那么我的旧变量是否仍在同一位置?

    此外、为了添加我已经想到的其他例外情况、请使用相同版本的编译器和链接器、相同的库以及相同的链接器命令文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Ian Bower">假设我将所有变量放入一个文件中、顺序相同、并且仅在该文件的末尾添加新变量、并避免优化级别4、我的旧变量是否仍在同一位置? [/报价]

    可能。  但不能保证。  如果您需要保证、我建议您在汇编中实现该文件。

    谢谢、此致、

    乔治

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

    我喜欢在汇编语言中实现文件作为后备站的想法、以防我们无法以任何其他方式复制存储器映射。  我想我将对此进行实验。