I am noticing that FDS requires me to specify a "record size", but there is no maximum specified, so I am testing it. Currently my program attempts to store 32 words, but when my program tries to read back the words, it only reads back 23 words.
I notice that the more printfs I remove from my application, the more words I am able to read back. And this is only with one "record". Does that mean that I really only have 23 words worth of space regardless of the number of records? I already went through my application and reduced its size from 93748 bytes to 92780 bytes and yet I seem to only be able to store 30 words in one record.
This is my main.c:
uint32_t err_code;
err_code = fds_test_init();
APP_ERROR_CHECK(err_code);
err_code = fds_test_find_and_delete();
APP_ERROR_CHECK(err_code);
err_code = fds_test_write();
APP_ERROR_CHECK(err_code);
This is my flash.c:
/*
Flash storage example copied from https://github.com/hubuhubu/nRF52-fds-example
*/
#include "fds.h"
#include "sdk_errors.h"
#include "flash.h"
#include "nrf_log.h"
#define FILE_ID 0x1111
#define REC_KEY 0x2222
#define RECORD_SIZE 32
static void my_fds_evt_handler(fds_evt_t const *const p_fds_evt)
{
switch (p_fds_evt->id)
{
case FDS_EVT_INIT:
if (p_fds_evt->result != FDS_SUCCESS)
{
NRF_LOG_ERROR("FDS initialization failed");
}
break;
case FDS_EVT_WRITE:
if (p_fds_evt->result == FDS_SUCCESS)
{
fds_read();
}
break;
default:
break;
}
}
ret_code_t fds_test_write(void)
{
static uint32_t const m_deadbeef[RECORD_SIZE] = {
0xDEADBE01,
0xBAADF002,
0xDEADBE03,
0xBAADF004,
0xDEADBE05,
0xBAADF006,
0xDEADBE07,
0xBAADF008,
0xDEADBE09,
0xBAADF00A,
0xDEADBE0B,
0xBAADF00C,
0xDEADBE0D,
0xBAADF00E,
0xDEADBE0F,
0xBAADF000,
0xDEADBE01,
0xBAADF002,
0xDEADBE03,
0xBAADF004,
0xDEADBE05,
0xBAADF006,
0xDEADBE07,
0xBAADF008,
0xDEADBE09,
0xBAADF00A,
0xDEADBE0B,
0xBAADF00C,
0xDEADBE0D,
0xBAADF00E,
0xDEADBE0F,
0xBAADF000
};
fds_record_t record;
fds_record_desc_t record_desc;
// Set up record.
record.file_id = FILE_ID;
record.key = REC_KEY;
record.data.p_data = m_deadbeef;
record.data.length_words = RECORD_SIZE;
ret_code_t ret = fds_record_write(&record_desc, &record);
if (ret != FDS_SUCCESS)
{
return ret;
}
NRF_LOG_INFO("Writing Record ID = %d \r\n",record_desc.record_id);
return NRF_SUCCESS;
}
ret_code_t fds_read(void)
{
fds_flash_record_t flash_record;
fds_record_desc_t record_desc;
fds_find_token_t ftok ={0};//Important, make sure you zero init the ftok token
uint32_t *data;
uint32_t err_code;
NRF_LOG_INFO("Start searching... \r\n");
uint32_t fds_record_find_result = fds_record_find(FILE_ID, REC_KEY, &record_desc, &ftok);
// Loop until all records with the given key and file ID have been found.
while (fds_record_find_result == FDS_SUCCESS)
{
err_code = fds_record_open(&record_desc, &flash_record);
if ( err_code != FDS_SUCCESS)
{
return err_code;
}
NRF_LOG_INFO("Found Record ID = %d\r\n",record_desc.record_id);
NRF_LOG_INFO("Data = ");
data = (uint32_t *) flash_record.p_data;
for (uint8_t i=0;i<flash_record.p_header->length_words;i++)
{
NRF_LOG_INFO("0x%8x ",data[i]);
}
NRF_LOG_INFO("\r\n");
// Access the record through the flash_record structure.
// Close the record when done.
err_code = fds_record_close(&record_desc);
if (err_code != FDS_SUCCESS)
{
return err_code;
}
/* If file found successfully */
if(FDS_SUCCESS == fds_record_find_result){
return FDS_SUCCESS;
}
fds_record_find_result = fds_record_find(FILE_ID, REC_KEY, &record_desc, &ftok);
}
if(FDS_SUCCESS != fds_record_find_result){
return fds_record_find_result;
}
return NRF_SUCCESS;
}
ret_code_t fds_test_find_and_delete (void)
{
fds_record_desc_t record_desc;
fds_find_token_t ftok;
ftok.page=0;
ftok.p_addr=NULL;
// Loop and find records with same ID and rec key and mark them as deleted.
while (fds_record_find(FILE_ID, REC_KEY, &record_desc, &ftok) == FDS_SUCCESS)
{
fds_record_delete(&record_desc);
NRF_LOG_INFO("Deleted record ID: %d \r\n",record_desc.record_id);
}
// call the garbage collector to empty them, don't need to do this all the time, this is just for demonstration
ret_code_t ret = fds_gc();
if (ret != FDS_SUCCESS)
{
return ret;
}
return NRF_SUCCESS;
}
ret_code_t fds_test_init (void)
{
ret_code_t ret = fds_register(my_fds_evt_handler);
if (ret != FDS_SUCCESS)
{
return ret;
}
ret = fds_init();
if (ret != FDS_SUCCESS)
{
return ret;
}
return NRF_SUCCESS;
}
SDK 14.0.0
Softdevice S132 5.0.0