This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Application only starts in debug after SDK12 migration

After updating from sdk11 to sdk12, the application only starts in debug. If started with reset, it hangs. I am running on a pca10028 board an with EmBlitz 1.0. NRF51 is QFACA1 with the following linker setting:

/* Linker script to place sections and symbol values. Should be used together
 * with other linker script that defines memory regions FLASH and RAM.
 * It references following symbols, which must be defined in code:
 *   Reset_Handler : Entry of reset handler
 *
 * It defines following symbols, which code can use without definition:
 *   __exidx_start
 *   __exidx_end
 *   __etext
 *   __data_start__
 *   __preinit_array_start
 *   __preinit_array_end
 *   __init_array_start
 *   __init_array_end
 *   __fini_array_start
 *   __fini_array_end
 *   __data_end__
 *   __bss_start__
 *   __bss_end__
 *   __end__
 *   end
 *   __HeapLimit
 *   __StackLimit
 *   __StackTop
 *   __stack
 */


OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
ENTRY(Reset_Handler)

MEMORY
{
  SOFTD (rx) : ORIGIN = 0x00000000, LENGTH = 0x1B000
  FLASH (rx) : ORIGIN = 0x0001B000, LENGTH = 0x25000
  RAM (rwx) :  ORIGIN = 0x20002870, LENGTH = 0x5790
}

SECTIONS
{
    /* You can place the softdevice in this sector so that
     * it is included in the final image.
     */
    .softdevice :
    {
        KEEP(*(.softdevice*))
    }> SOFTD

    /* The normal application area of the device with SoftDevice
    */
	.text :
	{
		KEEP(*(.Vectors))
		*(.text*)

		KEEP(*(.init))
		KEEP(*(.fini))

		/* .ctors */
		*crtbegin.o(.ctors)
		*crtbegin?.o(.ctors)
		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
		*(SORT(.ctors.*))
		*(.ctors)

		/* .dtors */
 		*crtbegin.o(.dtors)
 		*crtbegin?.o(.dtors)
 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
 		*(SORT(.dtors.*))
 		*(.dtors)

		*(.rodata*)

		*(.eh_frame*)
	} > FLASH


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

	__exidx_start = .;
	.ARM.exidx :
	{
		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
	} > FLASH
	__exidx_end = .;

	__etext = .;

	.data : AT (__etext)
	{
		__data_start__ = .;
		*(vtable)
		*(.data*)

		. = ALIGN(4);
		/* preinit data */
		PROVIDE_HIDDEN (__preinit_array_start = .);
		*(.preinit_array)
		PROVIDE_HIDDEN (__preinit_array_end = .);

		. = ALIGN(4);
		/* init data */
		PROVIDE_HIDDEN (__init_array_start = .);
		*(SORT(.init_array.*))
		*(.init_array)
		PROVIDE_HIDDEN (__init_array_end = .);


		. = ALIGN(4);
		/* finit data */
		PROVIDE_HIDDEN (__fini_array_start = .);
		*(SORT(.fini_array.*))
		*(.fini_array)
		PROVIDE_HIDDEN (__fini_array_end = .);

		*(.jcr)
		. = ALIGN(4);
		/* All data end */
		__data_end__ = .;

	} > RAM

    .fs_data :
    {
        PROVIDE(__start_fs_data = .);
        KEEP(*(.fs_data))
        PROVIDE(__stop_fs_data = .);
    } > RAM

    .fs_data_out ALIGN(4):
    {
        PROVIDE( __start_fs_data = .);
        KEEP(*(fs_data))
        PROVIDE( __stop_fs_data = .);
    } = 0

	.bss :
	{
		. = ALIGN(4);
		__bss_start__ = .;
		*(.bss*)
		*(COMMON)
		. = ALIGN(4);
		__bss_end__ = .;
	} > RAM

	.heap (COPY):
	{
		__end__ = .;
		end = __end__;
		*(.heap*)
		__HeapLimit = .;
	} > RAM

	/* .stack_dummy section doesn't contains any symbols. It is only
	 * used for linker to calculate size of stack sections, and assign
	 * values to stack symbols later */
	.stack_dummy (COPY):
	{
		*(.stack*)
	} > RAM

	/* Set stack top to end of RAM, and stack limit move down by
	 * size of stack_dummy section */
	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
	PROVIDE(__stack = __StackTop);

	/* Check if data + heap + stack exceeds RAM limit */
	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
}

Did I miss something in migration guide? I am using ble-bcast-mesh branch master with mods for nrf52 sdk11 of mrquincle. Forgot to say: I use the bootloader feature with the switch to SDK12 which must lead to a change in the sections. This could be the reason. I am evaluating on this.

