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

Segmentation fault after enabling BLE stack

I have my system working with softdevice compiled in but not enabled. System communicates with external chip using SPIM peripheral, everything is working fine until I enable the softdevice.

As soon as I issue

    ret_code_t err_code;
    err_code = nrf_sdh_enable_request();

the first spim_xfer ends with segmentation fault:

#0  0x000257ae in ?? ()
#1  <signal handler called>
#2  nrf_spim_event_clear (spim_event=NRF_SPIM_EVENT_END, p_reg=<optimized out>) at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/hal/nrf_spim.h:517
#3  spim_xfer (flags=0, p_xfer_desc=0x2003ff9c, p_cb=0x20004220 <m_cb+44>, p_spim=<optimized out>) at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:501
#4  nrfx_spim_xfer (p_instance=<optimized out>, p_xfer_desc=0x2003ff9c, flags=0) at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:607
#5  0x0000000e in ?? ()
#6  0x000373b0 in _fini ()

I am sure I am missing something simple here, but I can't remember what. Any tips?

  • Hi.

    Which SDK and SoftDevice do you use?

    Have you tried to debug the project and looked at what happend when you enabled the SoftDevice?

    Best regards,

    Andreas

  • I am using s140. I have tried single stepping thru code, the problem definitely is due to spim_xfer, but I could not pinpoint the exact line that throws the Segfault. If I step thru SPIM functions I can step thru all of them without error, and the segfault happens while doing nrfx_spim_uninit(&spim), but if I run it without debugging spim_xfer never returns.

    Below is my debugging session:

    Breakpoint 1, main () at .//main.c:179
    179        ads1293_init();
    (gdb) s
    ads1293_init () at .//ads1293.c:284
    284        power_init();
    (gdb) n
    285        power_on();
    (gdb) n
    283    void ads1293_init() {
    (gdb) n
    284        power_init();
    (gdb) n
    286        delay(1);
    (gdb) n
    285        power_on();
    (gdb) n
    289        spi_init();
    (gdb) n
    286        delay(1);
    (gdb) n
    287        clock_pin_init(ADS1293_CLK_IN_PIN);
    (gdb) n
    289        spi_init();
    (gdb) n
    290        ads1293_write_register(CONFIG, 2);
    (gdb) s
    ads1293_write_register (value=2 '\002', reg=CONFIG) at .//ads1293.c:299
    299        nrfx_spim_xfer_desc_t xfer = NRFX_SPIM_SINGLE_XFER(m_tx_buf, 2, m_rx_buf, 2);
    (gdb) n
    297        m_tx_buf[0] = COMMAND_WRITE & reg;
    (gdb) n
    299        nrfx_spim_xfer_desc_t xfer = NRFX_SPIM_SINGLE_XFER(m_tx_buf, 2, m_rx_buf, 2);
    (gdb) n
    297        m_tx_buf[0] = COMMAND_WRITE & reg;
    (gdb) n
    300        APP_ERROR_CHECK(nrfx_spim_xfer(&spim, &xfer, 0));
    (gdb) s
    298        m_tx_buf[1] = value;
    (gdb) n
    300        APP_ERROR_CHECK(nrfx_spim_xfer(&spim, &xfer, 0));
    (gdb) n
    298        m_tx_buf[1] = value;
    (gdb) n
    297        m_tx_buf[0] = COMMAND_WRITE & reg;
    (gdb) n
    300        APP_ERROR_CHECK(nrfx_spim_xfer(&spim, &xfer, 0));
    (gdb) s
    nrfx_spim_xfer (p_instance=p_instance@entry=0x33148 <spim>, p_xfer_desc=p_xfer_desc@entry=0x2003ffac, flags=flags@entry=0)
        at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:561
    561        spim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx];
    (gdb) n
    571        if (p_cb->transfer_in_progress)
    (gdb) n
    560    {
    (gdb) n
    571        if (p_cb->transfer_in_progress)
    (gdb) n
    560    {
    (gdb) n
    571        if (p_cb->transfer_in_progress)
    (gdb) n
    560    {
    (gdb) n
    571        if (p_cb->transfer_in_progress)
    (gdb) n
    581            if (p_cb->handler && !(flags & (NRFX_SPIM_FLAG_REPEATED_XFER |
    (gdb) n
    588        p_cb->evt.xfer_desc = *p_xfer_desc;
    (gdb) n
    590        if (p_cb->ss_pin != NRFX_SPIM_PIN_NOT_USED)
    (gdb) n
    588        p_cb->evt.xfer_desc = *p_xfer_desc;
    (gdb) n
    590        if (p_cb->ss_pin != NRFX_SPIM_PIN_NOT_USED)
    (gdb) n
    588        p_cb->evt.xfer_desc = *p_xfer_desc;
    (gdb) n
    590        if (p_cb->ss_pin != NRFX_SPIM_PIN_NOT_USED)
    (gdb) n
    593            if (!p_cb->use_hw_ss)
    (gdb) n
    596                if (p_cb->ss_active_high)
    (gdb) n
    602                    nrf_gpio_pin_clear(p_cb->ss_pin);
    (gdb) n
    607        return spim_xfer(p_instance->p_reg, p_cb,  p_xfer_desc, flags);
    (gdb) s
    spim_xfer (flags=0, p_xfer_desc=0x2003ffac, p_cb=0x20003b24 <m_cb+44>, p_spim=0x4002f000) at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:475
    475        if ((p_xfer_desc->p_tx_buffer != NULL && !nrfx_is_in_ram(p_xfer_desc->p_tx_buffer)) ||
    (gdb) n
    476            (p_xfer_desc->p_rx_buffer != NULL && !nrfx_is_in_ram(p_xfer_desc->p_rx_buffer)))
    (gdb) n
    475        if ((p_xfer_desc->p_tx_buffer != NULL && !nrfx_is_in_ram(p_xfer_desc->p_tx_buffer)) ||
    (gdb) n
    476            (p_xfer_desc->p_rx_buffer != NULL && !nrfx_is_in_ram(p_xfer_desc->p_rx_buffer)))
    (gdb) n
    487        p_cb->tx_length = 0;
    (gdb) n
    nrfx_spim_xfer (p_instance=p_instance@entry=0x33148 <spim>, p_xfer_desc=p_xfer_desc@entry=0x2003ffac, flags=flags@entry=0)
        at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:607
    607        return spim_xfer(p_instance->p_reg, p_cb,  p_xfer_desc, flags);
    (gdb) s
    spim_xfer (flags=0, p_xfer_desc=0x2003ffac, p_cb=0x20003b24 <m_cb+44>, p_spim=<optimized out>) at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:488
    488        p_cb->rx_length = 0;
    (gdb) n
    491        nrf_spim_tx_buffer_set(p_spim, p_xfer_desc->p_tx_buffer, p_xfer_desc->tx_length);
    (gdb) n
    492        nrf_spim_rx_buffer_set(p_spim, p_xfer_desc->p_rx_buffer, p_xfer_desc->rx_length);
    (gdb) n
    495        if (p_spim == NRF_SPIM3)
    (gdb) n
    492        nrf_spim_rx_buffer_set(p_spim, p_xfer_desc->p_rx_buffer, p_xfer_desc->rx_length);
    (gdb) n
    495        if (p_spim == NRF_SPIM3)
    (gdb) n
    492        nrf_spim_rx_buffer_set(p_spim, p_xfer_desc->p_rx_buffer, p_xfer_desc->rx_length);
    (gdb) n
    495        if (p_spim == NRF_SPIM3)
    (gdb) n
    497            anomaly_198_enable(p_xfer_desc->p_tx_buffer, p_xfer_desc->tx_length);
    (gdb) n
    501        nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_END);
    (gdb) n
    503        spim_list_enable_handle(p_spim, flags);
    (gdb) n
    505        if (!(flags & NRFX_SPIM_FLAG_HOLD_XFER))
    (gdb) n
    507            nrf_spim_task_trigger(p_spim, NRF_SPIM_TASK_START);
    (gdb) n
    521        if (!p_cb->handler)
    (gdb) n
    nrfx_spim_xfer (p_instance=p_instance@entry=0x33148 <spim>, p_xfer_desc=p_xfer_desc@entry=0x2003ffac, flags=flags@entry=0)
        at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:607
    607        return spim_xfer(p_instance->p_reg, p_cb,  p_xfer_desc, flags);
    (gdb) s
    spim_xfer (flags=0, p_xfer_desc=0x2003ffac, p_cb=0x20003b24 <m_cb+44>, p_spim=<optimized out>) at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:607
    607        return spim_xfer(p_instance->p_reg, p_cb,  p_xfer_desc, flags);
    (gdb) s
    nrf_spim_event_check (spim_event=NRF_SPIM_EVENT_END, p_reg=<optimized out>) at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/hal/nrf_spim.h:525
    525        return (bool)*(volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)spim_event);
    (gdb) s
    spim_xfer (flags=0, p_xfer_desc=0x2003ffac, p_cb=0x20003b24 <m_cb+44>, p_spim=<optimized out>) at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:523
    523            while (!nrf_spim_event_check(p_spim, NRF_SPIM_EVENT_END)){}
    (gdb) n
    526            if (p_spim == NRF_SPIM3)
    (gdb) n
    528                anomaly_198_disable();
    (gdb) n
    531            if (p_cb->ss_pin != NRFX_SPIM_PIN_NOT_USED)
    (gdb) n
    534                if (!p_cb->use_hw_ss)
    (gdb) n
    537                    if (p_cb->ss_active_high)
    (gdb) n
    543                        nrf_gpio_pin_set(p_cb->ss_pin);
    (gdb) n
    554        return err_code;
    (gdb) n
    nrfx_spim_xfer (p_instance=p_instance@entry=0x33148 <spim>, p_xfer_desc=p_xfer_desc@entry=0x2003ffac, flags=flags@entry=0)
        at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:608
    608    }
    (gdb) s
    ads1293_init () at .//ads1293.c:293
    293        spi_uninit();
    (gdb) s
    spi_uninit () at .//ads1293.c:78
    78        nrfx_spim_uninit(&spim);
    (gdb) s
    
    Program received signal SIGSEGV, Segmentation fault.
    0x000257ae in ?? ()
    (gdb) r
    Starting program: /home/miceuz/Xaltura/zive/Firmware/zive1/_build/nrf52840_xxaa.out
    
    Breakpoint 1, main () at .//main.c:179
    179        ads1293_init();
    (gdb) s
    ads1293_init () at .//ads1293.c:284
    284        power_init();
    (gdb) n
    285        power_on();
    (gdb) n
    283    void ads1293_init() {
    (gdb) n
    284        power_init();
    (gdb) n
    286        delay(1);
    (gdb) n
    285        power_on();
    (gdb) n
    289        spi_init();
    (gdb) n
    286        delay(1);
    (gdb) n
    287        clock_pin_init(ADS1293_CLK_IN_PIN);
    (gdb) n
    289        spi_init();
    (gdb) n
    290        ads1293_write_register(CONFIG, 2);
    (gdb) s
    ads1293_write_register (value=2 '\002', reg=CONFIG) at .//ads1293.c:299
    299        nrfx_spim_xfer_desc_t xfer = NRFX_SPIM_SINGLE_XFER(m_tx_buf, 2, m_rx_buf, 2);
    (gdb) n
    297        m_tx_buf[0] = COMMAND_WRITE & reg;
    (gdb) n
    299        nrfx_spim_xfer_desc_t xfer = NRFX_SPIM_SINGLE_XFER(m_tx_buf, 2, m_rx_buf, 2);
    (gdb) n
    297        m_tx_buf[0] = COMMAND_WRITE & reg;
    (gdb) n
    300        APP_ERROR_CHECK(nrfx_spim_xfer(&spim, &xfer, 0));
    (gdb) n
    298        m_tx_buf[1] = value;
    (gdb) n
    300        APP_ERROR_CHECK(nrfx_spim_xfer(&spim, &xfer, 0));
    (gdb) n
    298        m_tx_buf[1] = value;
    (gdb) n
    297        m_tx_buf[0] = COMMAND_WRITE & reg;
    (gdb) n
    300        APP_ERROR_CHECK(nrfx_spim_xfer(&spim, &xfer, 0));
    (gdb) s
    nrfx_spim_xfer (p_instance=p_instance@entry=0x33148 <spim>, p_xfer_desc=p_xfer_desc@entry=0x2003ffac, flags=flags@entry=0)
        at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:561
    561        spim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx];
    (gdb) n
    571        if (p_cb->transfer_in_progress)
    (gdb) n
    560    {
    (gdb) n
    571        if (p_cb->transfer_in_progress)
    (gdb) n
    560    {
    (gdb) n
    571        if (p_cb->transfer_in_progress)
    (gdb) n
    560    {
    (gdb) n
    571        if (p_cb->transfer_in_progress)
    (gdb) n
    581            if (p_cb->handler && !(flags & (NRFX_SPIM_FLAG_REPEATED_XFER |
    (gdb) n
    588        p_cb->evt.xfer_desc = *p_xfer_desc;
    (gdb) n
    590        if (p_cb->ss_pin != NRFX_SPIM_PIN_NOT_USED)
    (gdb) n
    588        p_cb->evt.xfer_desc = *p_xfer_desc;
    (gdb) n
    590        if (p_cb->ss_pin != NRFX_SPIM_PIN_NOT_USED)
    (gdb) n
    588        p_cb->evt.xfer_desc = *p_xfer_desc;
    (gdb) n
    590        if (p_cb->ss_pin != NRFX_SPIM_PIN_NOT_USED)
    (gdb) n
    593            if (!p_cb->use_hw_ss)
    (gdb) n
    596                if (p_cb->ss_active_high)
    (gdb) n
    602                    nrf_gpio_pin_clear(p_cb->ss_pin);
    (gdb) n
    607        return spim_xfer(p_instance->p_reg, p_cb,  p_xfer_desc, flags);
    (gdb) s
    spim_xfer (flags=0, p_xfer_desc=0x2003ffac, p_cb=0x20003b24 <m_cb+44>, p_spim=0x4002f000) at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:475
    475        if ((p_xfer_desc->p_tx_buffer != NULL && !nrfx_is_in_ram(p_xfer_desc->p_tx_buffer)) ||
    (gdb) n
    476            (p_xfer_desc->p_rx_buffer != NULL && !nrfx_is_in_ram(p_xfer_desc->p_rx_buffer)))
    (gdb) n
    475        if ((p_xfer_desc->p_tx_buffer != NULL && !nrfx_is_in_ram(p_xfer_desc->p_tx_buffer)) ||
    (gdb) n
    476            (p_xfer_desc->p_rx_buffer != NULL && !nrfx_is_in_ram(p_xfer_desc->p_rx_buffer)))
    (gdb) n
    487        p_cb->tx_length = 0;
    (gdb) n
    nrfx_spim_xfer (p_instance=p_instance@entry=0x33148 <spim>, p_xfer_desc=p_xfer_desc@entry=0x2003ffac, flags=flags@entry=0)
        at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:607
    607        return spim_xfer(p_instance->p_reg, p_cb,  p_xfer_desc, flags);
    (gdb) s
    spim_xfer (flags=0, p_xfer_desc=0x2003ffac, p_cb=0x20003b24 <m_cb+44>, p_spim=<optimized out>) at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:488
    488        p_cb->rx_length = 0;
    (gdb) n
    491        nrf_spim_tx_buffer_set(p_spim, p_xfer_desc->p_tx_buffer, p_xfer_desc->tx_length);
    (gdb) n
    492        nrf_spim_rx_buffer_set(p_spim, p_xfer_desc->p_rx_buffer, p_xfer_desc->rx_length);
    (gdb) n
    495        if (p_spim == NRF_SPIM3)
    (gdb) n
    492        nrf_spim_rx_buffer_set(p_spim, p_xfer_desc->p_rx_buffer, p_xfer_desc->rx_length);
    (gdb) n
    495        if (p_spim == NRF_SPIM3)
    (gdb) n
    492        nrf_spim_rx_buffer_set(p_spim, p_xfer_desc->p_rx_buffer, p_xfer_desc->rx_length);
    (gdb) n
    495        if (p_spim == NRF_SPIM3)
    (gdb) n
    497            anomaly_198_enable(p_xfer_desc->p_tx_buffer, p_xfer_desc->tx_length);
    (gdb) n
    501        nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_END);
    (gdb) n
    503        spim_list_enable_handle(p_spim, flags);
    (gdb) n
    505        if (!(flags & NRFX_SPIM_FLAG_HOLD_XFER))
    (gdb) n
    507            nrf_spim_task_trigger(p_spim, NRF_SPIM_TASK_START);
    (gdb) n
    521        if (!p_cb->handler)
    (gdb) n
    nrfx_spim_xfer (p_instance=p_instance@entry=0x33148 <spim>, p_xfer_desc=p_xfer_desc@entry=0x2003ffac, flags=flags@entry=0)
        at /home/miceuz/nrf/nRF5_SDK/modules/nrfx/drivers/src/nrfx_spim.c:607
    607        return spim_xfer(p_instance->p_reg, p_cb,  p_xfer_desc, flags);
    (gdb) n
    608    }
    (gdb) n
    ads1293_init () at .//ads1293.c:293
    293        spi_uninit();
    (gdb) s
    spi_uninit () at .//ads1293.c:78
    78        nrfx_spim_uninit(&spim);
    (gdb) s
    
    Program received signal SIGSEGV, Segmentation fault.
    0x000257ae in ?? ()

  • I am attaching some code that demonstrates the problem. Note, I am running it on my own board, so logging is on different pins than devboards

      segfault.zip

  • Hi.

    Which SDK are you using?

    Are you using an example, or have you configured SPIM yourself?

    Are you using any other peripherals?

    Which interrupt priority level have you given them? If they are default then that is 0 which is not allowed by the SoftDevice.

    Best regards,

    Andreas

  • I am using the latest SDK - v15.2.0.

    I have collected a simple example where I use minimal set of peripherals - just power management, spim and BLE -- see a zip in my other post.

    I have copied spim config from examples. I did not change the example spim IRQ priority which is set at 6.

Related