AnsweredAssumed Answered

I'm running the code from FLASH currently, but want to speed things up by copying the code to RAM at boot up and executing there. What do I have to change in the  linker file to have the boot code in FLASH copy the executable to RAM and jump there?

Question asked by Ashish Jadhav on Jan 9, 2014
Latest reply on Jan 20, 2014 by lunminliang

I'm running the code from FLASH currently, but want to speed things up by copying the code to RAM at boot up and executing there. What do I have to change in the CodeWarrior project settings and/or linker file to have the boot code in FLASH copy the executable to RAM and jump there?


MEMORY {

/* section allocation */

/* exception_handlers:             org=0x40000000, len=0x00001000 */

FLASH_BTL_LOW        : org = 0x00000000, len =  0x4000

FLASH_BTL_HIGH       : org = 0x00040000, len =  0x20000

FLASH_EEPROM         : org = 0x00004000, len =  0x18000

FLASH_NIA_LOGISTIC   : org = 0x0001C000, len =  0x4000

FLASH_DATASET        : org = 0x00020000, len =  0x10000

FLASH_VC_PARAMETER   : org = 0x00030000, len =  0x5000

FLASH_CC_PARAMETER   : org = 0x00035000, len =  0x6000

FLASH_GS_PARAMETER   : org = 0x0003B000, len =  0x4F00

FLASH_SW_SIGNATURE   : org = 0x0003FF00, len =  0x100

/* FLASH_RESERVED_FLASH : org = 0x00060000, len =  0x20000 */

/* @todo split of default data for FR / CAN Stack etc..*/

FLASH_NIA_CHILI_INT  : org = 0x00060000, len =  0x2000

FLASH_NIA_CHILI_PARAM: org = 0x00064000, len =  0x4000

FLASH_NIA_CHILI      : org = 0x00080000, len =  0x40000

/* FLASH_AUTOSAR_QM     : org = 0x000B6000, len =  0xA000 */

FLASH_CC_CODE        : org = 0x000C0000, len =  0x20000

FLASH_VC_CODE        : org = 0x000E0000, len =  0x10000

FLASH_GS_CODE        : org = 0x000F0000, len =  0x10000

 

/* @todo RAM segmentation */

/* RAM_AUTOSAR_QM       : org = 0x40000000, len =  0x2000  */

/* RAM_NIA_CHILI        : org = 0x40002000, len =  0x4400  */

/* RAM_CC               : org = 0x40006400, len =  0x2800  */

/* RAM_VC               : org = 0x40008C00, len =  0x2000  */

/* RAM_GS               : org = 0x4000AC00, len =  0x1000  */

RAM_ALL              : org = 0x40000000, len =  0x4000

RAM_SBL              : org = 0x40004000, len =  0x7C00

RAM_STACK            : org = 0x4000BC00, len =  0x4000

RAM_RST_SAFE         : org = 0x4000FC00, len =  0x3C0

RST_SAFE_BTL_APP     : org = 0x4000FFC0, len =  0x40

RAM_FLEXRAY          : org = 0x50000000, len =  0x8000

 

}

 

 

