I've been slowly adding NVS functionality to my code. Has been working fine, up until today when I attempted to write a struct I have for storing historical data to flash.
This is the struct:
Fullscreen
1
2
3
4
5
6
struct log_data {
// data structure to store individual strike events
uint8_t strike_level; // SML = 1, MED = 2 or LRG = 4
uint16_t total_strike_count; // Total number of strikes recorded to date
struct bt_cts_current_time time_detected; //Time stamp for each strike
};
I then have an array of this struct. At this point, MAX_STRIKE_RECORDS = 10, but ultimately I want to see this at 250.
Fullscreen
1
struct log_data lsr_strike_log[MAX_STRIKE_RECORDS];
In my code to read the data in from Flash, I have the following:
Fullscreen
1
2
3
4
uint32_t rc = 0;
rc = nvs_read(&fs, HISTORY_ID, &lsr_strike_log, sizeof(lsr_strike_log));
printk("sizeof = %u\n", sizeof(lsr_strike_log));
printk("strike history rc = %u\n", rc);
The return value from nvs_read() is supposed to be the amount of data read in, if everything works as expected. In my case, this should be equal to sizeof(lsr_strike_log), which is 160 bytes. If the return value is larger than this, it apparently means there is more data to read in. This is what I get from my two printk() statements:
Fullscreen
1
2
sizeof = 160
strike history rc = 4294967294
So, its like the nvs_read() is going outside my defined flash area, or something - I'm not sure, hence why I'm posting here to see if someone can help me understand what's going on better.
My flash is initialised as per the following, and I don't get any of the error messages output via UART, so it appears to be initialising OK.
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
flash_dev = FLASH_AREA_DEVICE(STORAGE_NODE_LABEL);
if (!device_is_ready(flash_dev)) {
printk("Flash device %s is not ready\n", flash_dev->name);
return -EINVAL;
}
fs.offset = FLASH_AREA_OFFSET(storage);
rc = flash_get_page_info_by_offs(flash_dev, fs.offset, &info);
if (rc)
{
printk("Unable to get page info\n");
return rc;
}
fs.sector_size = info.size;
fs.sector_count = 3U;
rc = nvs_init(&fs, flash_dev->name);
if (rc)
{
printk("Flash Init failed\n");
return rc;
}
If I enable CONFIG_LOG=y in my proj.config file, I see the following output:

I suspect I'm doing something obvious wrong. Problem is, its not obvious to me.
Thanks and regards,
Mike