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.

CCS编译placement fails for object ".txet"

我的CCS编译的时候报错:placement fails for object ".txet" , size 0x152d(page0) . Available ranges :PRAMH0  size:0x1000 unused:oxfbd  max hole:0xfbd 。

size:0x152d(page0)表示编译生成的汇编指令代码大小0x152d   ,Available ranges :PRAMH0  size:0x1000表示存放.text字段的空间大小为0x1000  ,unused:oxfbd表示暂时未被利用的空间为0xfbd ,因为0xfbd < 0x152d所以 placement fails for object ".txet" 。这样理解是否正确?

那么这种情况下如何修改SRAM.CMD的.text字段?

谢谢!

   /* Allocate program areas: */
   .reset           : > PRAMH0,      PAGE = 0
   .text            : > PRAMH0,      PAGE = 0
   .cinit           : > PRAMH0,      PAGE = 0

  • 代码过大,可以把其他空间分配给.text段

  • 请问怎么把其他空间分配给.text段 , 书上没有讲怎么操作SRAM.CMD , 可以举个例子吗?谢谢~

  • 你把你的CMD文件都贴出来,只要|上另外一块内存区域就可以

  • MEMORY
    {
    PAGE 0 :
       PRAMH0     : origin = 0x3f8000, length = 0x001000       
             
    PAGE 1 :
       /* SARAM                     */     
       RAMM0    : origin = 0x000000, length = 0x000400
       RAMM1    : origin = 0x000400, length = 0x000400

       /* Peripheral Frame 0:   */
       DEV_EMU    : origin = 0x000880, length = 0x000180
       FLASH_REGS : origin = 0x000A80, length = 0x000060
       CSM        : origin = 0x000AE0, length = 0x000010
       XINTF      : origin = 0x000B20, length = 0x000020
       CPU_TIMER0 : origin = 0x000C00, length = 0x000008
       CPU_TIMER1 : origin = 0x000C08, length = 0x000008        
       CPU_TIMER2 : origin = 0x000C10, length = 0x000008        
       PIE_CTRL   : origin = 0x000CE0, length = 0x000020
       PIE_VECT   : origin = 0x000D00, length = 0x000100

       /* Peripheral Frame 1:   */
       ECAN_A     : origin = 0x006000, length = 0x000100
       ECAN_AMBOX : origin = 0x006100, length = 0x000100

       /* Peripheral Frame 2:   */
       SYSTEM     : origin = 0x007010, length = 0x000020
       SPI_A      : origin = 0x007040, length = 0x000010
       SCI_A      : origin = 0x007050, length = 0x000010
       XINTRUPT   : origin = 0x007070, length = 0x000010
       GPIOMUX    : origin = 0x0070C0, length = 0x000020
       GPIODAT    : origin = 0x0070E0, length = 0x000020
       ADC        : origin = 0x007100, length = 0x000020
       EV_A       : origin = 0x007400, length = 0x000040
       EV_B       : origin = 0x007500, length = 0x000040
       SPI_B      : origin = 0x007740, length = 0x000010
       SCI_B      : origin = 0x007750, length = 0x000010
       MCBSP_A    : origin = 0x007800, length = 0x000040

       /* CSM Password Locations */
       CSM_PWL    : origin = 0x3F7FF8, length = 0x000008

       /* SARAM                    */     
       DRAMH0     : origin = 0x3f9000, length = 0x001000         
    }
     
     
    SECTIONS
    {
       /* Allocate program areas: */
       .reset           : > PRAMH0,      PAGE = 0
       .text            : > PRAMH0,      PAGE = 0
       .cinit           : > PRAMH0,      PAGE = 0

       /* Allocate data areas: */
       .stack           : > RAMM1,       PAGE = 1
       .bss             : > DRAMH0,      PAGE = 1
       .ebss            : > DRAMH0,      PAGE = 1
       .const           : > DRAMH0,      PAGE = 1
       .econst          : > DRAMH0,      PAGE = 1      
       .sysmem          : > DRAMH0,      PAGE = 1
       
       /* Allocate Peripheral Frame 0 Register Structures:   */
       DevEmuRegsFile    : > DEV_EMU,    PAGE = 1
       FlashRegsFile     : > FLASH_REGS, PAGE = 1
       CsmRegsFile       : > CSM,        PAGE = 1
       XintfRegsFile     : > XINTF,      PAGE = 1
       CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1      
       CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1      
       CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1      
       PieCtrlRegsFile   : > PIE_CTRL,   PAGE = 1      
       PieVectTable      : > PIE_VECT,   PAGE = 1

       /* Allocate Peripheral Frame 2 Register Structures:   */
       ECanaRegsFile     : > ECAN_A,      PAGE = 1   
       ECanaMboxesFile   : > ECAN_AMBOX   PAGE = 1

       /* Allocate Peripheral Frame 1 Register Structures:   */
       SysCtrlRegsFile   : > SYSTEM,     PAGE = 1
       SpiaRegsFile      : > SPI_A,      PAGE = 1
       SciaRegsFile      : > SCI_A,      PAGE = 1
       XIntruptRegsFile  : > XINTRUPT,   PAGE = 1
       GpioMuxRegsFile   : > GPIOMUX,    PAGE = 1
       GpioDataRegsFile  : > GPIODAT     PAGE = 1
       AdcRegsFile       : > ADC,        PAGE = 1
       EvaRegsFile       : > EV_A,       PAGE = 1
       EvbRegsFile       : > EV_B,       PAGE = 1
       ScibRegsFile      : > SCI_B,      PAGE = 1
       McbspaRegsFile    : > MCBSP_A,    PAGE = 1

       /* CSM Password Locations */
       CsmPwlFile      : > CSM_PWL,     PAGE = 1

    }

    其中

    PRAMH0     : origin = 0x3f8000, length = 0x001000   

    DRAMH0     : origin = 0x3f9000, length = 0x001000 

    我将上面的两个字段修改为

    PRAMH0     : origin = 0x3f8000, length = 0x002000   

    DRAMH0     : origin = 0x3fa000, length = 0x001000 

    就可以啦,但是不知会不会导致其他存储错误

  • 有可能有有问题,具体要看这两个RAM区域是否真的有这么长,你用的是C2000哪个产品

  • 用的是320F2812,谢谢

    资料上介绍说0x3f8000~0x3fa000是H0 SRAM , 0x3fa000~0x3ff000为保留 ,

  • 用的是320F2812 , 资料上说0x3f8000~0x3fa000是H0 SARAM , 0x3fa000~0x3ff000是保留

  • 所以你只要直接把

    DRAMH0     : origin = 0x3fa000, length = 0x001000 

    去掉就可以,就等于不要把H0RAM分成两块,合起来放.text

  • 我把DRAMH0     : origin = 0x3fa000, length = 0x001000 注释后,

    .bss,.ebss.const ,.econst ,.sysmem字段地址也修改为PRAMH0
    修改前:

       /* Allocate program areas: */
       .reset           : > PRAMH0,      PAGE = 0
       .text            : > PRAMH0,      PAGE = 0
       .cinit           : > PRAMH0,      PAGE = 0

       /* Allocate data areas: */
       .stack           : > RAMM1,       PAGE = 1
       .bss             : > DRAMH0,      PAGE = 1
       .ebss            : > DRAMH0,      PAGE = 1
       .const           : > DRAMH0,      PAGE = 1
       .econst          : > DRAMH0,      PAGE = 1      
       .sysmem          : > DRAMH0,      PAGE = 1

    修改后:

       /* Allocate program areas: */
       .reset           : > PRAMH0,      PAGE = 0
       .text            : > PRAMH0,      PAGE = 0
       .cinit           : > PRAMH0,      PAGE = 0

       /* Allocate data areas: */
       .stack           : > RAMM1,       PAGE = 1
       .bss             : > PRAMH0,      PAGE = 0
       .ebss            : > PRAMH0,      PAGE = 0
       .const           : > PRAMH0,      PAGE = 0
       .econst          : > PRAMH0,      PAGE = 0     
       .sysmem          : > PRAMH0,      PAGE = 0

    这样前面的问题就解决了。

    但是我使用的double数组变长后,long double x[NCAL+1] = { 0 };  NCAL从10变到100后

    报错:placement fails for object ".econst" , 请问这种情况怎么处理 ? 谢谢!

  • 说明你的PRAMH0 RAM也不够了,你需要把他改成RAML0 或者RAML1, 发现你的CMD并没有写这一段就在PAGE1里面加:

    RAML01     : origin = 0x00 8000, length = 0x002000

  • 老哥,我也在做2812控制无刷直流电机,能救救孩纸吗=.=