Because of the holidays, TI E2E™ design support forum responses will be delayed from Dec. 25 through Jan. 2. Thank you for your patience.

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/TMS320F28379D: How to use RAM memory efficiently to store the global variables?

Part Number: TMS320F28379D

Tool/software: Code Composer Studio

My RAM Memory completely assigned by global variables .Here, I modified my linker file to take care of gloabal variables. The problem i faced when i increase the code length ( program using different varibles are more then I defined every variable as a global).  Here I considered the two cases

case 1:

#define size 1200

#define size1 100

problem: I am facing the linker file problem

case 2:

#define size 801

#define size1 100

Case2: I didn't found any linker problem, and noticed that my RAM blocks most are empty only. Here, I am attaching the linker files and result for case2.

Questions:

1. What should i change to use effectively RAM blocks.

2. Is there any possibility of storing global variables in flash? Please elaborate the way how to do it?

LInker file:


MEMORY
{
PAGE 0 :  /* Program Memory */
          /* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */
          /* BEGIN is used for the "boot to Flash" bootloader mode   */

   BEGIN               : origin = 0x080000, length = 0x000002
   RAMM0               : origin = 0x000122, length = 0x0002DE
   RAMD0               : origin = 0x00B000, length = 0x000800
   RAMLS0              : origin = 0x008000, length = 0x000800
   RAMLS1              : origin = 0x008800, length = 0x000800
   RAMLS2              : origin = 0x009000, length = 0x000800
   RAMLS3              : origin = 0x009800, length = 0x000800
   RAMLS4              : origin = 0x00A000, length = 0x000800
   //RAMGS14          : origin = 0x01A000, length = 0x001000
   //RAMGS15          : origin = 0x01B000, length = 0x001000
   RESET               : origin = 0x3FFFC0, length = 0x000002
   
   /* Flash sectors */
   FLASHA           : origin = 0x080002, length = 0x001FFE    /* on-chip Flash */
   FLASHB           : origin = 0x082000, length = 0x002000    /* on-chip Flash */
   FLASHC           : origin = 0x084000, length = 0x002000    /* on-chip Flash */
   FLASHD           : origin = 0x086000, length = 0x002000    /* on-chip Flash */
   FLASHE           : origin = 0x088000, length = 0x008000    /* on-chip Flash */
   FLASHF           : origin = 0x090000, length = 0x008000    /* on-chip Flash */
   FLASHG           : origin = 0x098000, length = 0x008000    /* on-chip Flash */
   FLASHH           : origin = 0x0A0000, length = 0x008000    /* on-chip Flash */
   FLASHI           : origin = 0x0A8000, length = 0x008000    /* on-chip Flash */
   FLASHJ           : origin = 0x0B0000, length = 0x008000    /* on-chip Flash */
   FLASHK           : origin = 0x0B8000, length = 0x002000    /* on-chip Flash */
   FLASHL           : origin = 0x0BA000, length = 0x002000    /* on-chip Flash */
   FLASHM           : origin = 0x0BC000, length = 0x002000    /* on-chip Flash */
   FLASHN           : origin = 0x0BE000, length = 0x002000    /* on-chip Flash */

PAGE 1 : /* Data Memory */
         /* Memory (RAM/FLASH) blocks can be moved to PAGE0 for program allocation */

   BOOT_RSVD       : origin = 0x000002, length = 0x000120     /* Part of M0, BOOT rom will use this for stack */
   RAMM1           : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
   RAMD1           : origin = 0x00B800, length = 0x000800

   RAMLS5      : origin = 0x00A800, length = 0x000800

   RAMGS0      : origin = 0x00C000, length = 0x001000
   RAMGS1      : origin = 0x00D000, length = 0x001000
   RAMGS2      : origin = 0x00E000, length = 0x001000
   RAMGS3      : origin = 0x00F000, length = 0x001000
   RAMGS4      : origin = 0x010000, length = 0x002000
  // RAMGS5      : origin = 0x011000, length = 0x001000
   RAMGS6      : origin = 0x012000, length = 0x002000
   //RAMGS7      : origin = 0x013000, length = 0x001000
   RAMGS810      : origin = 0x014000, length = 0x003000
   RAMGS1113     : origin = 0x017000, length = 0x003000
   RAMGS1415     : origin = 0x01A000, length = 0x002000



   CPU2TOCPU1RAM   : origin = 0x03F800, length = 0x000400
   CPU1TOCPU2RAM   : origin = 0x03FC00, length = 0x000400
}


