Linker file

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Linker file

Jump to solution
3,039 Views
john71
Senior Contributor I

I have a project in IAR for MK10FN1M0xxx12. I suspect my linker file is not good. I took it from some project.

Can you look into it and tell me if it's good for MK10FN1M0xxx12?

If I compare it with the one provided with IAR - I see some differences. But I cant use the IAR linker cause the startup code uses

define exported symbol __VECTOR_TABLE = 0x00000000;
define exported symbol __VECTOR_RAM = 0x1fff0000;

define exported symbol __BOOT_STACK_ADDRESS = __region_RAM2_end__ - 8;

and I don't have these defines in the original IAR linker file.

actually it contradicts the memory table

pastedImage_1.png

/*###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__ = 0x00000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ROM_end__   = 0x00100000;
define symbol __ICFEDIT_region_RAM_start__ = 0x1FFF0410;
define symbol __ICFEDIT_region_RAM_end__   = 0x20000000;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x2000;
define symbol __ICFEDIT_size_heap__   = 0x400;
/**** End of ICF editor section. ###ICF###*/

define symbol __region_RAM2_start__ = 0x20000000;
define symbol __region_RAM2_end__ = 0x20010000;

define exported symbol __VECTOR_TABLE = 0x00000000;
define exported symbol __VECTOR_RAM = 0x1fff0000;

define exported symbol __BOOT_STACK_ADDRESS = __region_RAM2_end__ - 8;    //0x2000FFF8;

define symbol __code_start__ = 0x00000410;

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__] | mem:[from __region_RAM2_start__ to __region_RAM2_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize manually { readwrite };
initialize manually { section .data};
initialize manually { section .textrw };
do not initialize  { section .noinit };

define block CodeRelocate { section .textrw_init };
define block CodeRelocateRam { section .textrw };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:__code_start__ { readonly section .noinit };

place in ROM_region   { readonly, block CodeRelocate};

place in RAM_region   { readwrite, block CodeRelocateRam,
                        block CSTACK, block HEAP };

1 Solution
2,279 Views
mjbcswitzerland
Specialist V

Evgeny

Both IAR files are correct; one is leaving space for vectors (although more than needed) at the start of SRAM and the other not (for use when interrupt vectors remain in Flash).

Possibly the SRAM_L in the user's guide is wrong since it starts physically at 0x1fff0000 and not at 0x1c000000 as stated (although the statement may be indicating something else, but not relevant for this case).

The same linker script file can be used for all Kinetis (K) parts with the same memory size.

Regards

Mark

uTasker developer and supporter (+5'000 hours experience on +60 Kinetis derivatives in +80 product developments)
Kinetis: http://www.utasker.com/kinetis.html

View solution in original post

4 Replies
2,279 Views
Hui_Ma
NXP TechSupport
NXP TechSupport

Hi,

Please download the Kinetis 120MHz bare metal sample code from here.
You could find the IAR linker config file located at below folder:
..\KINETIS_120MHZ_SC\build\iar\config files
Wish it helps.


Have a great day,
Mike

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos
2,279 Views
john71
Senior Contributor I

Thank you Hui_Ma.

I took the linker file and the startup code exactly from this source. But i suspect it doesn't fit to MK10.

If I look at the original linker file from IAR (MK10xN1M_12.icf) there is some difference

/*###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__ = 0x00000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ROM_end__   = 0x000fffff;
define symbol __ICFEDIT_region_RAM_start__ = 0x1fff0000;
define symbol __ICFEDIT_region_RAM_end__   = 0x1fffffff;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x2000;
define symbol __ICFEDIT_size_heap__   = 0x4000;
/**** End of ICF editor section. ###ICF###*/

define symbol __region_RAM2_start__ = 0x20000000;
define symbol __region_RAM2_end__  = 0x2000ffff;

define exported symbol __VECTOR_TABLE = 0x00000000;
define exported symbol __VECTOR_RAM = 0x1fff0000;

define exported symbol __BOOT_STACK_ADDRESS = __region_RAM2_end__ - 8;    //0x2000FFF8;

define symbol __FlashConfig_start__    = 0x00000400;
define symbol __FlashConfig_end__      = 0x0000040f;

define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to (__FlashConfig_start__ - 1)] | mem:[from (__FlashConfig_end__+1)  to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__] | mem:[from __region_RAM2_start__ to __region_RAM2_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

define region FlashConfig_region = mem:[from __FlashConfig_start__ to __FlashConfig_end__];

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

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in FlashConfig_region {section FlashConfig};

place in ROM_region   { readonly };

place in RAM_region   { readwrite, block CSTACK, block HEAP };

All the sample projects are for K60-K70 may be for K10 it's different a bit?

0 Kudos
2,280 Views
mjbcswitzerland
Specialist V

Evgeny

Both IAR files are correct; one is leaving space for vectors (although more than needed) at the start of SRAM and the other not (for use when interrupt vectors remain in Flash).

Possibly the SRAM_L in the user's guide is wrong since it starts physically at 0x1fff0000 and not at 0x1c000000 as stated (although the statement may be indicating something else, but not relevant for this case).

The same linker script file can be used for all Kinetis (K) parts with the same memory size.

Regards

Mark

uTasker developer and supporter (+5'000 hours experience on +60 Kinetis derivatives in +80 product developments)
Kinetis: http://www.utasker.com/kinetis.html

2,279 Views
john71
Senior Contributor I

Thanks a lot!

0 Kudos