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: Calculating CRC in linker

Part Number: TMS320F28388D
Other Parts Discussed in Thread: C2000WARE

Tool/software:

Good morning, 

I'd like to calculate the CRC of our application from the linker. I read the  Linker-Generated CRC Tables section in the guide and seems feasible for us. 

The sections I'd like to calculate the CRC from are the FLASH1 | FLASH2 | FLASH3 | FLASH4 | FLASH5 | FLASH6 | FLASH7 | FLASH8 | FLASH9. 

I wrote this code:

CLA_SCRATCHPAD_SIZE = 0x100;
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start

MEMORY
{
   /* BEGIN is used for the "boot to Flash" bootloader mode   */
   BEGIN            : origin = 0x080000, length = 0x000002
   BOOT_RSVD        : origin = 0x000002, length = 0x0001AE     /* Part of M0, BOOT rom will use this for stack */
   RAMM0            : origin = 0x0001B0, length = 0x000250
   RAMM1            : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
/*   RAMD0            : origin = 0x00C000, length = 0x000800	*/
/*   RAMD1            : origin = 0x00C800, length = 0x000800	*/
   RAMD01			: origin = 0x00C000, length = 0x001000
/*   RAMLS0_to_LS7    : origin = 0x008000, length = 0x004000 */
   RAMLS0_to_LS3    : origin = 0x008000, length = 0x002000
/*   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
   RAMLS5_to_LS6    : origin = 0x00A800, length = 0x001000
//   RAMLS5           : origin = 0x00A800, length = 0x000800
//   RAMLS6           : origin = 0x00B000, length = 0x000800
   RAMLS7	        : origin = 0x00B800, length = 0x000800
   RAMGS0_to_7      : origin = 0x00D00C, length = 0x007FF4
  /* RAMGS0           : origin = 0x00D000, length = 0x001000
   RAMGS1           : origin = 0x00E000, length = 0x001000
   RAMGS2           : origin = 0x00F000, length = 0x001000
   RAMGS3           : origin = 0x010000, length = 0x001000
   RAMGS4           : origin = 0x011000, length = 0x001000
   RAMGS5           : origin = 0x012000, length = 0x001000
   RAMGS6           : origin = 0x013000, length = 0x001000
   RAMGS7           : origin = 0x014000, length = 0x001000 */
   RAMGS8           : origin = 0x015000, length = 0x001000
   RAMGS9           : origin = 0x016000, length = 0x001000
   RAMGS10          : origin = 0x017000, length = 0x001000
   RAMGS11          : origin = 0x018000, length = 0x001000
   RAMGS12          : origin = 0x019000, length = 0x001000
   RAMGS13          : origin = 0x01A000, length = 0x001000
   RAMGS14          : origin = 0x01B000, length = 0x001000
   RAMGS15          : origin = 0x01C000, length = 0x001000

   /* Flash sectors */
   FLASH0           : origin = 0x080002, length = 0x001FFE  /* on-chip Flash */
   FLASH1           : origin = 0x082000, length = 0x002000  /* on-chip Flash */
   FLASH2           : origin = 0x084000, length = 0x002000  /* on-chip Flash */
   FLASH3           : origin = 0x086000, length = 0x002000  /* on-chip Flash */
   FLASH4           : origin = 0x088000, length = 0x008000  /* on-chip Flash */
   FLASH5           : origin = 0x090000, length = 0x008000  /* on-chip Flash */
   FLASH6           : origin = 0x098000, length = 0x008000  /* on-chip Flash */
   FLASH7           : origin = 0x0A0000, length = 0x008000  /* on-chip Flash */
   FLASH8           : origin = 0x0A8000, length = 0x008000  /* on-chip Flash */
   FLASH9           : origin = 0x0B0000, length = 0x008000  /* on-chip Flash */
   FLASH10          : origin = 0x0B8000, length = 0x002000  /* on-chip Flash */
   FLASH11          : origin = 0x0BA000, length = 0x002000  /* on-chip Flash */
   FLASH12          : origin = 0x0BC000, length = 0x002000  /* on-chip Flash */
   FLASH13          : origin = 0x0BE000, length = 0x002000  /* on-chip Flash */

   /*-------------*/
   /* CPU1 to CPU2*/
   /*-------------*/

   /* Ram space for ADC-D converted values.
      IT MUST BE THE SAME IN SLAVE LINKER FILE and coherent to what specified in AdcDriver.h!!!
      Length 0x06 means: (3 channels -> conversion -> 3 FLOAT32 = 6 word
      As consequence, CPU1TOCPU2RAM will start 6 words after its natural beginning.
   */
   ADCD_VALUES_RAM	: origin = 0x03A000, length = 0x000006

   /* CPUxTOCPUy_SERV is a shared memory to exhange services between CPUs. */
   CPU1TOCPU2_SERV  : origin = 0x03A006, length = 0x0000F0

   /* CPU1 Serial Flash Lock */
   CPU1TOCPU2_SFLOCK	: origin = 0x03A0F6, length = 0x000002

   /* CPU1 Fault IGBT status for axis 2*/
   CPU1TOCPU2_FAULTIGBT	: origin = 0x03A0F8, length = 0x000002

   /* IPC. IT MUST BE GREATER THEN 144 WORDS (SEE IPC_CPU1_To_CPU2_PutBuffer ipc.c)*/
   CPU1TOCPU2RAM   	: origin = 0x03A0FA, length = 0x000706

   /*-------------*/
   /* CPU2 to CPU1*/
   /*-------------*/

   /* Diagnostic data from CPU2 to CPU1*/
   CPU2TOCPU1RAM_DIA   	: origin = 0x03B000, length = 0x000020

   /* CPUxTOCPUy_SERV is a shared memory to exhange services between CPUs. */
   CPU2TOCPU1_SERV  : origin = 0x03B020, length = 0x0000F0

   /* Axis 2 State */
   CPU2TOCPU1_AXSTATE	: origin = 0x03B110, length = 0x000002

   /* CPU2 Serial Flash Lock */
   CPU2TOCPU1_SFLOCK	: origin = 0x03B112, length = 0x000002

   /* IPC. IT MUST BE GREATER THEN 144 WORDS (SEE IPC_CPU1_To_CPU2_GetBuffer ipc.c)*/
   CPU2TOCPU1RAM   		: origin = 0x03B114, length = 0x0006EC

   /*----------------*/
   /* CM to/from CPUx*/
   /*----------------*/
   CMTOCPURAM0_IPC   : origin = 0x038000, length = 0x000200		/* IPC. IT MUST BE GREATER THEN 144 WORDS (SEE IPC_CPU_To_CM_GetBuffer ipc.c)*/
   CMTOCPURAM0_PDO   : origin = 0x038200, length = 0x000040		/* PDO CM to CPU1 */
   CMTOCPURAM0_FSOE_STD   : origin = 0x038240, length = 0x000038	/* FSoE Standard Chn to CPU1 - 0x38 must be graeter than MAX_FSOE_STD_SIZE+2 */
   CMTOCPURAM0_FSOE_FST   : origin = 0x038278, length = 0x000008	/* FSoE Fast Chn to CPU1 - 0x08 must be graeter than MAX_FSOE_FST_SIZE+2 */
   CMTOCPURAM0_SERV  : origin = 0x038280, length = 0x000060		/* SERV CM to CPU1 - 60 is just random */
   CMTOCPURAM0_ECTST : origin = 0x0382E0, length = 0x000002		/* Ecat state from CM */
   CMTOCPURAM0	 	 : origin = 0x0382E2, length = 0x00011E		/* free */
   CMTOCPURAM1		 : origin = 0x038400, length = 0x000400		/* free */


   CPUTOCMRAM0_IPC   : origin = 0x039000, length = 0x000200		/* IPC. IT MUST BE GREATER THEN 144 WORDS (SEE IPC_CPU_To_CM_PutBuffer ipc.c)*/
   CPUTOCMRAM0_PDO   : origin = 0x039200, length = 0x000040		/* PDO CPU1 to CM */
   CPUTOCMRAM0_FSOE_STD   : origin = 0x039240, length = 0x000038	/* FSoE Standard Chn from CPU1 - 0x38 must be graeter than MAX_FSOE_STD_SIZE+2 */
   CPUTOCMRAM0_FSOE_FST   : origin = 0x039278, length = 0x000008	/* FSoE Fast Chn from CPU1 - 0x08 must be graeter than MAX_FSOE_FST_SIZE+2 */
   CPUTOCMRAM0_SERV  : origin = 0x039280, length = 0x000060		/* SERV CPU1 to CM - 60 is just random  */
   CPUTOCMRAM0	 	 : origin = 0x0392E0, length = 0x000120		/* free */
   CPUTOCMRAM1		 : origin = 0x039400, length = 0x000400		/* free */

   /*-------------------*/
   /* Global Shared RAM - Beginning of RAMGS0*/
   /*-------------------*/
   BBHENDATPOSITIONS    : origin = 0x00D000, length = 0x00000C

   CANA_MSG_RAM     : origin = 0x049000, length = 0x000800
   CANB_MSG_RAM     : origin = 0x04B000, length = 0x000800

   RESET            : origin = 0x3FFFC0, length = 0x000002

   CLA1_MSGRAMLOW   : origin = 0x001480,   length = 0x000080
   CLA1_MSGRAMHIGH  : origin = 0x001500,   length = 0x000080
   CLA1_DMA_MSGRAM  : origin = 0x001680,   length = 0x000080
   DMA_CLA1_MSGRAM  : origin = 0x001700,   length = 0x000080

}

