How to make a application in KDS which can be started from 0x00008000 location for FRDM-KL25Z

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

How to make a application in KDS which can be started from 0x00008000 location for FRDM-KL25Z

1,094 Views
rutvijtrivedi
Contributor III

Hi All,

I have a FRDM-KL25Z EVM andi am using kinetis design studio and i have made a demo LED application.

I have created a binary file for the same.

Now i need to start this application from 0x00008000 vector address.

Currently I am using sample application which is given with KBOOT but they are supported using IAR only and i want to use KDS instead (If possible ,then without processor expert).

These IAR supported applications are given to work with 0x00008000 address . so i want to do the same using KDS.

So do any one have idea what should i do ?

Please guide me here in this case this would be great appreciable.

Please let me know if you need more information .

 

Thanks & Regards,

Rutvij.

Labels (1)
6 Replies

642 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello Rutvij,

please show the linker file (*.ld)  about how to configure the MEMORY part .

And what about your project , does it PE project ? If yes, in the linker file , please configure :

__heap_size = 0x400;

Hope it helps

Alice

642 Views
rutvijtrivedi
Contributor III

Hi Alice,

Thank you for your quick and informative response.

Its relay appreciable

Yes i am currently using PE and i have a linker file named " ProcessorExpert.ld".

I am new to PE and so i am not familer  with the .ld file . So can guide me where should i see ?

Here is my linker file.

@

/* Entry Point */

ENTRY(__thumb_startup)

/* Highest address of the user mode stack */

_estack = 0x20003000;    /* end of m_data */

__SP_INIT = _estack;

__stack = _estack;

/* Generate a link error if heap and stack don't fit into RAM */

__heap_size = 0x00;                    /* required amount of heap  */

__stack_size = 0x0400;                 /* required amount of stack */

MEMORY {

  m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x000000C0

  m_text      (RX) : ORIGIN = 0x00000410, LENGTH = 0x0001FBF0

  m_data      (RW) : ORIGIN = 0x1FFFF000, LENGTH = 0x00004000

  m_cfmprotrom  (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010

}

/* Define output sections */

SECTIONS

{

  /* The startup code goes first into INTERNAL_FLASH */

  .interrupts :

  {

    __vector_table = .;

    . = ALIGN(4);

    KEEP(*(.vectortable)) /* Startup code */

    . = ALIGN(4);

  } > m_interrupts

  .cfmprotect :

  {

    . = ALIGN(4);

  KEEP(*(.cfmconfig)) /* Flash Configuration Field (FCF) */

  . = ALIGN(4);

  } > m_cfmprotrom

 

  /* The program code and other data goes into INTERNAL_FLASH */

  .text :

  {

    . = ALIGN(4);

    *(.text)           /* .text sections (code) */

    *(.text*)          /* .text* sections (code) */

    *(.rodata)         /* .rodata sections (constants, strings, etc.) */

    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */

    *(.glue_7)         /* glue arm to thumb code */

    *(.glue_7t)        /* glue thumb to arm code */

    *(.eh_frame)

    KEEP (*(.init))

    KEEP (*(.fini))

    . = ALIGN(4);

    _etext = .;        /* define a global symbols at end of code */

  } > m_text

   .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > m_text

    .ARM : {

    __exidx_start = .;

      *(.ARM.exidx*)

      __exidx_end = .;

  } > m_text

.ctors :

  {

    __CTOR_LIST__ = .;

    /* gcc uses crtbegin.o to find the start of

       the constructors, so we make sure it is

       first.  Because this is a wildcard, it

       doesn't matter if the user does not

       actually link against crtbegin.o; the

       linker won't look for a file to match a

       wildcard.  The wildcard also means that it

       doesn't matter which directory crtbegin.o

       is in.  */

    KEEP (*crtbegin.o(.ctors))

    /* We don't want to include the .ctor section from

       from the crtend.o file until after the sorted ctors.

       The .ctor section from the crtend file contains the

       end of ctors marker and it must be last */

    KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors))

    KEEP (*(SORT(.ctors.*)))

    KEEP (*(.ctors))

    __CTOR_END__ = .;

  } > m_text

  .dtors :

  {

    __DTOR_LIST__ = .;

    KEEP (*crtbegin.o(.dtors))

    KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))

    KEEP (*(SORT(.dtors.*)))

    KEEP (*(.dtors))

    __DTOR_END__ = .;

  } > m_text

  .preinit_array     :

  {

    PROVIDE_HIDDEN (__preinit_array_start = .);

    KEEP (*(.preinit_array*))

    PROVIDE_HIDDEN (__preinit_array_end = .);

  } > m_text

  .init_array :

  {

    PROVIDE_HIDDEN (__init_array_start = .);

    KEEP (*(SORT(.init_array.*)))

    KEEP (*(.init_array*))

    PROVIDE_HIDDEN (__init_array_end = .);

  } > m_text

  .fini_array :

  {

    PROVIDE_HIDDEN (__fini_array_start = .);

    KEEP (*(SORT(.fini_array.*)))

    KEEP (*(.fini_array*))

    PROVIDE_HIDDEN (__fini_array_end = .);

  ___ROM_AT = .;

  } > m_text

  /* reserve MTB memory at the beginning of m_data */

  .mtb : /* MTB buffer address as defined by the hardware */

  {

    . = ALIGN(8);

    _mtb_start = .;

    KEEP(*(.mtb_buf)) /* need to KEEP Micro Trace Buffer as not referenced by application */

    . = ALIGN(8);

    _mtb_end = .;

  } > m_data

  /* Initialized data sections goes into RAM, load LMA copy after code */

  .data : AT(___ROM_AT)

  {

    . = ALIGN(4);

    _sdata = .;        /* create a global symbol at data start */

    *(.data)           /* .data sections */

    *(.data*)          /* .data* sections */

    . = ALIGN(4);

    _edata = .;        /* define a global symbol at data end */

  } > m_data

  ___data_size = _edata - _sdata;

  /* Uninitialized data section */

  . = ALIGN(4);

  .bss :

  {

    /* This is used by the startup in order to initialize the .bss section */

    __START_BSS = .;

   PROVIDE ( __bss_start__ = __START_BSS );

    *(.bss)

    *(.bss*)

    *(COMMON)

    . = ALIGN(4);

    __END_BSS = .;

   PROVIDE ( __bss_end__ = __END_BSS );

  } > m_data

  _romp_at = ___ROM_AT + SIZEOF(.data);

  .romp : AT(_romp_at)

  {

    __S_romp = _romp_at;

    LONG(___ROM_AT);

    LONG(_sdata);

    LONG(___data_size);

    LONG(0);

    LONG(0);

    LONG(0);

  } > m_data

 

  /* User_heap_stack section, used to check that there is enough RAM left */

  ._user_heap_stack :

  {

    . = ALIGN(4);

    PROVIDE ( end = . );

    PROVIDE ( _end = . );

    __heap_addr = .;

    __HeapBase = .;

    . = . + __heap_size;

    __HeapLimit = .;

    . = . + __stack_size;

    . = ALIGN(4);

  } > m_data

  .ARM.attributes 0 : { *(.ARM.attributes) }

}

