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

Parents
  • Hello,

    I am not sure how you translate from the PARAM_AUTOPROG_t to the records that you store using fds. Can you check out the size of the records that are being written when you have AUTOPROG_NB_OF_TAGS_MAX = 10 and when it is 100?

  • Hi thank you for you answer,

    i am using the function fds_update to write to the record, my record is around 700 bytes for the 100 tab and around 70 for the tab of 10.

    Is there a limit for the size of a record ?

    Do you see any link between using fds and have a softdevice issue ?

  • 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

Reply Children
No Data
Related