SECTIONS
{
   codestart           : > BEGIN, ALIGN(4)
   .text               : >> FLASH1 | FLASH2 | FLASH3 | FLASH4 | FLASH5 | FLASH6 | FLASH7 | FLASH8 | FLASH9, ALIGN(4)
   .cinit              : > FLASH1 | FLASH2 | FLASH3 | FLASH4 | FLASH5 | FLASH6 | FLASH7 | FLASH8 | FLASH9, ALIGN(4)
   .switch             : > FLASH1, ALIGN(4)
   .reset              : > RESET, TYPE = DSECT /* not used, */
   .stack              : > RAMM1

#if defined(__TI_EABI__)
   .init_array      : > FLASH1, ALIGN(4)
   .bss             : >> RAMLS0_to_LS3 | RAMLS4
   .bss:output      : >> RAMLS4
   .bss:cio         : >> RAMLS4
   .data            : >> RAMLS0_to_LS3 | RAMLS4
   .sysmem          : >> RAMLS4
   /* Initalized sections go in Flash */
   .const           : > FLASH5, ALIGN(4)
#else
   .pinit           : > FLASH1, ALIGN(4)
   .ebss            : >> RAMLS4
   .esysmem         : >> RAMLS4
   .cio             : >> RAMLS4
   /* Initalized sections go in Flash */
   .econst          : >> FLASH4 | FLASH5, ALIGN(4)
#endif

   ramgs0 : > RAMGS0_to_7, type=NOINIT
   ramgs3 : > RAMGS0_to_7, type=NOINIT
   

   ADCD_VALUES_CPU2	   		: > ADCD_VALUES_RAM, type=NOINIT
   MSGRAM_CPU2_TO_CPU1_DIA	: > CPU2TOCPU1RAM_DIA, type=NOINIT	/* 8+1 words of diagnostic data from CPU2 to CPU1*/
   MSGRAM_CPU1_TO_CPU2 		: > CPU1TOCPU2RAM, type=NOINIT
   MSGRAM_CPU2_TO_CPU1 		: > CPU2TOCPU1RAM, type=NOINIT
   MSGRAM_CPU_TO_CM	   		: > CPUTOCMRAM0_IPC, type=NOINIT
   MSGRAM_CM_TO_CPU	   		: > CMTOCPURAM0_IPC, type=NOINIT

   CM_TO_CPU_SERV		: > CMTOCPURAM0_SERV, type=NOINIT
   CM_TO_CPU_PDO		: > CMTOCPURAM0_PDO, type=NOINIT
   CM_TO_CPU_FSOE_STD		: > CMTOCPURAM0_FSOE_STD, type=NOINIT
   CM_TO_CPU_FSOE_FST		: > CMTOCPURAM0_FSOE_FST, type=NOINIT

   CM_TO_CPU_ECTST		: > CMTOCPURAM0_ECTST, type=NOINIT

   CPU_TO_CM_SERV		: > CPUTOCMRAM0_SERV, type=NOINIT
   CPU_TO_CM_PDO		: > CPUTOCMRAM0_PDO, type=NOINIT
   CPU_TO_CM_FSOE_STD		: > CPUTOCMRAM0_FSOE_STD, type=NOINIT
   CPU_TO_CM_FSOE_FST		: > CPUTOCMRAM0_FSOE_FST, type=NOINIT

   CPU1_TO_CPU2_SERV    	: > CPU1TOCPU2_SERV, type=NOINIT
   CPU1_TO_CPU2_SFLOCK    	: > CPU1TOCPU2_SFLOCK, type=NOINIT
   CPU2_TO_CPU1_SERV    	: > CPU2TOCPU1_SERV, type=NOINIT
   CPU2_TO_CPU1_SFLOCK    	: > CPU2TOCPU1_SFLOCK, type=NOINIT

   CPU2_TO_CPU1_AXSTATE : > CPU2TOCPU1_AXSTATE, type=NOINIT

   CPU1_TO_CPU2_FAULT_IGBT    	: > CPU1TOCPU2_FAULTIGBT, type=NOINIT

   BBH_ENDAT_POSITIONS   : > BBHENDATPOSITIONS, type=NOINIT

   /* The following section definition are for SDFM examples */
//   Filter_RegsFile  : > RAMGS0
//   Filter1_RegsFile : > RAMGS1, fill=0x1111
//   Filter2_RegsFile : > RAMGS2, fill=0x2222
//   Filter3_RegsFile : > RAMGS3, fill=0x3333
//   Filter4_RegsFile : > RAMGS4, fill=0x4444
//   Difference_RegsFile : >RAMGS5, fill=0x3333



    /* CLA specific sections *////////////////////////////////////////////
#if defined(__TI_EABI__)
   Cla1Prog         :   LOAD = FLASH9,
                        RUN = RAMLS5_to_LS6,
                        LOAD_START(Cla1funcsLoadStart),
                        LOAD_END(Cla1funcsLoadEnd),
                        RUN_START(Cla1funcsRunStart),
                        LOAD_SIZE(Cla1funcsLoadSize),
                        ALIGN(8)
#else
   Cla1Prog         :   LOAD = FLASH9,
                        RUN = RAMLS5_to_LS6,
                        LOAD_START(_Cla1funcsLoadStart),
                        LOAD_END(_Cla1funcsLoadEnd),
                        RUN_START(_Cla1funcsRunStart),
                        LOAD_SIZE(_Cla1funcsLoadSize),
                        ALIGN(8)
#endif

   Cla1ToCpuMsgRAM  : > CLA1_MSGRAMLOW, type=NOINIT
   CpuToCla1MsgRAM  : > CLA1_MSGRAMHIGH, type=NOINIT
   Cla1ToDmaMsgRAM  : > CLA1_DMA_MSGRAM, type=NOINIT
   DmaToCla1MsgRAM  : > DMA_CLA1_MSGRAM, type=NOINIT

   Cla1DataRam      : > RAMLS7

   /* CLA C compiler sections */
   //
   // Must be allocated to memory the CLA has write access to
   //
   CLAscratch       :
                     { *.obj(CLAscratch)
                     . += CLA_SCRATCHPAD_SIZE;
                     *.obj(CLAscratch_end) } >  RAMLS7

   .scratchpad      : > RAMLS7
   .bss_cla         : > RAMLS7
   cla_shared       : > RAMLS7
#if defined(__TI_EABI__)
   .const_cla       :   LOAD = FLASH8,
                        RUN = RAMLS7,
                        RUN_START(Cla1ConstRunStart),
                        LOAD_START(Cla1ConstLoadStart),
                        LOAD_SIZE(Cla1ConstLoadSize)
#else
   .const_cla       :   LOAD = FLASH8,
                        RUN = RAMLS7,
                        RUN_START(_Cla1ConstRunStart),
                        LOAD_START(_Cla1ConstLoadStart),
                        LOAD_SIZE(_Cla1ConstLoadSize)
#endif

/////////////////////////////////////////////////////////////////////////////

   #if defined(__TI_EABI__)
       .TI.ramfunc : {} LOAD = FLASH3 | FLASH4,
                        RUN = RAMGS0_to_7
                        LOAD_START(RamfuncsLoadStart),
                        LOAD_SIZE(RamfuncsLoadSize),
                        LOAD_END(RamfuncsLoadEnd),
                        RUN_START(RamfuncsRunStart),
                        RUN_SIZE(RamfuncsRunSize),
                        RUN_END(RamfuncsRunEnd),
                        ALIGN(4)
   #else
       .TI.ramfunc : {} LOAD = FLASH3 | FLASH4,
                        RUN = RAMLS0_to_LS3,
                        LOAD_START(_RamfuncsLoadStart),
                        LOAD_SIZE(_RamfuncsLoadSize),
                        LOAD_END(_RamfuncsLoadEnd),
                        RUN_START(_RamfuncsRunStart),
                        RUN_SIZE(_RamfuncsRunSize),
                        RUN_END(_RamfuncsRunEnd),
                        ALIGN(4)
   #endif





	/** Section for operation modes **/
	UNION 			: run > RAMLS0_to_LS3
					{
						opm1funcs : LOAD > FLASH1,
					   	LOAD_START(opm1funcsLoadStart),
					   	LOAD_END(opm1funcsLoadEnd),
					   	RUN_START(opm1funcsRunStart)

						opm2funcs : LOAD > FLASH1,
					   	LOAD_START(opm2funcsLoadStart),
					   	LOAD_END(opm2funcsLoadEnd),
					   	RUN_START(opm2funcsRunStart)

						opm3funcs : LOAD > FLASH1,
					   	LOAD_START(opm3funcsLoadStart),
					   	LOAD_END(opm3funcsLoadEnd),
					   	RUN_START(opm3funcsRunStart)

						opm4funcs : LOAD > FLASH1,
					   	LOAD_START(opm4funcsLoadStart),
					   	LOAD_END(opm4funcsLoadEnd),
					   	RUN_START(opm4funcsRunStart)

						opm5funcs : LOAD > FLASH1,
					   	LOAD_START(opm5funcsLoadStart),
					   	LOAD_END(opm5funcsLoadEnd),
					   	RUN_START(opm5funcsRunStart)

						opm6funcs : LOAD > FLASH1,
					   	LOAD_START(opm6funcsLoadStart),
					   	LOAD_END(opm6funcsLoadEnd),
					   	RUN_START(opm6funcsRunStart)

						opm7funcs : LOAD > FLASH1,
					   	LOAD_START(opm7funcsLoadStart),
					   	LOAD_END(opm7funcsLoadEnd),
					   	RUN_START(opm7funcsRunStart)

						opm8funcs : LOAD > FLASH1,
					   	LOAD_START(opm8funcsLoadStart),
					   	LOAD_END(opm8funcsLoadEnd),
					   	RUN_START(opm8funcsRunStart)

						opm9funcs : LOAD > FLASH1,
					   	LOAD_START(opm9funcsLoadStart),
					   	LOAD_END(opm9funcsLoadEnd),
					   	RUN_START(opm9funcsRunStart)

						opm10funcs : LOAD > FLASH1,
					   	LOAD_START(opm10funcsLoadStart),
					   	LOAD_END(opm10funcsLoadEnd),
					   	RUN_START(opm10funcsRunStart)

						opm11funcs : LOAD > FLASH1,
					   	LOAD_START(opm11funcsLoadStart),
					   	LOAD_END(opm11funcsLoadEnd),
					   	RUN_START(opm11funcsRunStart)

						opm12funcs : LOAD > FLASH1,
					   	LOAD_START(opm12funcsLoadStart),
					   	LOAD_END(opm12funcsLoadEnd),
					   	RUN_START(opm12funcsRunStart)
					}

	/** Section for update position function **/
	UNION 			: run > RAMD01
					{
						updateValuesfuncs1 : LOAD > FLASH1
						LOAD_START(updateValuesfuncs1LoadStart),
						LOAD_END(updateValuesfuncs1LoadEnd),
						RUN_START(updateValuesfuncs1RunStart)

						updateValuesfuncs2 : LOAD > FLASH1
						LOAD_START(updateValuesfuncs2LoadStart),
						LOAD_END(updateValuesfuncs2LoadEnd),
						RUN_START(updateValuesfuncs2RunStart)

					}


	UNION 			: run > RAMGS0_to_7
					{
						controller1_funcs : LOAD > FLASH1
					   	LOAD_START(controller1_funcsLoadStart),
					   	LOAD_END(controller1_funcsLoadEnd),
					   	RUN_START(controller1_funcsRunStart)

						controller2_funcs : LOAD > FLASH1
					   	LOAD_START(controller2_funcsLoadStart),
					   	LOAD_END(controller2_funcsLoadEnd),
					   	RUN_START(controller2_funcsRunStart)

						controller3_funcs : LOAD > FLASH1
					   	LOAD_START(controller3_funcsLoadStart),
					   	LOAD_END(controller3_funcsLoadEnd),
					   	RUN_START(controller3_funcsRunStart)

						controller4_funcs : LOAD > FLASH1
					   	LOAD_START(controller4_funcsLoadStart),
					   	LOAD_END(controller4_funcsLoadEnd),
					   	RUN_START(controller4_funcsRunStart)

						controller5_funcs : LOAD > FLASH1
					   	LOAD_START(controller5_funcsLoadStart),
					   	LOAD_END(controller5_funcsLoadEnd),
					   	RUN_START(controller5_funcsRunStart)

						controller6_funcs : LOAD > FLASH1
					   	LOAD_START(controller6_funcsLoadStart),
					   	LOAD_END(controller6_funcsLoadEnd),
					   	RUN_START(controller6_funcsRunStart)

						no_controller_funcs : LOAD > FLASH1
					   	LOAD_START(no_controller_funcsLoadStart),
					   	LOAD_END(no_controller_funcsLoadEnd),
					   	RUN_START(no_controller_funcsRunStart)
					}




	   /* Allocate IQ math areas: */
   IQmath			: > FLASH6, PAGE = 0, ALIGN(8)            /* Math Code */
   IQmathTables		: > FLASH7, PAGE = 0, ALIGN(8)


   UNION	: run > RAMD01
   {
   		Sf_cache_ram :
	 	FLASH28_API :	LOAD > FLASH3 | FLASH4
	 	{
	 		-l F2838x_C28x_FlashAPI.lib
	 	}
		LOAD_START(Flash28_API_LoadStart),
	 	LOAD_END(Flash28_API_LoadEnd),
	 	RUN_START(Flash28_API_RunStart),
	 	ALIGN(4)
   }

   .codestart: {} crc_table(_my_crc_table_for_a1)

}

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