SECTIONS {

 

 

    .resetword : {} > FLASH_BTL_LOW

    .mpt_startup : {} > FLASH_BTL_LOW

 

 

    GROUP : {

        .intvectcode : {}

        /* This is a dummy section to satisfy the linker for vle!*/

        /* This section should not contain any code.             */

        .text_e (TEXT) : {

            *(.text)

            . = (.+15) & ~15;

        }

        .text (TEXT) : {

            *(.text) *(.text_vle) *(.rodata) *(.init) *(.fini) *(.eini) *(.ctors) *(.dtors)

            . = (.+15) & ~15;

/* Safe Context "Store of symbols in Flash" */

            STORE(ADDR(.ossAppliDataAll_Trusted), 4)

            STORE(_ossAppliData_LOADADDR_All_Trusted, 4)

            STORE(_ossAppliData_SIZE_All_Trusted, 4)

            STORE(ADDR(.ossAppluDataAll_Trusted), 4)

            STORE(0, 4)

            STORE((SIZEOF(.ossAppluDataAll_Trusted) +31) &~31, 4)

            STORE(ADDR(.ossAppliSDADataAll_Trusted), 4)

            STORE(_ossAppliSDAData_LOADADDR_All_Trusted, 4)

            STORE(_ossAppliSDAData_SIZE_All_Trusted, 4)

            STORE(ADDR(.ossAppluSDADataAll_Trusted), 4)

            STORE(0, 4)

            STORE((SIZEOF(.ossAppluSDADataAll_Trusted) +31) &~31, 4)

        }

/* Safe Context "Store of symbols in Flash" */

        .sdata2 (TEXT) : {}

 

 

/* Safe Context Location of Flash data */

        .textCfg (CONST):{

          *(.os_sConfigBlock)

          *(.os_sConfigBlock2)         

          *(.os_ConfigBlock)

          *(.os_ConfigBlock2)

        }

 

 

        .oscode(TEXT) : {}

        .osSCTXcode(TEXT) : {}

        .osTfCallerStub_code(TEXT) : {}

        .osTfCalleeStub_code(TEXT) : {}

        .osconst(CONST) : {}

        .osuconst(CONST) : {}

        .osSCTXconst(CONST) : {}

        .osSCTXuconst(CONST) : {}

        .ossconst(CONST) : {}

        .ossuconst(CONST) : {}

        .osSCTXsconst(CONST) : {}

        .osSCTXsuconst(CONST) : {}

/* Safe Context Location of Flash data End */

 

 

        .bsw_nia_code (TEXT) : {}

        .bsw_nia_sconst (CONST) : {}

        .bsw_nia_suconst (CONST) : {}

    } > FLASH_BTL_HIGH

   

    GROUP : {

        .bsw_nia_version (CONST) : {}

        .bsw_nia_const (CONST) : {}

        .bsw_nia_uconst (CONST) : {}

        .btl_nia_code (TEXT) : {}

        .btl_nia_sconst (CONST) : {}

        .btl_nia_suconst (CONST) : {}

        .btl_nia_version (CONST) : {}

        .btl_nia_const (CONST) : {}

        .btl_nia_uconst (CONST) : {}   

   __DATA_ROM = .;

         _load_sdata0  = . ;

         _load_sdabase = _load_sdata0  + SIZEOF(.sdata0)  ;

         _load_sdata   = _load_sdabase + SIZEOF(.sdabase) ;

         _load_data    = _load_sdata   + SIZEOF(.sdata)   ;

         _load_btl_nia_data  = _load_data + SIZEOF(.data)                  ;

         _load_btl_nia_sdata = _load_btl_nia_data + SIZEOF(.btl_nia_data)  ;

         _load_bsw_nia_data  = _load_btl_nia_sdata + SIZEOF(.btl_nia_sdata) ;

         _load_bsw_nia_sdata = _load_bsw_nia_data + SIZEOF(.bsw_nia_data)  ;

         _load_cc_data  = _load_bsw_nia_sdata + SIZEOF(.bsw_nia_sdata) ;

         _load_cc_sdata = _load_cc_data + SIZEOF(.cc_data)  ;

         _load_vc_data  = _load_cc_sdata + SIZEOF(.cc_sdata) ;

         _load_vc_sdata = _load_vc_data + SIZEOF(.vc_data)  ;

         _load_gs_data  = _load_vc_sdata + SIZEOF(.gs_data);

         _load_gs_sdata = _load_gs_data + SIZEOF(.gs_sdata)  ;

         __DATA_ROM_START = _load_data + SIZEOF(.data); 

    } > FLASH_BTL_LOW

 

 

    GROUP : {

        .bsw_nia_version (CONST) : {}

        .bsw_nia_const (CONST) : {}

        .bsw_nia_uconst (CONST) : {}

    } > FLASH_NIA_CHILI_PARAM

   

    GROUP : {

        .bsw_nia_sconst_crc (CONST) : {}

        .bsw_nia_const_crc (CONST) : {}

        .bsw_nia_suconst_crc (CONST) : {}

        .bsw_nia_uconst_crc (CONST) : {}

    } > FLASH_SW_SIGNATURE

 

 

    GROUP : {

     .osisrvectbl : {}

     .osisrwrapper : {}

     .intvecttable : {}

     .mpt_exceptions : {}

    } >FLASH_NIA_CHILI_INT

 

 

    GROUP : {

     .bsw_nia_parameter (=NOLOAD): {}

    } >FLASH_NIA_LOGISTIC

 

 

    GROUP : {

      FLASHDRV (BSS) : {}

      __DATA_RAM = .;

      .sdata0(DATA) LOAD(_load_sdata0) : {}

      .sdabase ALIGN(8) LOAD(_load_sdabase)   : {}

      .sdata (DATA) LOAD(_load_sdata) : {}

      .data (DATA) LOAD(_load_data) : {}

      .btl_nia_data (DATA) LOAD(_load_btl_nia_data): {}

      .bsw_nia_data (DATA) LOAD(_load_bsw_nia_data): {}

      .btl_nia_sdata (DATA) LOAD(_load_btl_nia_sdata) : {}

      .bsw_nia_sdata (DATA) LOAD(_load_bsw_nia_sdata) : {}

      .cc_data (DATA) LOAD( _load_cc_data) : {}

      .cc_sdata (DATA) LOAD( _load_cc_sdata) : {}

      .vc_data (DATA) LOAD( _load_vc_data) : {}

      .vc_sdata (DATA) LOAD( _load_vc_sdata) : {}

      .gs_data (DATA) LOAD( _load_gs_data) : {}

      .gs_sdata (DATA) LOAD( _load_gs_sdata) : {}

      .btl_nia_sudata (DATA): {}

      .bsw_nia_sudata (DATA): {}

      .btl_nia_udata (DATA): {}

      .bsw_nia_udata (DATA): {}

      .cc_udata (BSS): {}

      .cc_sudata (BSS): {}

      .vc_udata (BSS): {}

      .vc_sudata (BSS): {}

      .sbss  (BSS) : {}

      .bss   (BSS) : {}

 

 

/* Safe Context OS data */

        _INIT_SIZE = 0;

        _ossDataStart = ALIGN(32);

        .osdata  (DATA) ALIGN(32) : {}

        .osudata (DATA) ALIGN(32) : {}

        _ossDataEnd = .-1;

/* Safe Context OS data End */

/* Safe Context OS short data */

        _ossSDADataStart = ALIGN(32);

        .ossdata (DATA) ALIGN(32): {}

        .ossudata ALIGN(32) : {}

        _ossSDADataEnd = .-1;

/* Safe Context OS short data END */

/* Safe Context OS Safe data */

        .osSCTXdata  (DATA) ALIGN(32) : {}

        .osSCTXudata (DATA) ALIGN(32) : {}

/* Safe Context OS Safe data END */

/* Safe Context OS Safe sdata */

        _ossSCTXiSDAData_LOADADDR_ =  __DATA_ROM_START + _INIT_SIZE;

        .osSCTXsdata(DATA) ALIGN(32) LOAD(_ossSCTXiSDAData_LOADADDR_): {}

        .osSCTXsudata (DATA) ALIGN(32) : {}

/* Safe Context OS Safe sdata END */

/* Safe Context OS Global Shared data */

      _ossSDADataStartGlobalShared = ALIGN(32);

      _ossiSDADataStartGlobalShared = ALIGN(32);

      _ossiSDAData_LOADADDR_GlobalShared =  __DATA_ROM_START + _INIT_SIZE;

      .ossiSDADataGlobalShared(DATA) ALIGN(32) LOAD(_ossiSDAData_LOADADDR_GlobalShared): {}

      _ossiSDAData_SIZE_GlobalShared=  (SIZEOF(.ossiSDADataGlobalShared) + 31) & ~31;

      _INIT_SIZE += _ossiSDAData_SIZE_GlobalShared;

      _ossiSDADataEndGlobalShared = .-1;

      _ossuSDADataStartGlobalShared = ALIGN(32);

      .ossuSDADataGlobalShared ALIGN(32) : {}

      _ossuSDADataEndGlobalShared = .-1;

      _ossSDADataEndGlobalShared = .-1;

/* Safe Context OS Global Shared data End */

 

 

/* Safe Context SDAdata */

        . = (. + 31) & ~31;

        _ossApplSDADataStartAll_Trusted = ALIGN(32);

        _ossAppliSDADataStartAll_Trusted = ALIGN(32);

        _ossAppliSDAData_LOADADDR_All_Trusted =  __DATA_ROM_START + _INIT_SIZE;

        .ossAppliSDADataAll_Trusted(DATA) ALIGN(32) LOAD(_ossAppliSDAData_LOADADDR_All_Trusted): {}

        _ossAppliSDAData_SIZE_All_Trusted=  (SIZEOF(.ossAppliSDADataAll_Trusted) + 31) & ~31;

        _INIT_SIZE += _ossAppliSDAData_SIZE_All_Trusted;

        _ossAppliSDADataEndAll_Trusted = .-1;

        . = (. + 31) & ~31;

        _ossAppluSDADataStartAll_Trusted = ALIGN(32);

        .ossAppluSDADataAll_Trusted ALIGN(32) : {}

        _ossAppluSDADataEndAll_Trusted = .-1;

        _ossApplSDADataEndAll_Trusted = .-1;

/* Safe Context SDADATA End */

 

 

/* Safe Context DATA */

        . = (. + 31) & ~31;

        _ossApplDataStartAll_Trusted = ALIGN(32);

        _ossAppliDataStartAll_Trusted = ALIGN(32);

        _ossAppliData_LOADADDR_All_Trusted =  __DATA_ROM_START + _INIT_SIZE;

        .ossAppliDataAll_Trusted(DATA) ALIGN(32) LOAD(_ossAppliData_LOADADDR_All_Trusted): {}

        _ossAppliData_SIZE_All_Trusted=  (SIZEOF(.ossAppliDataAll_Trusted) + 31) & ~31;

        _INIT_SIZE += _ossAppliData_SIZE_All_Trusted;

        _ossAppliDataEndAll_Trusted = .-1;

        . = (. + 31) & ~31;

        _ossAppluDataStartAll_Trusted = ALIGN(32);

        .ossAppluDataAll_Trusted ALIGN(32) : {}

        _ossAppluDataEndAll_Trusted = .-1;

        _ossApplDataEndAll_Trusted = .-1;

/* Safe Context DATA End */

 

 

        .ossAppluSDADataOsApplication_QM ALIGN(32) : {}

        .ossAppliSDADataOsApplication_QM ALIGN(32) : {}

        .ossAppluDataOsApplication_QM ALIGN(32) : {}

 

 

/* Safe Context RAM_STACK */

        . = (. + 31) & ~31;

        _ossTaskStackStartCDD_Cyclic_1msTask = ALIGN(32);

        .ossTaskStackCDD_Cyclic_1msTask ALIGN(32)(BSS) : {}

        . = (. + 31) & ~31;

        _ossTaskStackEndCDD_Cyclic_1msTask = . - 1;

        . = (. + 31) & ~31;

        _ossTaskStackStartFR_SynchTask = ALIGN(32);

        .ossTaskStackFR_SynchTask ALIGN(32)(BSS) : {}

        . = (. + 31) & ~31;

        _ossTaskStackEndFR_SynchTask = . - 1;

        . = (. + 31) & ~31;

        _ossTaskStackStartCDD_Cyclic_10msTask = ALIGN(32);

        .ossTaskStackCDD_Cyclic_10msTask ALIGN(32)(BSS) : {}

        . = (. + 31) & ~31;

        _ossTaskStackEndCDD_Cyclic_10msTask = . - 1;

        . = (. + 31) & ~31;

        _ossTaskStackStartBackgroundTask = ALIGN(32);

        .ossTaskStackBackgroundTask ALIGN(32)(BSS) : {}

        . = (. + 31) & ~31;

        _ossTaskStackEndBackgroundTask = . - 1;

/* Safe Context RAM_STACK End */

 

 

    } >RAM_ALL

 

 

    GROUP : {

            .frmdata (BSS) : {}

    } > RAM_FLEXRAY

 

 

   

    GROUP : {

        .osstack (BSS) : {}

    } > RAM_STACK

 

 

/* Safe Context OS Stacks (System Level) */

    GROUP : {

        .osstacksys (BSS) : {}

    } > RAM_STACK

 

    GROUP : {

        .osstackidl (BSS) : {}

    } > RAM_STACK

/* Safe Context OS RAM_STACK (System Level) End */

 

 

        /* Any space left over will be used as a heap */

 

 

    GROUP:

    {

        .bsw_nia_reset_safe(DATA) : {}

    } > RAM_RST_SAFE

   

    GROUP:

    {

        .btl_nia_reset_safe(DATA) : {}

    } > RST_SAFE_BTL_APP

}

 

 

