Hi,
I am using the FDS API to perform operations on flash. What I intend to achieve is: A zero initialised array like data structure in the flash. Initially zeroes are written to a fixed region in the flash later on valid data is updated using FDS API. Just like zero initialisation of array in C, but in this case I am zero initialising a region of the flash.
Zero initialisation:
#define SIZE 5
# This block of code is called only once after initialising the FDS.
fds_file_delete(FILE_ID);
fds_gc();
for (uint16_t key = 0x0001; key < SIZE; key++) {
record.file_id = FILE_ID;
record.key = key;
record.data.p_data = "0";
record.data.length_words = 1;
fds_record_write(&record_desc, &record);
}
Update:
record.file_id = FILE_ID; record.key = 0x0001; record.data.p_data = &m_hello; //Global char array record.data.length_words = sizeof(m_hello); memset(&ftok, 0x00, sizeof(fds_find_token_t)); fds_record_find_by_key(0x0001, &record_desc, &ftok); fds_record_update(&record_desc, &record);
Read:
fds_record_find_by_key(0x0001, &record_desc, &ftok); fds_record_open(&record_desc, &flash_record);
What I notice is, update works fine when Soft device is disabled (I don't use nrf_sdh_enable_request() and no observers are initalised)
But when I enable the Soft device, the update works on the first instance of flashing the soft device and the user application. On subsequent resets or flashing the soft device and the user app when I read the output is always "0", while I expect the output to be the updated data.
How I enable the Soft Device:#define OBSERVER_PRIO 1
bool request_evt_handler(nrf_sdh_req_evt_t request, void * p_context)
{
switch (request)
{
case NRF_SDH_EVT_ENABLE_REQUEST:
break;
case NRF_SDH_EVT_DISABLE_REQUEST:
break;
}
return true;
}
NRF_SDH_REQUEST_OBSERVER(m_req_observer, OBSERVER_PRIO) =
{
.handler = request_evt_handler,
.p_context = NULL
};
uint32_t soft_dev_enable(void)
{
ret_code_t ret;
uint32_t ram_start;
ret = nrf_sdh_enable_request();
VERIFY_SUCCESS(ret);
if (!nrf_sdh_is_enabled()) {
NRF_LOG_INFO("Failed to enable SD");
}
return 0;
}
sdk_config.h:#define NRF_SDH_ENABLED 1
#define NRF_SDH_SOC_ENABLED 1
#define FDS_BACKEND 2
In short:
1. Write to flash using fds_record_write()
2. Update record at same key using fds_record_update()
3. Read record at same key using fds_record_find_by_key, fds_record_open
4. Flash once, update works as expected. After reflashing/resetting device update doesn't work
Soft device enabled: Above sequence 1-3 works when device is flashed for first time, output is as expected. Subsequently flashing/reseting device the output is not as expected.
Soft device disabled: Works always.
I am not sure how FDS works when Soft Device is not enabled but this is what I experienced.
A similar issue is discussed here
Development environment:
1. NRF52833 DK
2. SDK version:: 17.1.0