Merging applications using Kinetis Design Studio

cancel
Showing results for 
Search instead for 
Did you mean: 

Merging applications using Kinetis Design Studio

No ratings

Merging applications using Kinetis Design Studio

Hello community!

 

Attached is a document that shows two methods of merging a user application and bootloader in a single file so it can be downloaded into the microcontroller at once and reduce manufacturing time and cost.

 

1. Merging applications using linker commands.

2. Merging applications using the P&E Advanced Flash Programming options.

 

I hope you can benefit from this post, if you have questions please let me know.

 

Best Regards!

Carlos Mendoza

Labels (1)
Attachments
Comments

Hi

The described methods are rather complicated (and some inefficient and time consuming to program).

It can be done much simpler without needing any special setups and tool-specifc tuning as follows:

1. Build the bootloader and generate a *.bin file as output (start address 0x00000000) [this is done anyway]

2. Build the application and generate a *.bin file as output (eg. linked to address 0xa000 (as in the reference) [this is done anyway]
3. Add a post-build step to the application project to call a merge utility (all IDEs allow this and in KDS just add a bat file to its post-build step) which will be executed each time the application is built.
Eg. Using the "uTaskerCombine" utility from:
http://www.utasker.com/forum/index.php?topic=1445.0

The boot loader and application are combined to produce a single binary and a single *.hex (as required by KDS) by calling something like
..\Tools\uTaskerCombine "..\BootLoader\KDS_Output\BootLoader.bin" application.bin 0xa000 ..\Factory\BootApp.bin ..\Factory\BootApp.hex

When the boards are to be programmed the KDS "Flash from file" utility can be used to simply program the BootApp.hex file (no need to do multiple flashing). Or any more powerful production programmers can be used to program the binary image using EzPort or whatever. Or one board can be used to clone its image to another via EzPort (see http://www.utasker.com/docs/uTasker/uTaskerEzPortCloner.pdf) avoiding any production tool investment and complicated/slow IDE based programming in the factory.

Moreover, this can be used all the time during development (along with the installed boot loader if faster) and the application projects debugger configuration set to load symbols but not program the flash. The debugger connection is then faster and it still performs source level debuging as normal.
The techniques are therefore not restricted to production but can be used (and should be used) all the time during development since it results in faster work and better testing of the boot loader operation and the final image.

Regards

Mark

Kinetis for professionals: http://http://www.utasker.com/kinetis.html

Hello Mark,

Thanks a lot for your feedback and for sharing your method, it seems to be effective and I think it is very similar to the steps described in the chapter 3.2 "Merging applications using linker commands" where the TARGET, INPUT and OUTPUT_FORMAT linker commands are used to merge the bootloader and application binary files instead of calling a merge utility using a post build step like in your method.

Thanks again for sharing another option to merge a bootloader and its application.

Best regards!

Carlos Mendoza

Hello Carlos

Yes, the two methods are quite similar but there is one important difference in that the linker method is compiler specific - if you had a user doing this with KDS and then had to change the development enironment (due to whatever reason) they will be stuck until they (or you) can work out how to do the same thing in the new environment.

A post-build step is something that is possible in every environment and so removes compiler/IDE dependency and this makes for greater flexibility and freedom.

Regards

Mark

Hi Guys,

Thanks heaps for documentation.

I have an issue with doing this on KDS V3. When I add this to the linker is the step where it causes the errors:

...

m_data (RW) : ORIGIN = 0x1FFFE000, LENGTH = 0x00008000
}

/*ADDING THIS CAUSES THE ERRORS */

TARGET(binary) /* specify the file format of binary file */
INPUT (T7_000.bin) /* provide the file name */
OUTPUT_FORMAT(default) /* restore the out file format */

/* Define output sections */
SECTIONS

...

Where T7_000.bin is my application,  I get the following errors

pastedImage_2.png

My application is small, but some how its overflowed by 7963136 bytes?

pastedImage_3.png

The binary file is with my source, and linker knows to search source (if i remove it it tells me it cant find it)... The file size is small... i have no idea what its doing, and I cant find the documentation on the linker

I can share the source files, unable to attach in here, email me at carl@suretek.com.au

Ive just followed the document again from scratch with every step and have the same issue, seem there is an issue with it seeing it as a raw binary file.

Can anyone help? something must have changed because I cannot get the linker to include the binary correctly.. I have found the linker documents but it appears you have to be an expert in the linker scripting to work out how anything works and there is no other example I can see of how to get the linker to put my binary file in...

Hello Carl,

That is a strange issue, could you share the linker files for both the bootloader and the application? Also, could you enable the Print Size option for the T7_000 application and post the information?

pastedImage_1.png

Thanks in advance!

Best regards,

Carlos Mendoza

Hi Carlos, thank you for taking the time to reply.

I enabled print size (it was already on)

09:39:59 **** Build of configuration Debug for project Appplication2 ****
*** removed this section as its not relevant ***

Building target: Appplication2.elf
Invoking: Cross ARM C++ Linker
arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -g3 -T "../MKL27Z128xxx4_flash.ld" -Xlinker --gc-sections -Wl,-Map,"Appplication2.map" --specs=nano.specs -specs=nosys.specs -Xlinker -z -Xlinker muldefs -o "Appplication2.elf" ./startup/startup_MKL27Z4.o ./startup/system_MKL27Z4.o ./source/main.o ./board/board.o ./board/clock_config.o ./board/pin_mux.o
Finished building target: Appplication2.elf

Invoking: Cross ARM GNU Create Flash Image
Invoking: Cross ARM GNU Print Size
arm-none-eabi-objcopy -O binary "Appplication2.elf" "Appplication2.bin"
arm-none-eabi-size --format=berkeley "Appplication2.elf"
text data bss dec hex filename
912 108 2460 3480 d98 Appplication2.elf
Finished building: Appplication2.bin
Finished building: Appplication2.siz

09:39:59 Build Finished (took 413ms)

I literally copied every step in both and created now applicaiton1 and application2 exactly as per the document and got the same results. Here is Application1 linker and application 2 linker

------------------------------------------------------------

Application1 linker file

/*
** ###################################################################
** Processors: MKL27Z128VFM4
** MKL27Z128VFT4
** MKL27Z128VLH4
** MKL27Z128VMP4
**
** Compiler: GNU C Compiler
** Reference manual: KL27P64M48SF6RM, Rev.3, Aug 2014
** Version: rev. 1.6, 2015-07-29
** Build: b160613
**
** Abstract:
** Linker file for the GNU C Compiler
**
** Copyright (c) 2016 Freescale Semiconductor, Inc.
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without modification,
** are permitted provided that the following conditions are met:
**
** o Redistributions of source code must retain the above copyright notice, this list
** of conditions and the following disclaimer.
**
** o Redistributions in binary form must reproduce the above copyright notice, this
** list of conditions and the following disclaimer in the documentation and/or
** other materials provided with the distribution.
**
** o Neither the name of Freescale Semiconductor, Inc. nor the names of its
** contributors may be used to endorse or promote products derived from this
** software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
** http: www.freescale.com
** mail: support@freescale.com
**
** ###################################################################
*/

/* Entry Point */
ENTRY(Reset_Handler)

HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400;
STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;
M_VECTOR_RAM_SIZE = DEFINED(__ram_vector_table__) ? 0x0200 : 0x0;

/* Specify the memory areas */
MEMORY
{
m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200
m_flash_config (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x00009BF0
app2_text (RX) : ORIGIN = 0x0000A000, LENGTH = 0x00016000
m_data (RW) : ORIGIN = 0x1FFFE000, LENGTH = 0x00008000
}

TARGET(binary) /* specify the file format of binary file */
INPUT (Appplication2.bin) /* provide the file name */
OUTPUT_FORMAT(default) /* restore the out file format */

/* Define output sections */
SECTIONS
{
/* The startup code goes first into internal flash */
.interrupts :
{
__VECTOR_TABLE = .;
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} > m_interrupts

.flash_config :
{
. = ALIGN(4);
KEEP(*(.FlashConfig)) /* Flash Configuration Field (FCF) */
. = ALIGN(4);
} > m_flash_config

/* 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);
} > 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))
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 *crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
__CTOR_END__ = .;
} > m_text

.dtors :
{
__DTOR_LIST__ = .;
KEEP (*crtbegin.o(.dtors))
KEEP (*crtbegin?.o(.dtors))
KEEP (*(EXCLUDE_FILE(*crtend?.o *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 = .);
} > m_text

__etext = .; /* define a global symbol at end of code */
__DATA_ROM = .; /* Symbol is used by startup for data initialization */

/* 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

.interrupts_ram :
{
. = ALIGN(4);
__VECTOR_RAM__ = .;
__interrupts_ram_start__ = .; /* Create a global symbol at data start */
*(.m_interrupts_ram) /* This is a user defined section */
. += M_VECTOR_RAM_SIZE;
. = ALIGN(4);
__interrupts_ram_end__ = .; /* Define a global symbol at data end */
} > m_data

__VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts);
__RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0;

.app2 :
{
Appplication2.bin (.data)
. = ALIGN (0x4);
} > app2_text

.data : AT(__DATA_ROM)
{
. = ALIGN(4);
__DATA_RAM = .;
__data_start__ = .; /* create a global symbol at data start */
*(.data) /* .data sections */
*(.data*) /* .data* sections */
KEEP(*(.jcr*))
. = ALIGN(4);
__data_end__ = .; /* define a global symbol at data end */
} > m_data

__DATA_END = __DATA_ROM + (__data_end__ - __data_start__);
text_end = ORIGIN(m_text) + LENGTH(m_text);
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")

USB_RAM_GAP = DEFINED(__usb_ram_size__) ? __usb_ram_size__ : 0x00;
/* Uninitialized data section */
.bss :
{
/* This is used by the startup in order to initialize the .bss section */
. = ALIGN(4);
__START_BSS = .;
__bss_start__ = .;
*(.bss)
*(.bss*)
. = ALIGN(512);
USB_RAM_START = .;
. += USB_RAM_GAP;
*(COMMON)
. = ALIGN(4);
__bss_end__ = .;
__END_BSS = .;
} > m_data

.heap :
{
. = ALIGN(8);
__end__ = .;
PROVIDE(end = .);
__HeapBase = .;
. += HEAP_SIZE;
__HeapLimit = .;
__heap_limit = .; /* Add for _sbrk */
} > m_data

.stack :
{
. = ALIGN(8);
. += STACK_SIZE;
} > m_data

m_usb_bdt USB_RAM_START (NOLOAD) :
{
*(m_usb_bdt)
USB_RAM_BDT_END = .;
}

m_usb_global USB_RAM_BDT_END (NOLOAD) :
{
*(m_usb_global)
}

/* Initializes stack on the end of block */
__StackTop = ORIGIN(m_data) + LENGTH(m_data);
__StackLimit = __StackTop - STACK_SIZE;
PROVIDE(__stack = __StackTop);

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

ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap")
}