@

Thanks & Regards,

Rutvij.

0 Kudos

642 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello Rutvij,

Please change here to have a try :

(1)

pastedImage_0.png

heap_size = 0x400;

(2)

/*default */

MEMORY {

  m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x000000C0

  m_text      (RX) : ORIGIN = 0x00000410, LENGTH = 0x0001FBF0

  m_data      (RW) : ORIGIN = 0x1FFFF000, LENGTH = 0x00004000

  m_cfmprotrom  (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010

}

/*Modefied */

MEMORY {

  m_interrupts (RX) : ORIGIN = 0x00008000, LENGTH = 0x000000C0

  m_text      (RX) : ORIGIN = 0x00008410, LENGTH = 0x0001FBF0

  m_data      (RW) : ORIGIN = 0x1FFFF000, LENGTH = 0x00004000

  m_cfmprotrom  (RX) : ORIGIN = 0x00008400, LENGTH = 0x00000010

}

Hope it helps


Have a great day,

Alice

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

0 Kudos

642 Views
rutvijtrivedi
Contributor III

Hi Alice,

I went through the steps suggested by you and generated a binary in .bin format.

Then i downloaded the freedom_bootloader.srec into FRDM-KL25Z and updated the genrated .bin using the window utility "KinetisUpdater.exe" to 0x00008000 location but i got nothing.

But if i do the same using the IAR gerated binary it works and i got the LEDs blinking as per my code using "KinetisUpdater.exe" utility 0x00008000.

So do you think i am missing anything or is there anything else i should see ?

Thanks & Regards,

Rutvij.

0 Kudos

642 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello Rutvij,

Please see the attachment , it is i create on on KDS3.0 - PE project about FRDM-KL25 board, the function is set the green LED.

the "kl25_led_test.bin" is the file which can use the KBOOT to update .  Please check the project and file on your side.

And i think you may ignore  disable " Generate linker file" , if you have not done this , when you build , the linker file will restore to default.

pastedImage_0.png

Hope it helps


Have a great day,
Alice

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

0 Kudos

642 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello Rutvij,

Ok, i will create one simple demo to test , then i will tell you .ASAP

BR

Alice

0 Kudos