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.

[参考译文] 全局变量的 CLANG 内存分配

Guru**** 2587365 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1041271/clang-memory-allocation-for-global-variables

您好!

我以下面的方式声明了'global variables:

在 main.c 文件中、我具有以下内容:

__attribute__((section(".test"))) unsigned short global1;
__attribute__((section(".test"))) unsigned short global2;

void main (void)

unsigned short local1;
unsigned short local2;

local1 = global1;
local2 = global2;


在我的 lnker 命令文件中、我具有以下内容:
TEST:{}> MSRAMTEST
MSRAMTEST:origin = 0x70180000,length = 0x40000

使用这些设置、我可以看到全局变量的内存分配如下所示:
70180000 global1.
70180002 global2.

但是、当我的代码更改读取的全局变量的顺序时、如下所示

void main (void)

unsigned short local1;
unsigned short local2;

local2 = global2;
local1 = global1;


存储器中的地址也发生了变化。
70180002 global1.
70180000 global2.

我是否可以设置任何标志、以确保全局变量的地址保持不变、无论使用顺序如何。  

此致、
Vishwanath Reddy。


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="119059" url="~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1041271/clang-memory-allocation-for-global-variables ]'是否有任何标志可供我设置,以确保全局变量的地址保持不变,无论使用顺序如何。  [/报价]

    不幸的是、不   

    这里有两个可供考虑的选择。  第一、将全局变量放入一个结构中。  第二、在手工编码的装配体中定义它们。

    谢谢、此致、

    乔治

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

    您好、George、

    您能解释一下为什么会发生这种情况吗? 此外、 当使用 ARM-CGT-19 v20.2.5.LTS 时、似乎未观察到此问题。
    此外、您能否提供在手工编码的汇编语言中定义变量的示例?

    此致、
    Vishwanath Reddy。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="119059" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1041271/clang-memory-allocation-for-global-variables/3850970 #3850970">您能解释一下为什么会发生这种情况吗? [/报价]

    由于许多编译器恰好按照源代码中显示的相同顺序分配变量、因此许多用户错误地认为这是一项要求。  但没有这种要求。

    [引用 userid="119059" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1041271/clang-memory-allocation-for-global-variables/3850970 #3850970"]使用  ARM-CGT-19 v20.2.5.LTS 时似乎未发现此问题[/quot]

    如果使用--opt_level=3或更高版本进行编译,则会启用优化,该优化可能(也可能不会)更改某些全局变量的顺序。

    [引用 userid="119059" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1041271/clang-memory-allocation-for-global-variables/3850970 #3850970"]您能否提供在手动编码汇编语言中定义变量的示例?

    不幸的是、不  我对理解 tiarmclang 使用的 GNU 样式汇编器语法缺乏信心。  话虽如此,以下是一些想法。

    使用选项-S 构建 C 源文件、编译器会在创建汇编源代码后停止编译。  该文件与源文件具有相同的名称、扩展名更改为.s  检查该文件以查看编译器用于创建变量的汇编器指令。  要了解这些指令、请参阅 集成型 GNU 语法 Arm 汇编器的文档。   

    也许您更愿意使用旧版 TI Arm 汇编器接受的语法编写汇编代码。  此类文件可以使用 tiarmclang 构建。  有关详细信息、请参阅 有关 TI-Syntax Arm 汇编器的文档。

    谢谢、此致、

    乔治

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

    您好、George、

    如果在如下所示的声明过程中全局变量初始化为零、则变量的内存分配不会改变。  

    __attribute__(((section(".test"))) unsigned short global1=0;
    __attribute__((section(".test"))) unsigned short global2=0;

    编译器是否保证始终如此?

    谢谢、此致、
    Vishwanath Reddy。

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

    您好,Vishwanath,

    您指定的段属性会将两个全局变量放在同一输入段中、但不能保证它们按顺序放置。

    可以使用"location"属性控制放置全局变量的地址。

    例如、

    __attribute__((location (0x1000))) unsigned short global1;

    __attribute__(((location(0x1002)) unsigned short global2;

    将指示链接器将 global1放置在0x1000、将 global2放置在0x1002。

    链接时必须满足的一个条件是、必须在链接器命令文件中指定的存储器配置中考虑位置属性中指定的地址。 例如、在以下 MEMORY 指令中:

    内存{

      GMEM:org = 0x00001000、len = 0x1000

      (笑声)

    位置属性中指定的地址在 GMEM 存储器区域中进行了说明。

    在数据对象上指定位置属性时、将在其自己的输入段中定义位置属性。 然后、链接器将对该输入段应用特定的地址放置。 此类放置指令首先由链接器处理、以确保位置属性被接受。

    希望这对您有所帮助

    Todd Snider

    TI Arm Clang 编译器工具团队