各位好,
请教各位一个问题。我在编写代码时使用#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中。
谢谢您的指导,不胜感激!