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

SOFTDEVICE: ASSERTION FAILED after using fds_gc

I have an issue when i am doing  writing of a structure where autoprog is a struct like this :

typedef struct
{
    uint8_t tag_tab[TAG_ID_LENGTH];
}tag;

typedef struct {
    uint8_t reader_cfg;
    //uint8_t reader_sn[SIZE_OF_SN];
    uint8_t reader_mac[PARAM_MAC_SIZE];
    uint32_t number_of_tag;    
    tag tab_tag_autorized[AUTOPROG_NB_OF_TAGS_MAX];   
    
} PARAM_AUTOPROG_t;

When AUTOPROG_NB_OF_TAGS_MAX = 10 i have no problem during the garbage collection but when it is 100 after 3 flash_write when the fonction fds_gc() is called there is a SOFTDEVICE: ASSERTION FAILED, i don't see the link between writing to flash and the sofdevice that has a problem.

is there a way to know why the softdevice stops ?

I am using nrf52_6.1.0 with SDK 15.2.0

Thank you for your help

  • MarcAntoineProtiere said:
    Yes i am using nrf52_6.1.0 with SDK 15.2.0 ,

     So the S140 v6.1.0, right? Slight smile

     

    MarcAntoineProtiere said:
    Do you mean to debug the softdevice or the application ?

     I mean the application. The reason you say it is a softdevice assert is probably because you see it in the log? If you do a debug session, you should see that it runs to the case NRF_FAULT_ID_SD_ASSERT. If you put a breakpoint here. what does the call stack look like?

    BR,

    Edvin

  • yes  S140 v6.1.0

    Yes i was using the log with NRF_LOG_INFO and i get the sofdevice assert.

    I will try do it in debug and i let you know.

  • Hi

    I tried to run the program in debug whithout the breakpoint and it has stopped at line 100 of app_error_weak.c

    /**
     * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA
     *
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without modification,
     * are permitted provided that the following conditions are met:
     *
     * 1. Redistributions of source code must retain the above copyright notice, this
     *    list of conditions and the following disclaimer.
     *
     * 2. Redistributions in binary form, except as embedded into a Nordic
     *    Semiconductor ASA integrated circuit in a product or a software update for
     *    such product, 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.
     *
     * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
     *    contributors may be used to endorse or promote products derived from this
     *    software without specific prior written permission.
     *
     * 4. This software, with or without modification, must only be used with a
     *    Nordic Semiconductor ASA integrated circuit.
     *
     * 5. Any software provided in binary form under this license must not be reverse
     *    engineered, decompiled, modified and/or disassembled.
     *
     * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
     * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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.
     *
     */
    #include "app_error.h"
    
    #include "nrf_log.h"
    #include "nrf_log_ctrl.h"
    #include "app_util_platform.h"
    #include "nrf_strerror.h"
    
    #if defined(SOFTDEVICE_PRESENT) && SOFTDEVICE_PRESENT
    #include "nrf_sdm.h"
    #endif
    
    /*lint -save -e14 */
    /**
     * Function is implemented as weak so that it can be overwritten by custom application error handler
     * when needed.
     */
    __WEAK void app_error_fault_handler(uint32_t id, uint32_t pc, uint32_t info)
    {
        __disable_irq();
    
    #ifndef DEBUG
        NRF_LOG_ERROR("Fatal error");
    #else
        NRF_LOG_FINAL_FLUSH();
        switch (id)
        {
    #if defined(SOFTDEVICE_PRESENT) && SOFTDEVICE_PRESENT
            case NRF_FAULT_ID_SD_ASSERT:
                NRF_LOG_ERROR("SOFTDEVICE: ASSERTION FAILED");
                break;
            case NRF_FAULT_ID_APP_MEMACC:
                NRF_LOG_ERROR("SOFTDEVICE: INVALID MEMORY ACCESS");
                break;
    #endif
            case NRF_FAULT_ID_SDK_ASSERT:
            {
                assert_info_t * p_info = (assert_info_t *)info;
                NRF_LOG_ERROR("ASSERTION FAILED at %s:%u",
                              p_info->p_file_name,
                              p_info->line_num);
                break;
            }
            case NRF_FAULT_ID_SDK_ERROR:
            {
                error_info_t * p_info = (error_info_t *)info;
                NRF_LOG_ERROR("ERROR %u [%s] at %s:%u\r\nPC at: 0x%08x",
                              p_info->err_code,
                              nrf_strerror_get(p_info->err_code),
                              p_info->p_file_name,
                              p_info->line_num,
                              pc);
                 NRF_LOG_ERROR("End of error report");
                break;
            }
            default:
                NRF_LOG_ERROR("UNKNOWN FAULT at 0x%08X", pc);
                break;
        }
    #endif
    
        NRF_BREAKPOINT_COND;
        // On assert, the system can only recover with a reset.
    
    #ifndef DEBUG
        NRF_LOG_WARNING("System reset");
        NVIC_SystemReset();
    #else
        //app_error_save_and_stop(id, pc, info);
        NRF_LOG_FINAL_FLUSH();
        while(1);
    #endif // DEBUG
    }
    /*lint -restore */
    

    so after i have put a breakpoint on the line 57 to get the stack when the softdevice assert here :

    __WEAK void app_error_fault_handler(uint32_t id, uint32_t pc, uint32_t info)
    //breakpoint here{

    So the stack look like this when i have the sofdevice assert with the breakpoint:

  • Hello,

    Can you please check sdk_config.h and look for a definition of NRF_FSTORAGE_SD_MAX_WRITE_SIZE. By default I think this is set to 4096 in most cases. Can you please try to set this to 1024 instead? this is just a backend setting, so your application logic doesn't need to think about this. 

    Try that, and see if the assert still occurs. 

    Best regards,

    Edvin

  • Congrats your solution is working i have not the assert when i change this value !

    Thanks a lot for your help

Related