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.

Global variable Autoinitialization - .cinit

Other Parts Discussed in Thread: SYSBIOS

Hello All,

 

I'd like to initialize some global vars that I have declared in a specific memory section.

But I did not find how to declare to the linker that my memory sections has to be initialize. (like .cinit:)

 

my linker.cmd file:

SECTIONS {
    
   .onchip_code:     {} > DDR3_DSP
   .onchip_data:     {} > DDR3_DSP
   .onchip_data_L3: {} > OCMC

   .offchip_code:     {} > DDR3_DSP
   .offchip_data:     {} > SHMEM_DATA
   .offchip_config: {} > SHMEM_CFG
   .my_sect_ddr:    {} > DDR3_DSP
   .my_sect_iram:    {} > DDR3_DSP
   .plt:            {} > DDR3_DSP
}

 

I would like that global variables declared into SHMEM_DATA section to be autoinitialized.

Any help will be welcomed.

 

  • It is the C compiler which does most of the work related to how .cinit is used to auto-initialize global variables.  Thus, the easiest solution is to define those variables in C, but use the DATA_SECTION pragma to put them in the .offchip_data section.  Let the compiler take care of all the details after that.

    Thanks and regards,

    -George

  • Hi George,

    I have some variables declared without any DATA_SECTION pragma and those variables are auto-initialized and are placed in the DDR3_DSP section, I presume it is because in the xdc board package, data memory is setted to be DDR3_DSP.

    But for other variables that are declared and placed in the section .offchip_data (in "SHMEM_DATA") , the autoinitialization of variables doesn't occur.

    the vars start with a non zero value. I am using syslink ProcMgr_load loader from the ARM to load my DSP .

    After building the project I got a warning saying the entry point was changed from "_C_int00" to "ti_sysbios_family_c64p_Hwi0", some posts on forums says that it's a normal behavior that syslink creates to ensure that code entry point is aligned to a memory page.

    1/May it be the cause of initialization miss in the DSP bootstrap?

    2/ does the compiler by default auto-initialize variables in all the memory sections? or special command need to be written in the linker .cmd file. (May be using GROUP or UNION or something else).

    Thanks for your support.

  • Are you using EABI?  Look for the option --abi=eabi

  • Sorry for the delay.

    Yes I am using the eabi option.

  • In EABI mode, the compiler arranges for the run-time initialization of all global variables. Global variables without an explicit initializer are initialized to zero. The run-time initialization is accomplished by a function called from _c_int00, which is the default entry point for C programs. Given that your system has changed the entry point, the new entry point must take care to perform auto-initialization. I would be very surprised if ti_sysbios_family_c64p_Hwi0 did not already do this. Could you please post your linker map file? I would like to verify that the run-time initialization meta-data is present in the executable. Please indicate which variables are not being initialized.