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文件吗?

  • 无法上传文件啊

    初始化的,以上

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

    未初始化的 以下

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

  • 左侧为初始化变量的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