app time loop update 200 byte data use fds by 10s ,then after many time error happened, update_user_flash is update API, write_drop_record IS loop write API in app time,
void write_drop_record(uint32_t timestamp)
{
ret_code_t ret;
if(g_drop_evt.total_number[0] == 0 || g_drop_evt.current_number[0] > DROP_RECORD_NUMBER_MAX)
{
g_drop_evt.current_number[0] = 1;
}
g_drop_evt.record[g_drop_evt.current_number[0] - 1].number = g_drop_evt.current_number[0];
for(size_t i = 0; i < 4; i++)
{
g_drop_evt.record[g_drop_evt.current_number[0] - 1].time[i] = timestamp >> (24 - (i*8)) & 0xFF;
}
/*write current drop history number*/
ret = update_user_flash((uint8_t *)g_drop_evt.current_number, sizeof(g_drop_evt.current_number),\
DEVICE_INFO_DROP_ID, DEVICE_INFO_DROP_KEY_CURRENT_NUMBER);
if (ret != FDS_SUCCESS)
{
NRF_LOG_INFO("Write Current number error %d",ret);
}
g_drop_evt.total_number[0]++;
NRF_LOG_INFO("W total %d",g_drop_evt.total_number[0]);
if(g_drop_evt.total_number[0] > DROP_RECORD_NUMBER_MAX)
{
g_drop_evt.total_number[0] = DROP_RECORD_NUMBER_MAX;
}
else
{
ret = update_user_flash((uint8_t *)g_drop_evt.total_number, sizeof(g_drop_evt.total_number), \
DEVICE_INFO_DROP_ID, DEVICE_INFO_DROP_KEY_TOTAL_NUMBER);
if (ret != FDS_SUCCESS)
{
NRF_LOG_INFO("Write total number error %d",ret);
}
}
NRF_LOG_INFO("W curent %d",g_drop_evt.current_number[0]);
g_drop_evt.current_number[0]++;
/*write current drop history sequence and time*/
ret = update_user_flash((uint8_t *)g_drop_evt.record, sizeof(g_drop_evt) * DROP_RECORD_NUMBER_MAX, \
DEVICE_INFO_DROP_ID, DEVICE_INFO_DROP_KEY_CURRENT_RECORD);
if (ret != FDS_SUCCESS)
{
NRF_LOG_INFO("Write Record error %d",ret);
}
fds_stat_t stat = {0};
ret = fds_stat(&stat);
if(stat.dirty_records > 600)
fds_gc();
}
ret_code_t update_user_flash(uint8_t *p_data, uint16_t length, uint16_t file_id, uint16_t record_key)
{
ret_code_t ret;
fds_record_t rec;
//fds_record_desc_t rec_desc;
fds_record_desc_t p_desc;
fds_find_token_t ftok;
// Prepare the record to be stored in flash.
rec.file_id = file_id;
rec.key = record_key;
rec.data.p_data = p_data;
rec.data.length_words = length % 4 > 0 ? length / 4 + 1 : length / 4;
memset(&ftok, 0, sizeof(fds_find_token_t));
memset(&p_desc, 0, sizeof(fds_record_desc_t));
ret = fds_record_find(file_id, record_key, &p_desc, &ftok);
if (ret == FDS_ERR_NOT_FOUND)
{
ret = fds_record_write(&p_desc, &rec);
APP_ERROR_CHECK(ret);
}
else
{ // Update existing record.
ret = fds_record_update(&p_desc, &rec);
APP_ERROR_CHECK(ret);
}
if (ret == FDS_ERR_NO_SPACE_IN_FLASH)
{ //running garbage collection ,then re try update again
NRF_LOG_INFO("No space in flash, delete some records to update the config file.");
fds_gc();
memset(&ftok, 0, sizeof(fds_find_token_t));
ret = fds_record_find(file_id, record_key, &p_desc, &ftok);
if (ret == FDS_ERR_NOT_FOUND)
{
ret = fds_record_write(&p_desc, &rec);
}
else
{ // Update existing record.
ret = fds_record_update(&p_desc, &rec);
}
if (ret == FDS_ERR_NO_SPACE_IN_FLASH) fds_gc();
}
return ret;
}
id and key
error printf
fds config