------------------------------------------------------------

Application2 Linker file

/*
** ###################################################################
** Processors: MKL27Z128VFM4
** MKL27Z128VFT4
** MKL27Z128VLH4
** MKL27Z128VMP4
**
** Compiler: GNU C Compiler
** Reference manual: KL27P64M48SF6RM, Rev.3, Aug 2014
** Version: rev. 1.6, 2015-07-29
** Build: b160613
**
** Abstract:
** Linker file for the GNU C Compiler
**
** Copyright (c) 2016 Freescale Semiconductor, Inc.
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without modification,
** are permitted provided that the following conditions are met:
**
** o Redistributions of source code must retain the above copyright notice, this list
** of conditions and the following disclaimer.
**
** o Redistributions in binary form must reproduce the above copyright notice, this
** list of conditions and the following disclaimer in the documentation and/or
** other materials provided with the distribution.
**
** o Neither the name of Freescale Semiconductor, Inc. nor the names of its
** contributors may be used to endorse or promote products derived from this
** software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
** http: www.freescale.com
** mail: support@freescale.com
**
** ###################################################################
*/

/* Entry Point */
ENTRY(Reset_Handler)

HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400;
STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;
M_VECTOR_RAM_SIZE = DEFINED(__ram_vector_table__) ? 0x0200 : 0x0;