Parents
  • It had nothing to do with sdk12 but with the bootloader feature. For this feature the gcc linker script must be modified like on the bootloader_secure example:

    /* Linker script to configure memory regions. */
    
    SEARCH_DIR(.)
    GROUP(-lgcc -lc -lnosys)
    
    MEMORY
    {
      /** Flash start address for the bootloader. This setting will also be stored in UICR to allow the
       *  MBR to init the bootloader when starting the system. This value must correspond to
       *  BOOTLOADER_REGION_START found in dfu_types.h. The system is prevented from starting up if
       *  those values do not match. The check is performed in main.c, see
       *  APP_ERROR_CHECK_BOOL(*((uint32_t *)NRF_UICR_BOOT_START_ADDRESS) == BOOTLOADER_REGION_START);
       */
      FLASH (rx) : ORIGIN = 0x3AC00, LENGTH = 0x5000
    
      /** RAM Region for bootloader. This setting is suitable when used with s110, s120, s130, s310. */
      RAM (rwx) :  ORIGIN = 0x20002C00, LENGTH = 0x5380
    
      /** Location of non initialized RAM. Non initialized RAM is used for exchanging bond information
       *  from application to bootloader when using buttonluss DFU OTA.
       */
      NOINIT (rwx) :  ORIGIN = 0x20007F80, LENGTH = 0x80
    
      /** Location of bootloader setting in at the last flash page. */
      BOOTLOADER_SETTINGS (rw) : ORIGIN = 0x0003FC00, LENGTH = 0x0400
    
      /** Location in UICR where bootloader start address is stored. */
      UICR_BOOTLOADER (r) : ORIGIN = 0x10001014, LENGTH = 0x04
    }
    
    SECTIONS
    {
      /* Ensures the bootloader settings are placed at the last flash page. */
      .bootloaderSettings(NOLOAD) :
      {
    
      } > BOOTLOADER_SETTINGS
    
      /* Ensures the Bootloader start address in flash is written to UICR when flashing the image. */
      .uicrBootStartAddress :
      {
        KEEP(*(.uicrBootStartAddress))
      } > UICR_BOOTLOADER
    
      /* No init RAM section in bootloader. Used for bond information exchange. */
      .noinit(NOLOAD) :
      {
    
      } > NOINIT
      /* other placements follow here... */
    }
    
    SECTIONS
    {
      . = ALIGN(4);
      .fs_data :
      {
        PROVIDE(__start_fs_data = .);
        KEEP(*(.fs_data))
        PROVIDE(__stop_fs_data = .);
      } > RAM
    
      . = ALIGN(4);
      .svc_data :
      {
        PROVIDE(__start_svc_data = .);
        KEEP(*(.svc_data))
        PROVIDE(__stop_svc_data = .);
      } > RAM
    
      . = ALIGN(4);
      .dfu_trans :
      {
        PROVIDE(__start_dfu_trans = .);
        KEEP(*(.dfu_trans))
        PROVIDE(__stop_dfu_trans = .);
      } > RAM
    
    } INSERT AFTER .data
    
    INCLUDE "nrf51_common.ld"
    
Reply
  • It had nothing to do with sdk12 but with the bootloader feature. For this feature the gcc linker script must be modified like on the bootloader_secure example:

    /* Linker script to configure memory regions. */
    
    SEARCH_DIR(.)
    GROUP(-lgcc -lc -lnosys)
    
    MEMORY
    {
      /** Flash start address for the bootloader. This setting will also be stored in UICR to allow the
       *  MBR to init the bootloader when starting the system. This value must correspond to
       *  BOOTLOADER_REGION_START found in dfu_types.h. The system is prevented from starting up if
       *  those values do not match. The check is performed in main.c, see
       *  APP_ERROR_CHECK_BOOL(*((uint32_t *)NRF_UICR_BOOT_START_ADDRESS) == BOOTLOADER_REGION_START);
       */
      FLASH (rx) : ORIGIN = 0x3AC00, LENGTH = 0x5000
    
      /** RAM Region for bootloader. This setting is suitable when used with s110, s120, s130, s310. */
      RAM (rwx) :  ORIGIN = 0x20002C00, LENGTH = 0x5380
    
      /** Location of non initialized RAM. Non initialized RAM is used for exchanging bond information
       *  from application to bootloader when using buttonluss DFU OTA.
       */
      NOINIT (rwx) :  ORIGIN = 0x20007F80, LENGTH = 0x80
    
      /** Location of bootloader setting in at the last flash page. */
      BOOTLOADER_SETTINGS (rw) : ORIGIN = 0x0003FC00, LENGTH = 0x0400
    
      /** Location in UICR where bootloader start address is stored. */
      UICR_BOOTLOADER (r) : ORIGIN = 0x10001014, LENGTH = 0x04
    }
    
    SECTIONS
    {
      /* Ensures the bootloader settings are placed at the last flash page. */
      .bootloaderSettings(NOLOAD) :
      {
    
      } > BOOTLOADER_SETTINGS
    
      /* Ensures the Bootloader start address in flash is written to UICR when flashing the image. */
      .uicrBootStartAddress :
      {
        KEEP(*(.uicrBootStartAddress))
      } > UICR_BOOTLOADER
    
      /* No init RAM section in bootloader. Used for bond information exchange. */
      .noinit(NOLOAD) :
      {
    
      } > NOINIT
      /* other placements follow here... */
    }
    
    SECTIONS
    {
      . = ALIGN(4);
      .fs_data :
      {
        PROVIDE(__start_fs_data = .);
        KEEP(*(.fs_data))
        PROVIDE(__stop_fs_data = .);
      } > RAM
    
      . = ALIGN(4);
      .svc_data :
      {
        PROVIDE(__start_svc_data = .);
        KEEP(*(.svc_data))
        PROVIDE(__stop_svc_data = .);
      } > RAM
    
      . = ALIGN(4);
      .dfu_trans :
      {
        PROVIDE(__start_dfu_trans = .);
        KEEP(*(.dfu_trans))
        PROVIDE(__stop_dfu_trans = .);
      } > RAM
    
    } INSERT AFTER .data
    
    INCLUDE "nrf51_common.ld"
    
Children
Related