/* Definitions of identifiers used by sbrk.c, init.c and the different

* crt0.s files. Their purpose is to control initialization and memory

* allocation.

*

* __HEAP_START : Used by sbrk.c. Start of memory used by malloc() etc.

* __HEAP_END   : Used by sbrk.c. End of heap memory

* __SP_INIT    : Used by crt0.s. Initial address of RAM_STACK pointer

* __SP_END     : Used by sbrk.c. Only used when RAM_STACK probing

* __DATA_ROM   : Used by init.c. Address of initialized data in ROM

* __DATA_RAM   : Used by init.c. Address of initialized data in RAM

* __DATA_END   : Used by init.c. End of allocated initialized data

* __BSS_START  : Used by init.c. Start of uninitialized data

* __BSS_END    : Used by init.c. End of data to be cleared

* ---------------------------------------------------------------------- */

 

 

RST_SAFE_START  = ADDR(RAM_RST_SAFE);

RST_SAFE_SIZE   = SIZEOF(RAM_RST_SAFE);

RC_SDATA_SRC    = _load_sdata;

RC_SDATA_DEST   = ADDR(.sdata);

RC_SDATA_SIZE   = (SIZEOF(.sdata)+3) / 4;

 

 

NIA_DATA_SRC    = _load_bsw_nia_data;

NIA_DATA_DEST   = ADDR(.bsw_nia_data);

NIA_DATA_SIZE   = (SIZEOF(.bsw_nia_data) +3) / 4;

NIA_SDATA_SRC    = _load_bsw_nia_sdata;

NIA_SDATA_DEST   = ADDR(.bsw_nia_sdata);

NIA_SDATA_SIZE   = (SIZEOF(.bsw_nia_sdata) +3) / 4;

 

 

NIA_BTL_DATA_SRC    = _load_btl_nia_data;

NIA_BTL_DATA_DEST   = ADDR(.btl_nia_data);

NIA_BTL_DATA_SIZE   = (SIZEOF(.btl_nia_data) +3) / 4;

NIA_BTL_SDATA_SRC    = _load_btl_nia_sdata;

NIA_BTL_SDATA_DEST   = ADDR(.btl_nia_sdata);

NIA_BTL_SDATA_SIZE   = (SIZEOF(.btl_nia_sdata) +3) / 4;

 

 

 

 

__HEAP_START    = ADDR(.bss)+SIZEOF(.bss);

__HEAP_END      = ADDR(RAM_ALL)+SIZEOF(RAM_ALL);

__SP_INIT       = ADDR(RAM_STACK);

__SP_END        = ADDR(RAM_STACK)+SIZEOF(RAM_STACK);

__DATA_END      = ADDR(.sdata)+SIZEOF(.sdata);

__BSS_START     = ADDR(.sbss);

__BSS_END       = ADDR(.bss)+SIZEOF(.bss);

 

 

/* Some targets use an extra underscore in front of identifiers

* ---------------------------------------------------------------------- */

___HEAP_START   = __HEAP_START;

___HEAP_END     = __HEAP_END;

___SP_INIT      = __SP_INIT;

___SP_END       = __SP_END;

___DATA_ROM     = __DATA_ROM;

___DATA_RAM     = __DATA_RAM;

___DATA_END     = __DATA_END;

___BSS_START    = __BSS_START;

___BSS_END      = __BSS_END;

/* ---------------------------------------------------------------------- */

Outcomes