TI中文支持网
TI专业的中文技术问题搜集分享网站

关于#pragma DATA_SECTION的问题

各位好,

   请教各位一个问题。我在编写代码时使用#progma DATA_SECTION将一个数组(比如buffer1)指定存放在DDR2中(与之前的代码相比,只添加了这个数组),但是在编译以后,我在.map文件中查看空间分配情况发现,不仅使用了一部分DDR2,同时DSP的片上RAM也使用了一部分(DDR2和RAM占用比例大约1:1),再查看数组buffer1的地址,显示已经分配在了指定的DDR2地址上。我的理解是既然使用了DATA_SECTION将数组指定存放在了DDR2中,就不应该再使用这么多的RAM了,使用DATA_SECTION将数组指定存放到DDR2中的目的就是为了解决RAM空间不足的问题。请问各位,这种情况是怎么一回事呢?

Shine:

应该只会分配到指定的地址。请问#progma这部分代码是怎么写的?包括cmd文件里是怎么分配的?

咫尺和天涯:

回复 Shine:

我使用的DSP/BIOS。在tcf文件中指定一块区域MEM_TransmitCode,org是0xefd00000,长度是0x00200000。

在cmd文件中如下:

SECTIONS

{

TransmitCode >MEM_TransmitCode

}

在.c代码文件中如下:

#pragma DATA_SECTION(buffer1, "TransmitCode");

Uint8 buffer1[xxx] = {xxx}; 其中xxx代表数目和初始值 

Shine:

回复 咫尺和天涯:

有没有把自己写的cmd文件添加到bios中?

咫尺和天涯:

回复 Shine:

应该是添加进去了,因为这个cmd文件在这之前一直在用,我只是在SECTIONS中新添加了一些语句。另外,请问怎样将一个新的cmd添加到BIOS中呢?谢谢您!

Shine:

回复 咫尺和天涯:

用-l选项在user cmd中添加cfg.cmd。5.1.3 Defining Segments in Your Own Linker Command Filehttp://www.ti.com/lit/ug/spru423i/spru423i.pdf

注意这两个cmd文件里的memory不要重复定义。

咫尺和天涯:

回复 Shine:

我写的cmd文件如下,

-l rts64plus.lib

-l csl_6455.lib

SECTIONS

{

   TransmitCode >MEM_TransmitCode

}

如您所说,在其中加入-l cfg.cmd后,编译提示大量memory重定义的错误和大量警告。但是我写的cmd中并没有对memory进行分配,请问这是什么原因呢?谢谢您!

咫尺和天涯:

回复 Shine:

Shine Zhang,你好,

    我找到问题出在哪里了,但是原因不清楚。

    1、#pragma DATA_SECTION(buffer, "name")

          char buffer[10000];

      如果代码这样写,buffer的值不进行初始化,则编译后在map文件中可以看到,DDR2中占用了10000个字节的大小,而RAM没有被占用。

    2、#pragma DATA_SECTION(buffer, "name")

          char buffer[10000] = {0, 1, 2, 3, 4, 5, …., 9999};

       如果代码这样写,buffer的值进行初始化,则编译后在map文件中可以看到,DDR2中占用了10000个字节的大小,而RAM同时被占用约10000个字节的大小。

     

     我想请教一下,初始化和不初始化为什么会有这个区别,能不能在初始时也只占用DDR2,而不占用RAM。期待您的解答,谢谢!

咫尺和天涯:

回复 Shine:

Shine Zhang,你好

      根据您的解答,找到了问题的原因所在,确实是您所说的那样。初始化后,数组分配到了DDR2空间,但是初始化的值在.cinit段,而默认了.cinit段在RAM中,将.cinit段分配到DDR2后,结果与预想的一样。

      正如您所说的,占用了RAM是因为初始化值在.cinit段,而.cinit分配在了RAM中。

     谢谢您的指导,不胜感激!

赞(0)
未经允许不得转载:TI中文支持网 » 关于#pragma DATA_SECTION的问题
分享到: 更多 (0)