AnsweredAssumed Answered

force structure to address in IAR

Question asked by Ryan Lush on Mar 16, 2018
Latest reply on Mar 16, 2018 by Ryan Lush

I have a C structure I am trying to force to a specific address like so

 

#pragma location = ".app_info"
__root struct
{
    uint32_t major;
    uint32_t minor;
    uint32_t eeprom_init;
    uint32_t reserved;
}const version = {MAJOR_REVISION, MINOR_REVISION, (uint32_t)EEPROM_Init, 0x00000000};

 

And here is my linker script

 

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x00006000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00006000 ;
define symbol __ICFEDIT_region_ROM_end__   = 0x000FFFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x1FFF0000;
define symbol __ICFEDIT_region_RAM_end__   = 0x2002FFF0;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0;
define symbol __ICFEDIT_size_heap__   = 0;
/**** End of ICF editor section. ###ICF###*/

 

define symbol app_info_start           = 0x00006020;
define symbol app_info_end               = 0x0000602F;

 

define exported symbol __INTERNAL_FLASH_BASE    = 0x00000000;
define exported symbol __INTERNAL_FLASH_SIZE    = 0x00100000;
define exported symbol __INTERNAL_SRAM_BASE     = 0x1FFF0000;
define exported symbol __INTERNAL_SRAM_SIZE     = 0x00040000;
define exported symbol __SRAM_POOL              = 0x1FFF0000;

 

define exported symbol __INTERNAL_FLEXNVM_BASE = 0;
define exported symbol __INTERNAL_FLEXNVM_SIZE = 0;

 

define exported symbol __VECTOR_TABLE_ROM_START = 0x00000000;
define exported symbol __VECTOR_TABLE_RAM_START = __ICFEDIT_region_RAM_start__;

 

define exported symbol __DEFAULT_PROCESSOR_NUMBER = 1;
define exported symbol __DEFAULT_INTERRUPT_STACK_SIZE = 1024;

 

/* mem_init writes a storeblock_struct at the end of kernel data, max size 32 bytes, so use 0x100 offset */
define exported symbol __BOOT_STACK_ADDRESS = __ICFEDIT_region_RAM_end__ - 0x100;

 


define exported symbol __KERNEL_DATA_END = __ICFEDIT_region_RAM_end__;

 

define memory mem with size = 4G;

 

define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

 

define block KERNEL_DATA with alignment = 8 { section .kernel_data };

 

define exported symbol __FLASHX_SECT_SIZE = 0x1000;
define exported symbol __FLASHX_END_ADDR = __INTERNAL_FLASH_BASE + __INTERNAL_FLASH_SIZE;

 

define block CFMPROTROM with size = 20 { section .cfmconfig };
define block FLASHX_POOL with alignment = __FLASHX_SECT_SIZE { section .flashx };
define block TEXTSECTION with alignment = 4 { section .text };
keep { section .cfmconfig };
keep { section .flashx };

 

initialize by copy { readwrite };
do not initialize  { section .noinit };
do not initialize  { section .kernel_data };
do not initialize  { section .flashx };

 

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec, block CFMPROTROM };
place in ROM_region { first block TEXTSECTION, readonly,  last block FLASHX_POOL };

 

place at address mem:__ICFEDIT_region_RAM_start__ { readwrite section .vectors_ram };

 

/* each block/segment must be in one line (association to region) because I need kernel data start after other datas */
place in RAM_region   { readwrite, last block KERNEL_DATA };

 

place at address mem: app_info_start     { section .app_info };

 

but when I compile I get an error from the linker

 

Error[Lp011]: section placement failed
            unable to complete "place at" directives with a total estimated minimum size of 0x424 bytes in  
<[0x00006000-0x0000601f], [0x00006020-0x000fffff]> (total space 0xfa000).
            Needed:
            [0x00006000-0x0000601f]: 0x414 min, align 0x4 (size:    0x20)
            [0x00006020-0x000fffff]:  0x10 min, align 0x4 (size: 0xf9fe0)
Error[Lp015]: section placement failure: overcommitted content in [0x00006000-0x0000601f]

 

Can anyone tell me what I'm doing wrong? This has worked for me in the past.

Outcomes