Hello,
I'm working up an application where tens of kilobytes are sent via bluetooth to a device which then stores the data on the internal flash (nrf52832). I've worked on defining a larger section of memory for the flash and the data is sent over in chunks (write without response). This is then stored until it reaches a certain arbitrary size and this is stored on the NVS. For the first couple of writes this works just fine but after that I get an error of -22 which seems to point to invalis argument. Anyway I have reduced this to a minimal use which is a struct as shown below:
/**
* @brief This struct is used to store a slice of compressed data
* @param data the compressed data
* @param len the length of the compressed data
* @param uncompressed_size the size of the uncompressed data
*/
typedef struct compressed_data_slice{
uint8_t *data;
uint32_t len;
uint32_t uncompressed_size;
}COMPRESSED_DATA_SLICE;
This is then used to store the data with the following code:
int test_store_slices(){
COMPRESSED_DATA_SLICE cds;
cds.len = 1056;
cds.uncompressed_size = 10240;
cds.data = k_malloc(cds.len);
for (int i = 0; i < cds.len; i++){
cds.data[i] = i;
}
for (int i = 0; i < 10; i++){
store_slice(cds);
}
return 0;
}
int store_slice(COMPRESSED_DATA_SLICE cds){
k_mutex_lock(&flash_mutex, K_FOREVER);
int ret = 0;
vid_file_id++;
uint16_t slice_id = vid_file_id;
//bw_settings_write("last_slice_id", &slice_id, sizeof(slice_id));
LOG_INF("Storage of slice of len %" PRIu32 " bytes with uncompressed size of %" PRIu32 " bytes with file_id of %i",
cds.len, cds.uncompressed_size, slice_id);
uint8_t *store_data;
store_data = k_malloc(cds.len + 4);
memcpy(store_data, &cds.uncompressed_size, 4);
memcpy(store_data + 4, cds.data, cds.len);
ret = nvs_delete(&fs, slice_id);
if (ret < 0){
LOG_ERR("Flash delete failed, rc=%d\n", ret);
}
ret = nvs_write(&fs, slice_id, store_data, cds.len + 4);
if (ret < 0) {
LOG_ERR("Flash write failed, rc=%d\n", ret);
}
ssize_t free_bytes = nvs_calc_free_space(&fs);
LOG_INF("Free space is %" PRIu32 " bytes", free_bytes);
k_mutex_unlock(&flash_mutex);
return ret;
}
This shows the same pattern as when the data is sent over the BLE connection, the first two writes work and the rest fail:
*** Booting nRF Connect SDK v2.9.0-7787b2649840 *** *** Using Zephyr OS v3.7.99-1f8f3dc29142 *** [00:00:00.008,850] <inf> brikwiz_base: Starting BrikWiz Base Peripheral [00:00:00.008,850] <inf> brikwiz_storage: Init storage [00:00:00.008,880] <inf> brikwiz_storage: Storage size is 4096 index is 112 [00:00:00.008,880] <inf> brikwiz_storage: Partition size is 65536 offset is 458752 [00:00:00.010,528] <inf> fs_nvs: 16 Sectors of 4096 bytes [00:00:00.010,559] <inf> fs_nvs: alloc wra: 5, f50 [00:00:00.010,559] <inf> fs_nvs: data wra: 5, efc [00:00:00.023,498] <inf> brikwiz_storage: Free space is 55480 bytes [00:00:00.023,620] <inf> brikwiz_storage: Storage of slice of len 1056 bytes with uncompressed size of 10240 bytes with file_id of 1 [00:00:00.064,361] <inf> brikwiz_storage: Free space is 54404 bytes [00:00:00.064,392] <inf> brikwiz_storage: Storage of slice of len 1056 bytes with uncompressed size of 10240 bytes with file_id of 2 [00:00:00.100,219] <inf> brikwiz_storage: Free space is 53684 bytes [00:00:00.100,219] <inf> brikwiz_storage: Storage of slice of len 1056 bytes with uncompressed size of 10240 bytes with file_id of 3 [00:00:00.101,043] <err> brikwiz_storage: Flash write failed, rc=-22 [00:00:00.115,509] <inf> brikwiz_storage: Free space is 54536 bytes [00:00:00.115,539] <inf> brikwiz_storage: Storage of slice of len 1056 bytes with uncompressed size of 10240 bytes with file_id of 4 [00:00:00.116,088] <err> brikwiz_storage: Flash write failed, rc=-22 [00:00:00.130,737] <inf> brikwiz_storage: Free space is 54536 bytes [00:00:00.130,737] <inf> brikwiz_storage: Storage of slice of len 1056 bytes with uncompressed size of 10240 bytes with file_id of 5 [00:00:00.131,317] <err> brikwiz_storage: Flash write failed, rc=-22 [00:00:00.145,965] <inf> brikwiz_storage: Free space is 54536 bytes [00:00:00.145,965] <inf> brikwiz_storage: Storage of slice of len 1056 bytes with uncompressed size of 10240 bytes with file_id of 6 [00:00:00.146,789] <err> brikwiz_storage: Flash write failed, rc=-22 [00:00:00.161,315] <inf> brikwiz_storage: Free space is 54932 bytes [00:00:00.161,315] <inf> brikwiz_storage: Storage of slice of len 1056 bytes with uncompressed size of 10240 bytes with file_id of 7 [00:00:00.162,139] <err> brikwiz_storage: Flash write failed, rc=-22 [00:00:00.176,727] <inf> brikwiz_storage: Free space is 55072 bytes [00:00:00.176,757] <inf> brikwiz_storage: Storage of slice of len 1056 bytes with uncompressed size of 10240 bytes with file_id of 8 [00:00:00.177,551] <err> brikwiz_storage: Flash write failed, rc=-22 [00:00:00.192,321] <inf> brikwiz_storage: Free space is 55628 bytes [00:00:00.192,352] <inf> brikwiz_storage: Storage of slice of len 1056 bytes with uncompressed size of 10240 bytes with file_id of 9 [00:00:00.192,932] <err> brikwiz_storage: Flash write failed, rc=-22 [00:00:00.207,885] <inf> brikwiz_storage: Free space is 55628 bytes [00:00:00.207,916] <inf> brikwiz_storage: Storage of slice of len 1056 bytes with uncompressed size of 10240 bytes with file_id of 10 [00:00:00.208,496] <err> brikwiz_storage: Flash write failed, rc=-22 [00:00:00.223,480] <inf> brikwiz_storage: Free space is 55628 bytes
Can you please advise as to the source of the problem? It can't be space as there is a lot of space but I'm at a loss as to the cause - especially with such a simple routine.
Thanks.
Cheers,
Neil