At the start of my application, I write several hundred of records, each of size 8 words.
Each file_id/record_key is unique (one record combination per file_id/record_key)
After each write, I wait for the FDS event on completion.
At the end, if I try to read the first few hundreds records, data is correct.
But when retrieving the last dozens records written, I retrieve data full of 0xFF
Every function returns are checked and return NRF_SUCCESS.
I have set FDS_VIRTUAL_PAGES to a large enough number.
Writing :
static void fds_evt_handler(fds_evt_t const * p_fds_evt){ storage_access_in_progress = false; switch (p_fds_evt->id) { case FDS_EVT_INIT: if (p_fds_evt->result != NRF_SUCCESS) { APP_ERROR_CHECK(p_fds_evt->result); } break; default: break; } } static void wait_for_storage_access() { while(storage_access_in_progress) {} } void memory_init() { ret_code_t err_code = fds_register(fds_evt_handler); APP_ERROR_CHECK(err_code); storage_access_in_progress = true; NRF_LOG_INFO("Initializing FDS"); err_code = fds_init(); APP_ERROR_CHECK(err_code); wait_for_storage_access(); err_code = fds_gc(); APP_ERROR_CHECK(err_code); wait_for_storage_access(); NRF_LOG_INFO("End init FDS"); } void write_all() { // In a loop, write 100 records : // LOOP START uint8_t* data_copy = malloc(SIZE_32); // Fill data_copy // Increment record_key and/or file_id // (...) fds_record_t record; record.file_id = file_id; record.key = record_key; record.data.p_data = data_copy; record.data.length_words = SIZE_32 / 4; NRF_LOG_INFO("Write record type %s file %x key %x", data_type_to_string(data_type), index_to_file_id(data_type, index), index_to_record_key(data_type, index)); ret_code_t err_code; storage_access_in_progress = true; err_code = fds_record_write(NULL, &record); APP_ERROR_CHECK(err_code); if (index > 645) { NRF_LOG_HEXDUMP_INFO(i_data, 32); } while(storage_access_in_progress) {} // LOOP END }
Reading :
fds_find_token_t ftok; memset(&ftok, 0x00, sizeof(fds_find_token_t)); fds_flash_record_t flash_record; fds_record_desc_t record_desc; err_code = fds_record_find(file_id, record_key, &record_desc, &ftok); APP_ERROR_CHECK(err_code); err_code = fds_record_open(&record_desc, &flash_record); APP_ERROR_CHECK(err_code); NRF_LOG_HEXDUMP_INFO(flash_record.p_data, 32); err_code = fds_record_close(&record_desc); APP_ERROR_CHECK(err_code);
Output :
<info> app: Write record file_id 1001 record_key A043 <info> app: 42 36 31 31 41 37 00 00|B611A7.. <info> app: 00 00 00 00 FF FF FF FF|........ <info> app: 01 00 00 00 FF FF FF FF|........ <info> app: FF FF FF FF FF FF FF FF|........ <info> app: Write record file_id 1008 record_key A006 <info> app: 37 41 32 36 36 33 00 00|7A2663.. <info> app: 00 00 00 00 FF FF FF FF|........ <info> app: 07 00 00 00 FF FF FF FF|........ <info> app: FF FF FF FF FF FF FF FF|........ <info> app: Read record file_id 1001 record_key A043 <info> app: 42 36 31 31 41 37 00 00|B611A7.. <info> app: 00 00 00 00 FF FF FF FF|........ <info> app: 01 00 00 00 FF FF FF FF|........ <info> app: FF FF FF FF FF FF FF FF|........ <info> app: Read record file_id 1008 record_key A006 <info> app: FF FF FF FF FF FF FF FF|........ <info> app: FF FF FF FF FF FF FF FF|........ <info> app: FF FF FF FF FF FF FF FF|........ <info> app: FF FF FF FF FF FF FF FF|........