He gives me this warning:

#10199-D CRC table operator (_my_crc_table_for_a1) ignored for ".codestart":  CRC table operator cannot be associated with empty output section 2838x_FLASH_lnk_ecat_cpu1.cmd /EvalBoard_CPU1-2 line 430 C/C++ Problem

How can I fix that? I have some problems in how I should fix this.

Thank you!

Luca Predieri

  • Hi Luca,

    I apologize for the delayed response; I have now looped in the expert on this topic, and you can expect a reply from them shortly.

    Best Regards,

    Delaney

  • Hi Delaney, 

    While we're waiting for the experts to answer, I had some updates.

    Now I managed to calculate the CRC with this linker:

    CLA_SCRATCHPAD_SIZE = 0x100;
    --undef_sym=__cla_scratchpad_end
    --undef_sym=__cla_scratchpad_start
    
    MEMORY
    {
       /* BEGIN is used for the "boot to Flash" bootloader mode   */
       BEGIN            : origin = 0x080000, length = 0x000002
       BOOT_RSVD        : origin = 0x000002, length = 0x0001AE     /* Part of M0, BOOT rom will use this for stack */
       RAMM0            : origin = 0x0001B0, length = 0x000250
       RAMM1            : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
    /*   RAMD0            : origin = 0x00C000, length = 0x000800	*/
    /*   RAMD1            : origin = 0x00C800, length = 0x000800	*/
       RAMD01			: origin = 0x00C000, length = 0x001000
    /*   RAMLS0_to_LS7    : origin = 0x008000, length = 0x004000 */
       RAMLS0_to_LS3    : origin = 0x008000, length = 0x002000
    /*   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
       RAMLS5_to_LS6    : origin = 0x00A800, length = 0x001000
    //   RAMLS5           : origin = 0x00A800, length = 0x000800
    //   RAMLS6           : origin = 0x00B000, length = 0x000800
       RAMLS7	        : origin = 0x00B800, length = 0x000800
       RAMGS0_to_7      : origin = 0x00D00C, length = 0x007FF4
      /* RAMGS0           : origin = 0x00D000, length = 0x001000
       RAMGS1           : origin = 0x00E000, length = 0x001000
       RAMGS2           : origin = 0x00F000, length = 0x001000
       RAMGS3           : origin = 0x010000, length = 0x001000
       RAMGS4           : origin = 0x011000, length = 0x001000
       RAMGS5           : origin = 0x012000, length = 0x001000
       RAMGS6           : origin = 0x013000, length = 0x001000
       RAMGS7           : origin = 0x014000, length = 0x001000 */
       RAMGS8           : origin = 0x015000, length = 0x001000
       RAMGS9           : origin = 0x016000, length = 0x001000
       RAMGS10          : origin = 0x017000, length = 0x001000
       RAMGS11          : origin = 0x018000, length = 0x001000
       RAMGS12          : origin = 0x019000, length = 0x001000
       RAMGS13          : origin = 0x01A000, length = 0x001000
       RAMGS14          : origin = 0x01B000, length = 0x001000
       RAMGS15          : origin = 0x01C000, length = 0x001000
    
       /* Flash sectors */
       FLASH0           : origin = 0x080002, length = 0x001FFE  /* on-chip Flash */
       FLASH1           : origin = 0x082000, length = 0x002000  /* on-chip Flash */
       FLASH2           : origin = 0x084000, length = 0x002000  /* on-chip Flash */
       FLASH3           : origin = 0x086000, length = 0x002000  /* on-chip Flash */
       FLASH4           : origin = 0x088000, length = 0x008000  /* on-chip Flash */
       FLASH5           : origin = 0x090000, length = 0x008000  /* on-chip Flash */
       FLASH6           : origin = 0x098000, length = 0x008000  /* on-chip Flash */
       FLASH7           : origin = 0x0A0000, length = 0x008000  /* on-chip Flash */
       FLASH8           : origin = 0x0A8000, length = 0x008000  /* on-chip Flash */
       FLASH9           : origin = 0x0B0000, length = 0x008000  /* on-chip Flash */
       FLASH10          : origin = 0x0B8000, length = 0x002000  /* on-chip Flash */
       FLASH11          : origin = 0x0BA000, length = 0x002000  /* on-chip Flash */
       FLASH12          : origin = 0x0BC000, length = 0x002000  /* on-chip Flash */
       FLASH13          : origin = 0x0BE000, length = 0x002000  /* on-chip Flash */
    
       /*-------------*/
       /* CPU1 to CPU2*/
       /*-------------*/
    
       /* Ram space for ADC-D converted values.
          IT MUST BE THE SAME IN SLAVE LINKER FILE and coherent to what specified in AdcDriver.h!!!
          Length 0x06 means: (3 channels -> conversion -> 3 FLOAT32 = 6 word
          As consequence, CPU1TOCPU2RAM will start 6 words after its natural beginning.
       */
       ADCD_VALUES_RAM	: origin = 0x03A000, length = 0x000006
    
       /* CPUxTOCPUy_SERV is a shared memory to exhange services between CPUs. */
       CPU1TOCPU2_SERV  : origin = 0x03A006, length = 0x0000F0
    
       /* CPU1 Serial Flash Lock */
       CPU1TOCPU2_SFLOCK	: origin = 0x03A0F6, length = 0x000002
    
       /* CPU1 Fault IGBT status for axis 2*/
       CPU1TOCPU2_FAULTIGBT	: origin = 0x03A0F8, length = 0x000002
    
       /* IPC. IT MUST BE GREATER THEN 144 WORDS (SEE IPC_CPU1_To_CPU2_PutBuffer ipc.c)*/
       CPU1TOCPU2RAM   	: origin = 0x03A0FA, length = 0x000706
    
       /*-------------*/
       /* CPU2 to CPU1*/
       /*-------------*/
    
       /* Diagnostic data from CPU2 to CPU1*/
       CPU2TOCPU1RAM_DIA   	: origin = 0x03B000, length = 0x000020
    
       /* CPUxTOCPUy_SERV is a shared memory to exhange services between CPUs. */
       CPU2TOCPU1_SERV  : origin = 0x03B020, length = 0x0000F0
    
       /* Axis 2 State */
       CPU2TOCPU1_AXSTATE	: origin = 0x03B110, length = 0x000002
    
       /* CPU2 Serial Flash Lock */
       CPU2TOCPU1_SFLOCK	: origin = 0x03B112, length = 0x000002
    
       /* IPC. IT MUST BE GREATER THEN 144 WORDS (SEE IPC_CPU1_To_CPU2_GetBuffer ipc.c)*/
       CPU2TOCPU1RAM   		: origin = 0x03B114, length = 0x0006EC
    
       /*----------------*/
       /* CM to/from CPUx*/
       /*----------------*/
       CMTOCPURAM0_IPC   : origin = 0x038000, length = 0x000200		/* IPC. IT MUST BE GREATER THEN 144 WORDS (SEE IPC_CPU_To_CM_GetBuffer ipc.c)*/
       CMTOCPURAM0_PDO   : origin = 0x038200, length = 0x000040		/* PDO CM to CPU1 */
       CMTOCPURAM0_FSOE_STD   : origin = 0x038240, length = 0x000038	/* FSoE Standard Chn to CPU1 - 0x38 must be graeter than MAX_FSOE_STD_SIZE+2 */
       CMTOCPURAM0_FSOE_FST   : origin = 0x038278, length = 0x000008	/* FSoE Fast Chn to CPU1 - 0x08 must be graeter than MAX_FSOE_FST_SIZE+2 */
       CMTOCPURAM0_SERV  : origin = 0x038280, length = 0x000060		/* SERV CM to CPU1 - 60 is just random */
       CMTOCPURAM0_ECTST : origin = 0x0382E0, length = 0x000002		/* Ecat state from CM */
       CMTOCPURAM0	 	 : origin = 0x0382E2, length = 0x00011E		/* free */
       CMTOCPURAM1		 : origin = 0x038400, length = 0x000400		/* free */
    
    
       CPUTOCMRAM0_IPC   : origin = 0x039000, length = 0x000200		/* IPC. IT MUST BE GREATER THEN 144 WORDS (SEE IPC_CPU_To_CM_PutBuffer ipc.c)*/
       CPUTOCMRAM0_PDO   : origin = 0x039200, length = 0x000040		/* PDO CPU1 to CM */
       CPUTOCMRAM0_FSOE_STD   : origin = 0x039240, length = 0x000038	/* FSoE Standard Chn from CPU1 - 0x38 must be graeter than MAX_FSOE_STD_SIZE+2 */
       CPUTOCMRAM0_FSOE_FST   : origin = 0x039278, length = 0x000008	/* FSoE Fast Chn from CPU1 - 0x08 must be graeter than MAX_FSOE_FST_SIZE+2 */
       CPUTOCMRAM0_SERV  : origin = 0x039280, length = 0x000060		/* SERV CPU1 to CM - 60 is just random  */
       CPUTOCMRAM0	 	 : origin = 0x0392E0, length = 0x000120		/* free */
       CPUTOCMRAM1		 : origin = 0x039400, length = 0x000400		/* free */
    
       /*-------------------*/
       /* Global Shared RAM - Beginning of RAMGS0*/
       /*-------------------*/
       BBHENDATPOSITIONS    : origin = 0x00D000, length = 0x00000C
    
       CANA_MSG_RAM     : origin = 0x049000, length = 0x000800
       CANB_MSG_RAM     : origin = 0x04B000, length = 0x000800
    
       RESET            : origin = 0x3FFFC0, length = 0x000002
    
       CLA1_MSGRAMLOW   : origin = 0x001480,   length = 0x000080
       CLA1_MSGRAMHIGH  : origin = 0x001500,   length = 0x000080
       CLA1_DMA_MSGRAM  : origin = 0x001680,   length = 0x000080
       DMA_CLA1_MSGRAM  : origin = 0x001700,   length = 0x000080
    
    }
    
    SECTIONS
    {
       codestart           : > BEGIN, ALIGN(4)
       .text               : >> FLASH1 | FLASH2 | FLASH3 | FLASH4 | FLASH5 | FLASH6 | FLASH7 | FLASH8 | FLASH9, ALIGN(4), crc_table(_my_crc_table_for_a1, algorithm=CRC32_PRIME)
       .cinit              : > FLASH1 | FLASH2 | FLASH3 | FLASH4 | FLASH5 | FLASH6 | FLASH7 | FLASH8 | FLASH9, ALIGN(4)
       .switch             : > FLASH1, ALIGN(4)
       .reset              : > RESET, TYPE = DSECT /* not used, */
       .stack              : > RAMM1
    
    
    #if defined(__TI_EABI__)
       .init_array      : > FLASH1, ALIGN(4)
       .bss             : >> RAMLS0_to_LS3 | RAMLS4
       .bss:output      : >> RAMLS4
       .bss:cio         : >> RAMLS4
       .data            : >> RAMLS0_to_LS3 | RAMLS4
       .sysmem          : >> RAMLS4
       /* Initalized sections go in Flash */
       .const           : > FLASH5, ALIGN(4)
    #else
       .pinit           : > FLASH1, ALIGN(4)
       .ebss            : >> RAMLS4
       .esysmem         : >> RAMLS4
       .cio             : >> RAMLS4
       /* Initalized sections go in Flash */
       .econst          : >> FLASH4 | FLASH5, ALIGN(4)
    #endif
    
       ramgs0 : > RAMGS0_to_7, type=NOINIT
       ramgs3 : > RAMGS0_to_7, type=NOINIT
       
    
       ADCD_VALUES_CPU2	   		: > ADCD_VALUES_RAM, type=NOINIT
       MSGRAM_CPU2_TO_CPU1_DIA	: > CPU2TOCPU1RAM_DIA, type=NOINIT	/* 8+1 words of diagnostic data from CPU2 to CPU1*/
       MSGRAM_CPU1_TO_CPU2 		: > CPU1TOCPU2RAM, type=NOINIT
       MSGRAM_CPU2_TO_CPU1 		: > CPU2TOCPU1RAM, type=NOINIT
       MSGRAM_CPU_TO_CM	   		: > CPUTOCMRAM0_IPC, type=NOINIT
       MSGRAM_CM_TO_CPU	   		: > CMTOCPURAM0_IPC, type=NOINIT
    
       CM_TO_CPU_SERV		: > CMTOCPURAM0_SERV, type=NOINIT
       CM_TO_CPU_PDO		: > CMTOCPURAM0_PDO, type=NOINIT
       CM_TO_CPU_FSOE_STD		: > CMTOCPURAM0_FSOE_STD, type=NOINIT
       CM_TO_CPU_FSOE_FST		: > CMTOCPURAM0_FSOE_FST, type=NOINIT
    
       CM_TO_CPU_ECTST		: > CMTOCPURAM0_ECTST, type=NOINIT
    
       CPU_TO_CM_SERV		: > CPUTOCMRAM0_SERV, type=NOINIT
       CPU_TO_CM_PDO		: > CPUTOCMRAM0_PDO, type=NOINIT
       CPU_TO_CM_FSOE_STD		: > CPUTOCMRAM0_FSOE_STD, type=NOINIT
       CPU_TO_CM_FSOE_FST		: > CPUTOCMRAM0_FSOE_FST, type=NOINIT
    
       CPU1_TO_CPU2_SERV    	: > CPU1TOCPU2_SERV, type=NOINIT
       CPU1_TO_CPU2_SFLOCK    	: > CPU1TOCPU2_SFLOCK, type=NOINIT
       CPU2_TO_CPU1_SERV    	: > CPU2TOCPU1_SERV, type=NOINIT
       CPU2_TO_CPU1_SFLOCK    	: > CPU2TOCPU1_SFLOCK, type=NOINIT
    
       CPU2_TO_CPU1_AXSTATE : > CPU2TOCPU1_AXSTATE, type=NOINIT
    
       CPU1_TO_CPU2_FAULT_IGBT    	: > CPU1TOCPU2_FAULTIGBT, type=NOINIT
    
       BBH_ENDAT_POSITIONS   : > BBHENDATPOSITIONS, type=NOINIT
    
       /* The following section definition are for SDFM examples */
    //   Filter_RegsFile  : > RAMGS0
    //   Filter1_RegsFile : > RAMGS1, fill=0x1111
    //   Filter2_RegsFile : > RAMGS2, fill=0x2222
    //   Filter3_RegsFile : > RAMGS3, fill=0x3333
    //   Filter4_RegsFile : > RAMGS4, fill=0x4444
    //   Difference_RegsFile : >RAMGS5, fill=0x3333
    
    
    
        /* CLA specific sections *////////////////////////////////////////////
    #if defined(__TI_EABI__)
       Cla1Prog         :   LOAD = FLASH9,
                            RUN = RAMLS5_to_LS6,
                            LOAD_START(Cla1funcsLoadStart),
                            LOAD_END(Cla1funcsLoadEnd),
                            RUN_START(Cla1funcsRunStart),
                            LOAD_SIZE(Cla1funcsLoadSize),
                            ALIGN(8)
    #else
       Cla1Prog         :   LOAD = FLASH9,
                            RUN = RAMLS5_to_LS6,
                            LOAD_START(_Cla1funcsLoadStart),
                            LOAD_END(_Cla1funcsLoadEnd),
                            RUN_START(_Cla1funcsRunStart),
                            LOAD_SIZE(_Cla1funcsLoadSize),
                            ALIGN(8)
    #endif
    
       Cla1ToCpuMsgRAM  : > CLA1_MSGRAMLOW, type=NOINIT
       CpuToCla1MsgRAM  : > CLA1_MSGRAMHIGH, type=NOINIT
       Cla1ToDmaMsgRAM  : > CLA1_DMA_MSGRAM, type=NOINIT
       DmaToCla1MsgRAM  : > DMA_CLA1_MSGRAM, type=NOINIT
    
       Cla1DataRam      : > RAMLS7
    
       /* CLA C compiler sections */
       //
       // Must be allocated to memory the CLA has write access to
       //
       CLAscratch       :
                         { *.obj(CLAscratch)
                         . += CLA_SCRATCHPAD_SIZE;
                         *.obj(CLAscratch_end) } >  RAMLS7
    
       .scratchpad      : > RAMLS7
       .bss_cla         : > RAMLS7
       cla_shared       : > RAMLS7
    #if defined(__TI_EABI__)
       .const_cla       :   LOAD = FLASH8,
                            RUN = RAMLS7,
                            RUN_START(Cla1ConstRunStart),
                            LOAD_START(Cla1ConstLoadStart),
                            LOAD_SIZE(Cla1ConstLoadSize)
    #else
       .const_cla       :   LOAD = FLASH8,
                            RUN = RAMLS7,
                            RUN_START(_Cla1ConstRunStart),
                            LOAD_START(_Cla1ConstLoadStart),
                            LOAD_SIZE(_Cla1ConstLoadSize)
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    
       #if defined(__TI_EABI__)
           .TI.ramfunc : {} LOAD = FLASH3 | FLASH4,
                            RUN = RAMGS0_to_7
                            LOAD_START(RamfuncsLoadStart),
                            LOAD_SIZE(RamfuncsLoadSize),
                            LOAD_END(RamfuncsLoadEnd),
                            RUN_START(RamfuncsRunStart),
                            RUN_SIZE(RamfuncsRunSize),
                            RUN_END(RamfuncsRunEnd),
                            ALIGN(4)
       #else
           .TI.ramfunc : {} LOAD = FLASH3 | FLASH4,
                            RUN = RAMLS0_to_LS3,
                            LOAD_START(_RamfuncsLoadStart),
                            LOAD_SIZE(_RamfuncsLoadSize),
                            LOAD_END(_RamfuncsLoadEnd),
                            RUN_START(_RamfuncsRunStart),
                            RUN_SIZE(_RamfuncsRunSize),
                            RUN_END(_RamfuncsRunEnd),
                            ALIGN(4)
       #endif
    
    
    
    
    
    	/** Section for operation modes **/
    	UNION 			: run > RAMLS0_to_LS3
    					{
    						opm1funcs : LOAD > FLASH1,
    					   	LOAD_START(opm1funcsLoadStart),
    					   	LOAD_END(opm1funcsLoadEnd),
    					   	RUN_START(opm1funcsRunStart)
    
    						opm2funcs : LOAD > FLASH1,
    					   	LOAD_START(opm2funcsLoadStart),
    					   	LOAD_END(opm2funcsLoadEnd),
    					   	RUN_START(opm2funcsRunStart)
    
    						opm3funcs : LOAD > FLASH1,
    					   	LOAD_START(opm3funcsLoadStart),
    					   	LOAD_END(opm3funcsLoadEnd),
    					   	RUN_START(opm3funcsRunStart)
    
    						opm4funcs : LOAD > FLASH1,
    					   	LOAD_START(opm4funcsLoadStart),
    					   	LOAD_END(opm4funcsLoadEnd),
    					   	RUN_START(opm4funcsRunStart)
    
    						opm5funcs : LOAD > FLASH1,
    					   	LOAD_START(opm5funcsLoadStart),
    					   	LOAD_END(opm5funcsLoadEnd),
    					   	RUN_START(opm5funcsRunStart)
    
    						opm6funcs : LOAD > FLASH1,
    					   	LOAD_START(opm6funcsLoadStart),
    					   	LOAD_END(opm6funcsLoadEnd),
    					   	RUN_START(opm6funcsRunStart)
    
    						opm7funcs : LOAD > FLASH1,
    					   	LOAD_START(opm7funcsLoadStart),
    					   	LOAD_END(opm7funcsLoadEnd),
    					   	RUN_START(opm7funcsRunStart)
    
    						opm8funcs : LOAD > FLASH1,
    					   	LOAD_START(opm8funcsLoadStart),
    					   	LOAD_END(opm8funcsLoadEnd),
    					   	RUN_START(opm8funcsRunStart)
    
    						opm9funcs : LOAD > FLASH1,
    					   	LOAD_START(opm9funcsLoadStart),
    					   	LOAD_END(opm9funcsLoadEnd),
    					   	RUN_START(opm9funcsRunStart)
    
    						opm10funcs : LOAD > FLASH1,
    					   	LOAD_START(opm10funcsLoadStart),
    					   	LOAD_END(opm10funcsLoadEnd),
    					   	RUN_START(opm10funcsRunStart)
    
    						opm11funcs : LOAD > FLASH1,
    					   	LOAD_START(opm11funcsLoadStart),
    					   	LOAD_END(opm11funcsLoadEnd),
    					   	RUN_START(opm11funcsRunStart)
    
    						opm12funcs : LOAD > FLASH1,
    					   	LOAD_START(opm12funcsLoadStart),
    					   	LOAD_END(opm12funcsLoadEnd),
    					   	RUN_START(opm12funcsRunStart)
    					}
    
    	/** Section for update position function **/
    	UNION 			: run > RAMD01
    					{
    						updateValuesfuncs1 : LOAD > FLASH1
    						LOAD_START(updateValuesfuncs1LoadStart),
    						LOAD_END(updateValuesfuncs1LoadEnd),
    						RUN_START(updateValuesfuncs1RunStart)
    
    						updateValuesfuncs2 : LOAD > FLASH1
    						LOAD_START(updateValuesfuncs2LoadStart),
    						LOAD_END(updateValuesfuncs2LoadEnd),
    						RUN_START(updateValuesfuncs2RunStart)
    
    					}
    
    
    	UNION 			: run > RAMGS0_to_7
    					{
    						controller1_funcs : LOAD > FLASH1
    					   	LOAD_START(controller1_funcsLoadStart),
    					   	LOAD_END(controller1_funcsLoadEnd),
    					   	RUN_START(controller1_funcsRunStart)
    
    						controller2_funcs : LOAD > FLASH1
    					   	LOAD_START(controller2_funcsLoadStart),
    					   	LOAD_END(controller2_funcsLoadEnd),
    					   	RUN_START(controller2_funcsRunStart)
    
    						controller3_funcs : LOAD > FLASH1
    					   	LOAD_START(controller3_funcsLoadStart),
    					   	LOAD_END(controller3_funcsLoadEnd),
    					   	RUN_START(controller3_funcsRunStart)
    
    						controller4_funcs : LOAD > FLASH1
    					   	LOAD_START(controller4_funcsLoadStart),
    					   	LOAD_END(controller4_funcsLoadEnd),
    					   	RUN_START(controller4_funcsRunStart)
    
    						controller5_funcs : LOAD > FLASH1
    					   	LOAD_START(controller5_funcsLoadStart),
    					   	LOAD_END(controller5_funcsLoadEnd),
    					   	RUN_START(controller5_funcsRunStart)
    
    						controller6_funcs : LOAD > FLASH1
    					   	LOAD_START(controller6_funcsLoadStart),
    					   	LOAD_END(controller6_funcsLoadEnd),
    					   	RUN_START(controller6_funcsRunStart)
    
    						no_controller_funcs : LOAD > FLASH1
    					   	LOAD_START(no_controller_funcsLoadStart),
    					   	LOAD_END(no_controller_funcsLoadEnd),
    					   	RUN_START(no_controller_funcsRunStart)
    					}
    
    
    
    
    	   /* Allocate IQ math areas: */
       IQmath			: > FLASH6, PAGE = 0, ALIGN(8)            /* Math Code */
       IQmathTables		: > FLASH7, PAGE = 0, ALIGN(8)
    
    
       UNION	: run > RAMD01
       {
       		Sf_cache_ram :
    	 	FLASH28_API :	LOAD > FLASH3 | FLASH4
    	 	{
    	 		-l F2838x_C28x_FlashAPI.lib
    	 	}
    		LOAD_START(Flash28_API_LoadStart),
    	 	LOAD_END(Flash28_API_LoadEnd),
    	 	RUN_START(Flash28_API_RunStart),
    	 	ALIGN(4)
       }
    
    
    
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

    At line 143 we calculate it:

       .text               : >> FLASH1 | FLASH2 | FLASH3 | FLASH4 | FLASH5 | FLASH6 | FLASH7 | FLASH8 | FLASH9, ALIGN(4), crc_table(_my_crc_table_for_a1, algorithm=CRC32_PRIME)

    Thus, this is the output in the .map file:

    _my_crc_table_for_a1 @ 00000004 records: 6, size/record: 8, table size: 50
    	.text.1: algorithm=CRC32_PRIME(ID=0), page=0, load addr=00082abc, size=00001544, CRC=14bce554
    	.text.2: algorithm=CRC32_PRIME(ID=0), page=0, load addr=00084000, size=00002000, CRC=9d368a4f
    	.text.3: algorithm=CRC32_PRIME(ID=0), page=0, load addr=00086b88, size=00001478, CRC=07b50fba
    	.text.4: algorithm=CRC32_PRIME(ID=0), page=0, load addr=0008a7e8, size=00005817, CRC=d0ab061f
    	.text.5: algorithm=CRC32_PRIME(ID=0), page=0, load addr=00094300, size=00003d00, CRC=734878da
    	.text.6: algorithm=CRC32_PRIME(ID=0), page=0, load addr=00098000, size=00001cb8, CRC=805ac388

    I have two questions following:

    - Do I have 6 different CRCs because the compiler only used 6 FLASH sectors?

    - How can I calculate with an external application the CRC to verify the program?

    Thank you!
    Luca 

  • Hi Luca,

    You can combine the FLASH regions to one single group and use them for calculating the CRC. We have a sample linker cmd file already present in our SDK to calculate the CRC, please have a look at it at - C2000Ware_5_03_00_00\device_support\f2838x\common\cmd\2838x_FLASH_lnk_crc_cpu1.cmd

    Thanks

    Aswin