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/TMS320F28075: Issue with code in CLA running from flash

Part Number: TMS320F28075
Other Parts Discussed in Thread: C2000WARE, SFRA

Tool/software: Code Composer Studio

Hi,

I am working on TMS320f28075 32 bit microcontroller for power control application.

The ADC values are read and processed inside CLA. While running code from FLASH, it was observed that code inside CLA is not getting executed,even though the code for copying code from FLASH to RAM is present. What could be possible reason for this behaviour? Also is there any chance that constants in CLA is not getting copied to RAM?

Thanks in advance!

Regards,

Anjana

  • Hi Anjana,

    • even though the code for copying code from FLASH to RAM is present

    Do you mean code which initializes CPU functions in RAM, linker sections .TI.ramfunc and ramfuncs ?

    Same should be done for CLA code and CLA constants. CLA routines are linked to Cla1Prog section. CLA constants are linked .const_cla section. You need to initialize them like .TI.ramfunc and ramfuncs.

    Edward

  • Anjana,

    Edward has a good response.

    You need to make sure the CLA code and data is copied to the RAM LS blocks and also that you have configured them properly for CLA program and CLA data.

    You can see some CLA examples in C2000Ware. The CLA math library examples in C2000Ware also demonstrate this.

    Regards,
    sal
  • Hi Edward,

    Hi Sal,

    Thanks for the reply !.

    I have attached the linker file.Could you please go through it?

    I have added following piece of code when it is configured for FLASH. Should I add extra line for copying the CLA constants?

    #ifdef _FLASH

    /* Copy over code from FLASH to RAM */

    memcpy((uint32_t *)&Cla1funcsRunStart, (uint32_t *)&Cla1funcsLoadStart,

    (uint32_t)&Cla1funcsLoadSize);

    #endif /* _FLASH */

    Thanks,

    Anjana

    // The user must define CLA_C in the project linker settings if using the
    // CLA C compiler
    // Project Properties -> C2000 Linker -> Advanced Options -> Command File 
    // Preprocessing -> --define
    #ifdef CLA_C
    // Define a size for the CLA scratchpad area that will be used
    // by the CLA compiler for local symbols and temps
    // Also force references to the special symbols that mark the
    // scratchpad are. 
    CLA_SCRATCHPAD_SIZE = 0x100;
    --undef_sym=__cla_scratchpad_end
    --undef_sym=__cla_scratchpad_start
    #endif //CLA_C
    
    MEMORY
    {
    PAGE 0 :
       /* BEGIN is used for the "boot to SARAM" bootloader mode   */
    
       BEGIN           	: origin = 0x080000, length = 0x000002
       RAMM0           	: origin = 0x000122, length = 0x0002DE
       RAMD0           	: origin = 0x00B000, length = 0x000800
    
       RAMLS3_4_5			: origin = 0x009800, length = 0x001800
    /*
       RAMLS3      		: origin = 0x009800, length = 0x000800
       RAMLS4      		: origin = 0x00A000, length = 0x000800
       RAMLS5           : origin = 0x00A800, length = 0x000800 */
       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 :
    
       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 */
    
       RAMLS0          	: origin = 0x008000, length = 0x000800
       RAMLS1          	: origin = 0x008800, length = 0x000800
       RAMLS2      		: origin = 0x009000, length = 0x000800
    /*   RAMLS3      		: origin = 0x009800, length = 0x000800	*/
       
       
       RAMGS0           : origin = 0x00C000, length = 0x001000
       RAMGS1_2_3_4_5		: origin = 0x00D000, length = 0x005000
    /*   RAMGS1           : origin = 0x00D000, length = 0x001000
       RAMGS2           : origin = 0x00E000, length = 0x001000
       RAMGS3           : origin = 0x00F000, length = 0x001000
       RAMGS4           : origin = 0x010000, length = 0x001000
       RAMGS5           : origin = 0x011000, length = 0x001000
    */
       RAMGS6           : origin = 0x012000, length = 0x001000
       RAMGS7           : origin = 0x013000, length = 0x001000
                        
       CLA1_MSGRAMLOW   : origin = 0x001480, length = 0x000080
       CLA1_MSGRAMHIGH  : origin = 0x001500, length = 0x000080
       
    
        FLASHD           : origin = 0x086000, length = 0x002000	/* on-chip Flash */
    
    }
    
    
    SECTIONS
    {
       /* Allocate program areas: */
       .cinit           : > FLASHB      PAGE = 0, ALIGN(4)
       .pinit           : > FLASHB,     PAGE = 0, ALIGN(4)
       .text            : > FLASHF      PAGE = 0, ALIGN(4)
       codestart        : > BEGIN       PAGE = 0, ALIGN(4)
       ramfuncs         : LOAD = FLASHD,
                          RUN = RAMGS1_2_3_4_5,
                          LOAD_START(_RamfuncsLoadStart),
                          LOAD_SIZE(_RamfuncsLoadSize),
                          LOAD_END(_RamfuncsLoadEnd),
                          RUN_START(_RamfuncsRunStart),
                          RUN_SIZE(_RamfuncsRunSize),
                          RUN_END(_RamfuncsRunEnd),
                          PAGE = 1, ALIGN(4)
    					 
       /* Allocate uninitalized data sections: */
       .stack           : > RAMM1        PAGE = 1
       .ebss            : > RAMGS7       PAGE = 1
       .esysmem         : > RAMLS2       PAGE = 1
    
       /* Initalized sections go in Flash */
       .econst          : > FLASHB      PAGE = 0, ALIGN(4)
       .switch          : > FLASHB      PAGE = 0, ALIGN(4)
       
       .reset           : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */
    
       Filter_RegsFile  : > RAMGS0,	   PAGE = 1
       
        /* CLA specific sections */
       Cla1Prog         : LOAD = FLASHE,
                          RUN = RAMLS3_4_5,
                          LOAD_START(_Cla1funcsLoadStart),
                          LOAD_END(_Cla1funcsLoadEnd),
                          RUN_START(_Cla1funcsRunStart),
                          LOAD_SIZE(_Cla1funcsLoadSize),
                          PAGE = 0, ALIGN(4)
    
       CLADataLS0		: > RAMLS0, PAGE=1
       CLADataLS1		: > RAMLS1, PAGE=1
    
       Cla1DataRam0		: > RAMGS6, PAGE=1
    
       Cla1ToCpuMsgRAM  : > CLA1_MSGRAMLOW,   PAGE = 1
       CpuToCla1MsgRAM  : > CLA1_MSGRAMHIGH,  PAGE = 1
    
       CLA1mathTables   : > RAMLS0, PAGE = 1
    
    #ifdef __TI_COMPILER_VERSION
       #if __TI_COMPILER_VERSION >= 15009000
        .TI.ramfunc : {} LOAD = FLASHD,
    						  RUN = RAMLS4,
    						  LOAD_START(_RamfuncsLoadStart),
    						  LOAD_SIZE(_RamfuncsLoadSize),
    						  LOAD_END(_RamfuncsLoadEnd),
    						  RUN_START(_RamfuncsRunStart),
    						  RUN_SIZE(_RamfuncsRunSize),
    						  RUN_END(_RamfuncsRunEnd),
    						  PAGE = 0, ALIGN(4)
       #endif
    #endif
       
       /* The following section definition are for SDFM examples */		
    /*   Filter1_RegsFile : > RAMGS1,	PAGE = 1, fill=0x1111
       Filter2_RegsFile : > RAMGS2,	PAGE = 1, fill=0x2222
       Filter3_RegsFile : > RAMGS3,	PAGE = 1, fill=0x3333
       Filter4_RegsFile : > RAMGS4,	PAGE = 1, fill=0x4444	*/
       
    #ifdef CLA_C
       /* CLA C compiler sections */
       //
       // Must be allocated to memory the CLA has write access to
       //
       CLAscratch       :
                         { *.obj(CLAscratch)
                         . += CLA_SCRATCHPAD_SIZE;
                         *.obj(CLAscratch_end) } >  RAMLS1,  PAGE = 1
    
       .scratchpad      : > RAMLS1,       PAGE = 1
       .bss_cla		    : > RAMLS1,       PAGE = 1
       .const_cla	    :  LOAD = FLASHB,
                           RUN = RAMLS1,
                           RUN_START(_Cla1ConstRunStart),
                           LOAD_START(_Cla1ConstLoadStart),
                           LOAD_SIZE(_Cla1ConstLoadSize),
                           PAGE = 1
    #endif //CLA_C
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

  • Hi Anjana,

    Yes, you should add extra line for CLA constants, of course if you have any CLA constant.

    Or, you may like more neat way, automatic sections initializing at program startup. In example below CLA code, CLA const and ramfuncs are initialized by startup routine. You probably should keep ramfuncs as they are since Fxxxx_SysCtrl.c calls memcpy to initialize ramfunc, it's just an example how you could avoid those memcpy calls. Fxxxx_SysCtrl.c doing ramfunc initialization is probably where your confusion comes from, ramfunc is initialized and CLA is not.

    GROUP {
    .TI.ramfunc
    ramfuncs
    {
    -l F021_API_F2837xS_FPU32.lib(.text)
    --library=SFRA_F_Lib.lib<SFRA_F_INJECT.obj>
    --library=SFRA_F_Lib.lib<SFRA_F_COLLECT.obj>
    }
    } LOAD = FLASHD,
    RUN = /*RAMLS0 | RAMLS1 |*/ RAMLS2 |RAMLS3,
    PAGE = 0, ALIGN(4),
    table(BINIT)


    Cla1Prog : LOAD = FLASHD,
    RUN = RAMLS5,
    PAGE = 0, ALIGN(4),
    table(BINIT)

    .const_cla : LOAD = FLASHH,
    RUN = RAMLS1,
    PAGE = 1, ALIGN(4),
    table(BINIT)

    .binit : > FLASHAB, PAGE = 0 /* .binit keeps information how to
    initialize sections with table(BINIT) */

    Edward
  • Great response from Edward. I suggest following his advice and posting if it doesn't work.

    sal