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

Blocked on SOFTDEVICE_HANDLER_INIT (RC clock source) with SDK nRF5_SDK_11.0.0-2.alpha_bc3f6a0

HI All,

I tried to migrate from nRF51_SDK_10.0.0_dc26b5e to nRF5_SDK_11.0.0-2.alpha_bc3f6a0

my migrated ble_stack_init:

static void ble_stack_init(void)
{
    uint32_t err_code;

    // Initialize the SoftDevice handler module.
    //SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_1000MS_CALIBRATION, NULL);
    SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_TEMP_4000MS_CALIBRATION, false);

    ble_enable_params_t ble_enable_params;
    err_code = softdevice_enable_get_default_config(CENTRAL_LINK_COUNT,
                                                    PERIPHERAL_LINK_COUNT,
                                                    &ble_enable_params);
    APP_ERROR_CHECK(err_code);
    
    //Check the ram settings against the used number of links
    CHECK_RAM_START_ADDR(CENTRAL_LINK_COUNT,PERIPHERAL_LINK_COUNT);
    
    // Enable BLE stack.
    err_code = softdevice_enable(&ble_enable_params);
    APP_ERROR_CHECK(err_code);

    // Register with the SoftDevice handler module for BLE events.
    err_code = softdevice_ble_evt_handler_set(ble_evt_dispatch);
    APP_ERROR_CHECK(err_code);

    // Register with the SoftDevice handler module for System events.
    err_code = softdevice_sys_evt_handler_set(sys_evt_dispatch);
    APP_ERROR_CHECK(err_code);
}

The code blocked on SOFTDEVICE_HANDLER_INIT.

  1. I use NRF_CLOCK_LFCLKSRC_RC_250_PPM_TEMP_4000MS_CALIBRATION clock source.
  2. The clock source works find on SDK 9 and SDK 10
  3. Bootloader works fine so softdevice is flashed correctly.
  4. I use S130 stack (from 1.0.0 to 2.0.0)

Any idea ?

  • 'Blocked'? What does that mean? You're probably in an error handler fromthe APP_ERROR_CHECK()s inside SOFTDEVICE_HANDLER_INIT(). Single-step in and find out what the error code is

  • backtrack output:

    ((gdb) bt
    #0  0x0000075c in ?? ()
    #1  <signal handler called>
    #2  0x0001f55e in sd_softdevice_enable (clock_source=17, fault_handler=0x1f78d <
    softdevice_fault_handler>) at /home/itrs/Work-bt/ingics-ble-s130/lib/nRF5_SDK_11
    .0.0-2.alpha_bc3f6a0/components/softdevice/s130/headers/nrf_sdm.h:191
    #3  0x0001f912 in softdevice_handler_init (clock_source=17, p_ble_evt_buffer=0x2
    000081c <BLE_EVT_BUFFER.9289>, ble_evt_buffer_size=72, evt_schedule_func=0x0) at
     /home/itrs/Work-bt/ingics-ble-s130/lib/nRF5_SDK_11.0.0-2.alpha_bc3f6a0/componen
    ts/softdevice/common/softdevice_handler/softdevice_handler.c:307
    #4  0x0001d57c in ble_stack_init () at /home/itrs/Work-bt/ingics-ble-s130/ble_ig
    s_serial_io/src/main.c:1385
    #5  0x0001da0a in main () at /home/itrs/Work-bt/ingics-ble-s130/ble_igs_serial_i
    o/src/main.c:1646
    

    The code never returns from SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lfclk

  • Works fine here. What kind of hardware are you running this on? What SoftDevice are you using? What memory settings do you have in Options for Target?

  • The cause is I use gcc toolchain and the SDK 11.0.0 linker script for s130 is wrong.

    <nRF5_SDK_11.0.0-2.alpha_bc3f6a0>/components/softdevice/s130/toolchain/armgcc/armgcc_s130_nrf51822_xxaa.ld :

    /* Linker script to configure memory regions. */
    
    SEARCH_DIR(.)
    GROUP(-lgcc -lc -lnosys)
    
    MEMORY
    {
      FLASH (rx) : ORIGIN = 0x1b000, LENGTH = 0x25000
      RAM (rwx) :  ORIGIN = 0x20000000, LENGTH = 0x4000
    }
    
    SECTIONS
    {
      .fs_data_out ALIGN(4):
      {
        PROVIDE( __start_fs_data = .);
        KEEP(*(fs_data))
        PROVIDE( __stop_fs_data = .);
      } = 0
    }
    
    INCLUDE "nrf5x_common.ld"
    

    After change to:

    MEMORY
    {
      FLASH (rx) : ORIGIN = 0x1b000, LENGTH = 0x25000
      RAM (rwx) :  ORIGIN = 0x20001f00, LENGTH = 0x2100
    }
    

    It works. SDK team please check the gcc linker script for later release.

Related