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.

TMS320F28388D: 283X编译开发内存分配问题,如图所示,已经在CMD留足空间给变量空间了,编译报错

Part Number: TMS320F28388D
Other Parts Discussed in Thread: C2000WARE

如图所示,已经在CMD留足空间给变量空间了,编译报错,到底是什么原因呢?我分配112地址结果只能用64,65都不行,分配128地址只能用到80,81空间都不行,怎么这个区域的空间好像有部分固定的空间不能被自由分配了吗?请问一下。谢谢了

  • 若是可以的话,能否详细说明一下?

    已经在CMD留足空间给变量空间了,编译报错,到底是什么原因呢?

    请您给出consuit中的详细报错信息,谢谢

    我分配112地址结果只能用64,65都不行,分配128地址只能用到80,81空间都不行,怎么这个区域的空间好像有部分固定的空间不能被自由分配了吗?

    没有太理解您这两句的意思,请详细说一下,谢谢

  • 你看我cmd文件写得Origin=0x2210,length=0x70(空间也就等于112),实际我的变量使用空间才99(图中红色警告提示),但是还是不能够放进我定义的空间里面,提示内容大概是内存分配不够,但是我定义到其他区域的地址又是可以的,例如我把origin=0x2380,length=0x70又可以(对同一变量空间) ,就是说在0x2210这部分空间是不是不能用?

  • 您可以看一下数据手册的 表 8-1. C28x Memory Map

    https://www.ti.com.cn/cn/lit/ds/symlink/tms320f28388d.pdf 

    例如我把origin=0x2380

    表 8-3. EMIF Chip Select Memory Map 

    EMIF2 CS2n - Program + Data: 0x0000 2000---- 0x0000 2FFF

  • 谢谢你的回复,我确实按照EMIF Chip Select Memory Map里面的地址去做分配的,我想做的是直接读变量就是相当于读对应EMIF的地址了,但是编译一直通过不了,我尝试修改我的变量数组大小,改到小于等于64个空间的时候才能编译通过,或者增大length,但是你要知道我实际的变量数组空间不需要那么大的,改完编译通过也有个问题,就是我的变量数组首地址不是从我定义的origin开始,而是有一个偏移量,我想知道那EMIF片选区域里面有些地址不能被定义使用吗?

  • 我想做的是直接读变量就是相当于读对应EMIF的地址了

    能否说一下您这样做的目的?我还是有些不理解您的需求

    您可以参考下C2000ware内的例程

    C2000Ware\device_support\f2838x\examples\cpu1\emif

    其中cmd文件的定义如下

    EMIF1_CS0n : origin = 0x80000000, length = 0x10000000
    EMIF1_CS2n : origin = 0x00100000, length = 0x00100000
    EMIF1_CS0_CS2n : origin = 0x00200000, length = 0x00100000
    EMIF1_CS3n : origin = 0x00300000, length = 0x00080000
    EMIF1_CS4n : origin = 0x00380000, length = 0x00060000
    EMIF2_CS0n : origin = 0x90000000, length = 0x10000000
    EMIF2_CS2n : origin = 0x00002000, length = 0x00001000

    emif_cs0_nonfar : > EMIF1_CS0_CS2n
    .farbss : > EMIF1_CS0n
    .farconst : > EMIF1_CS0n
    .em1_cs0 : > EMIF1_CS0n
    .em1_cs2 : > EMIF1_CS2n | EMIF1_CS0_CS2n
    .em1_cs3 : > EMIF1_CS3n
    .em1_cs4 : > EMIF1_CS4n
    .em2_cs0 : > EMIF2_CS0n
    .em2_cs2 : > EMIF2_CS2n

  • 我的目的很简单,就好比如我要读em2_cs2里面的地址0x2010的数据,然后我定义一个数组变量为var【】,当程序调用var时候就读取到0x2010这个地址下的数据。这么讲应该明白我的意思了吧?其中一个办法是我需要在修改CMD文件,然后把定义的变量直接用#pragma DATA_SECTION(,"")的方法把变量定义到固定区域中,但是发现仿真的时候发现地址不在0x2010开始,也就是var的首地址不是我想要的,当我把0x2010改为2040后,var的首地址就是2040了,而不是其他了

  • 其中一个办法是我需要在修改CMD文件,然后把定义的变量直接用#pragma DATA_SECTION(,"")的方法把变量定义到固定区域中,

    这个方法是没有问题的。我在例程内试了一下使用的是地址0x2000

    如下图

      

    cmd文件内:

    EMIF2_CS2n : origin = 0x00002000, length = 0x00001000


    .em2_cs2 : > EMIF2_CS2n