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 ?

  • There shouldn't be a limit, but we have seen that there are some issues with some softdevices when the record size is too large. The issue is that fds_gc(), which will move the valid record's physical location uses some operations that takes too long, and the softdevice asserts, because it missed a critical time operation.I thought the limit was over 700 bytes, but I guess it also depends on what you are doing with the softdevice. E.g. if you have a connection with a small connection interval

    Can you try to debug, and let me know what it looks like when you get the assert? Does the assert point to some addresses, e.g. in the callstack?

     

    I am using nrf52_6.1.0 with SDK 15.2.0

    "You mean S140v6.1.0 with SDK15.2.0", right?

    BR,

    Edvin

  • Thank you,

    Yes i am using nrf52_6.1.0 with SDK 15.2.0 ,

    We are doing advert every 800ms and we have seen that the fds_gc() takes 170ms to be done so maybe it leads to a sofdevice assert because it takes too much time.

    "Can you try to debug, and let me know what it looks like when you get the assert? Does the assert point to some addresses, e.g. in the callstack?"

    Do you mean to debug the softdevice or the application ?

    If the record is to big what is the solution to take less time doing fds_gc ? should i cut my record in many pieces and write it with several steps ?

Reply
  • Thank you,

    Yes i am using nrf52_6.1.0 with SDK 15.2.0 ,

    We are doing advert every 800ms and we have seen that the fds_gc() takes 170ms to be done so maybe it leads to a sofdevice assert because it takes too much time.

    "Can you try to debug, and let me know what it looks like when you get the assert? Does the assert point to some addresses, e.g. in the callstack?"

    Do you mean to debug the softdevice or the application ?

    If the record is to big what is the solution to take less time doing fds_gc ? should i cut my record in many pieces and write it with several steps ?

Children
  • 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