/* Specify the memory areas */
MEMORY
{
m_interrupts (RX) : ORIGIN = 0x0000A000, LENGTH = 0x00000200
m_flash_config (RX) : ORIGIN = 0x0000A400, LENGTH = 0x00000010
m_text (RX) : ORIGIN = 0x0000A410, LENGTH = 0x00015BF0
m_data (RW) : ORIGIN = 0x1FFFE000, LENGTH = 0x00008000
}

/* Define output sections */
SECTIONS
{
/* The startup code goes first into internal flash */
.interrupts :
{
__VECTOR_TABLE = .;
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} > m_interrupts

.flash_config :
{
. = ALIGN(4);
KEEP(*(.FlashConfig)) /* Flash Configuration Field (FCF) */
. = ALIGN(4);
} > m_flash_config

/* 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);
} > 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))
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 *crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
__CTOR_END__ = .;
} > m_text

.dtors :
{
__DTOR_LIST__ = .;
KEEP (*crtbegin.o(.dtors))
KEEP (*crtbegin?.o(.dtors))
KEEP (*(EXCLUDE_FILE(*crtend?.o *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 = .);
} > m_text

__etext = .; /* define a global symbol at end of code */
__DATA_ROM = .; /* Symbol is used by startup for data initialization */

/* 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

.interrupts_ram :
{
. = ALIGN(4);
__VECTOR_RAM__ = .;
__interrupts_ram_start__ = .; /* Create a global symbol at data start */
*(.m_interrupts_ram) /* This is a user defined section */
. += M_VECTOR_RAM_SIZE;
. = ALIGN(4);
__interrupts_ram_end__ = .; /* Define a global symbol at data end */
} > m_data

__VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts);
__RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0;

.data : AT(__DATA_ROM)
{
. = ALIGN(4);
__DATA_RAM = .;
__data_start__ = .; /* create a global symbol at data start */
*(.data) /* .data sections */
*(.data*) /* .data* sections */
KEEP(*(.jcr*))
. = ALIGN(4);
__data_end__ = .; /* define a global symbol at data end */
} > m_data

__DATA_END = __DATA_ROM + (__data_end__ - __data_start__);
text_end = ORIGIN(m_text) + LENGTH(m_text);
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")

USB_RAM_GAP = DEFINED(__usb_ram_size__) ? __usb_ram_size__ : 0x00;
/* Uninitialized data section */
.bss :
{
/* This is used by the startup in order to initialize the .bss section */
. = ALIGN(4);
__START_BSS = .;
__bss_start__ = .;
*(.bss)
*(.bss*)
. = ALIGN(512);
USB_RAM_START = .;
. += USB_RAM_GAP;
*(COMMON)
. = ALIGN(4);
__bss_end__ = .;
__END_BSS = .;
} > m_data

.heap :
{
. = ALIGN(8);
__end__ = .;
PROVIDE(end = .);
__HeapBase = .;
. += HEAP_SIZE;
__HeapLimit = .;
__heap_limit = .; /* Add for _sbrk */
} > m_data

.stack :
{
. = ALIGN(8);
. += STACK_SIZE;
} > m_data

m_usb_bdt USB_RAM_START (NOLOAD) :
{
*(m_usb_bdt)
USB_RAM_BDT_END = .;
}

m_usb_global USB_RAM_BDT_END (NOLOAD) :
{
*(m_usb_global)
}

/* Initializes stack on the end of block */
__StackTop = ORIGIN(m_data) + LENGTH(m_data);
__StackLimit = __StackTop - STACK_SIZE;
PROVIDE(__stack = __StackTop);

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

ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap")
}

So does anyone know why this example stopped working? I can email the entire projects to someone, ive copied it line by line...

Hi Mark,

I was looking into your approach. I did not understand how to implement third point mentioned,

3. Add a post-build step to the application project to call a merge utility (all IDEs allow this and in KDS just add a bat file to its post-build step) which will be executed each time the application is built.

Since default build settings are not used, post build option is not coming in settings menu.

Can you provide detailed procedure for this, how to add post-build step for above case.

Regards,

Aniket

hi Carlos,

I was trying the changes according to the first method in the pdf. Since not using the default the build tool of kinetis & having our own makefiles for build process, Tool Settings option is not coming for adding Library Search Path. How to add it manually, please guide.

Regards,

Aniket

Whether the same method will work for kinetis sdk 2.2 ?
I am using FRDM-KW41Z and MCU Xpresso IDE v10.1. 

Hi Pradeep,

For MCUXpresso I would recommend you use the GUI Flash tool to load both applications separately, make sure to select the Erase by sector option.


Hope it helps!

Best Regards,
Carlos Mendoza
Technical Support Engineer

Hello,

Does Anyone know the procedure with IAR system ? 

Regards

Hi

The procedure using "uTaskerCombine" (see one of the first posts in the thread) works also with IAR.

Regards

Mark

Version history
Revision #:
1 of 1
Last update:
‎09-28-2015 02:56 PM
Updated by: