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.

关于#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空间不足的问题。请问各位,这种情况是怎么一回事呢?

  • 应该只会分配到指定的地址。

    请问#progma这部分代码是怎么写的?包括cmd文件里是怎么分配的?

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

    在cmd文件中如下:

    SECTIONS

    {

    TransmitCode >MEM_TransmitCode

    }

    在.c代码文件中如下:

    #pragma DATA_SECTION(buffer1, "TransmitCode");

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

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

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

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

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

  • 我写的cmd文件如下,

    -l rts64plus.lib

    -l csl_6455.lib

    SECTIONS

    {

       TransmitCode >MEM_TransmitCode

    }

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

  • 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。期待您的解答,谢谢!

  • 占用RAM里的是不是.cinit段?一般初始化的值是放在.cinit段里的。

  • Shine Zhang,你好

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

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

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