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.

TMS320F28335: DSP C2000 全局变量初始化与未初始化占用字节数不一致

Part Number: TMS320F28335

定义一个初始化的全局变量    占用initialized data :4  占用uninitialized data:1

定义一个初始化的全局变量    占用initialized data :0  占用uninitialized data:1

这怎么解释??????

  • 左边这一列截图是从哪里看到的?方便上传一下完整的吗?

    另外再方便上传一下map文件吗?

  • 无法上传文件啊

    初始化的,以上

    --------------------------------------------------------------------

    未初始化的 以下

  • 然后选择本地文件上传即可

  • Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ******************************************************************************
    TMS320C2000 Linker PC v21.6.0
    ******************************************************************************
    >> Linked Wed Dec 6 08:43:45 2023
    OUTPUT FILE NAME: <test.out>
    ENTRY POINT SYMBOL: "_c_int00" address: 0000a000
    MEMORY CONFIGURATION
    name origin length used unused attr fill
    ---------------------- -------- --------- -------- -------- ---- --------
    PAGE 0:
    BEGIN 00000000 00000002 00000000 00000002 RWIX
    RAMM0 00000052 000003ae 00000000 000003ae RWIX
    RAML0 00008000 00002000 0000001e 00001fe2 RWIX
    RAML1 0000a000 00002000 000000e0 00001f20 RWIX
    ZONE7A 00200000 0000fc00 00000000 0000fc00 RWIX
    RAMH0 00300000 00008000 00000000 00008000 RWIX
    RAMH1 00308000 00008000 00000000 00008000 RWIX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ******************************************************************************
    TMS320C2000 Linker PC v21.6.0
    ******************************************************************************
    >> Linked Wed Dec 6 08:49:17 2023
    OUTPUT FILE NAME: <test.out>
    ENTRY POINT SYMBOL: "_c_int00" address: 0000a000
    MEMORY CONFIGURATION
    name origin length used unused attr fill
    ---------------------- -------- --------- -------- -------- ---- --------
    PAGE 0:
    BEGIN 00000000 00000002 00000000 00000002 RWIX
    RAMM0 00000052 000003ae 00000000 000003ae RWIX
    RAML0 00008000 00002000 0000001a 00001fe6 RWIX
    RAML1 0000a000 00002000 000000e0 00001f20 RWIX
    ZONE7A 00200000 0000fc00 00000000 0000fc00 RWIX
    RAMH0 00300000 00008000 00000000 00008000 RWIX
    RAMH1 00308000 00008000 00000000 00008000 RWIX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    左侧为初始化变量的map,                                                                                    右侧为未初始化变量的map

  • 主要的区别在这里,.cinit段。

    对于COFF格式,未初始化的全局变量分配在.ebss段(全局变量是运行时初始化,所以编译之后全局变量属于未被初始化的部分),而初始化值储存在.cinit用于初始化全局变量的表中。在器件上电后,由 _c_int00 函数将初始化值从.cinit段复制到.ebss,完成全局变量的运行时初始化。

    可以看到,左侧有为.cinit分配相应的空间。

  • map文件中统计的大小是按字节8位算的,还是按字16位算的?

    我定义了一个 int a;   占用uninitialized data:1  可以理解位一个16位的字

    而我定义一个 int a = 1; 占用ninitialized data:1 ,initialized data :4,您的意思这个初始化的数字1这个数也占一个内存,我理解initialized data 也应该为1才对,为什么会是4呢?占用四倍的内存?

  • 1. 16位,C2000的一个地址上都是16位;

    2. 因为.cinit段中包含的不仅仅只有需要拷贝的值,还有一些其它信息,比如一些标志位,以及值与全局变量之间的映射(这个是我的推测),来控制拷贝的过程。比如,请看一下zhcu875z_TMS320C28x 汇编语言工具 v22.6.0.LTS (Rev. Z)4243页:

    它是有自己的格式的。

    更多的信息,汇编手册中也没有描述了,这些都是与更底层的编译器相关的东西了。如果感兴趣的话你可以查一下相关方面的资料;也可以结合目标文件中相关位置的内容来看一下。

  • 感谢!

    1、这里提到EABI与COFF,这两种格式较老的C2000 处理器(如F28335,C28346)支持EABI格式吗?

    2、EABI 格式的就不会存在讨论初始化和未初始化占用字节不一致的问题,但是较老的C2000的一些库都是COFF格式的不支持设置成EABI格式共同编译,fatal error #16000: object files have incompatible formats ("C:/ti/ccsv7/tools/compiler/ti-cgt-c2000_21.6.0.LTS/lib/rts2800_fpu32.lib<boot28.asm.obj>" = TI-COFF, "./main.obj" = ELF)

  • 没有,较老的器件只有COFF格式的;对于新的器件,正在逐步迁移到EABI格式。

    另外COFF格式的文档也供参考:spraao8_Common Object File Format (COFF