SECTIONS
{
   /* Allocate program areas: */
   codestart           : > BEGIN       PAGE = 0
   .cinit              : > FLASHB |FLASHE |FLASHJ     PAGE = 0
   .pinit              : > FLASHB,     PAGE = 0
   .text               : >> FLASHB | FLASHC      PAGE = 0



    .TI.ramfunc : {} LOAD = FLASHD,
                         RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
                         LOAD_START(_RamfuncsLoadStart),
                         LOAD_SIZE(_RamfuncsLoadSize),
                         LOAD_END(_RamfuncsLoadEnd),
                         RUN_START(_RamfuncsRunStart),
                         RUN_SIZE(_RamfuncsRunSize),
                         RUN_END(_RamfuncsRunEnd),
                         PAGE = 0, ALIGN(4)


   /* Allocate uninitalized data sections: */
   .stack              : > RAMM1        PAGE = 1
   .ebss               : >> RAMLS5 | RAMGS0 | RAMGS4 | RAMGS6 | RAMGS810 |  RAMGS1113 |RAMGS1415 PAGE = 1
   .esysmem            : > RAMLS5       PAGE = 1

   /* Initalized sections go in Flash */
   .econst             : >> FLASHF | FLASHG | FLASHH      PAGE = 0
   .switch             : > FLASHB      PAGE = 0

   .reset              : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */

   Filter_RegsFile     : > RAMGS0,       PAGE = 1

   SHARERAMGS0        : > RAMGS0,        PAGE = 1
   SHARERAMGS1        : > RAMGS1,        PAGE = 1
   
   /* The following section definitions are required when using the IPC API Drivers */
    GROUP : > CPU1TOCPU2RAM, PAGE = 1
    {
        PUTBUFFER
        PUTWRITEIDX
        GETREADIDX
    }

    GROUP : > CPU2TOCPU1RAM, PAGE = 1
    {
        GETBUFFER :    TYPE = DSECT
        GETWRITEIDX :  TYPE = DSECT
        PUTREADIDX :   TYPE = DSECT
    }

}

/*
//===========================================================================
// End of file.
//===========================================================================
*/

  • Hi Naveen,

    Global variables are typically stored in RAM, not in Flash mainly becasue Flash is a read only memory. You may need to erase the entire FLsh sector to update a variable in Flash.

    To avoid the linker error mentioned above, you could assign more RAM memories to bss section. You could also try enabling the --gen_data_sections option in the CCS project setting (Build->Advanced option->Runtime Model Options)

    Regards,
    Veena
  • Hi Veena,

    Thank you very much

    I checked with --gen_data_sections, it is working.  

    Question1: May  i know what it does?

    when I pressed F8 button all registers are not filled (only some registers are filled) why? If I suspend the button all registers are filled with data. Will it affect while working with real time simulations on hardware?

  • Hi Naveen,

    I am not a compiler expert, but as far as I know, the data sections defined in your source code would be split into sub-sections. Similar option is available for functions --gen_func_subsections. This will create sections per function instead of having a large single .text section. You can refer to the compiler guide for more details.

    Regarding the register allocation, if you take the EMIF example, in the linker command file, it defines EMIF1 memory region of size 0x800(2048 in decimal). But the actual register struct (EMIF_REGS) that gets allocated to this space is only of size 112. The rest of the memory section are reserved location. This is the reason why you see only 112/2048 of EMIF section as being allocated.

    Hope this makes sense.

    Regards,
    Veena