I developed a product with 9160 and stored some data in NVS. The product can run normally at the beginning, but after a period of use, when the device was restarted, I found that the system crashed during nvs_init(&fs, DT_FLASH_DEV_NAME); after startup. Why? My sdk is ncs1.2.0, This is the allocation definition of my NVS storage area:
static int nvs_setup(void)
{
int err;
fs.offset = DT_FLASH_AREA_STORAGE_OFFSET;
err = flash_get_page_info_by_offs(device_get_binding(DT_FLASH_DEV_NAME), fs.offset, &info);
if(err)
{
#ifdef INNER_FLASH_DEBUG
LOGD("Unable to get page info");
#endif
}
fs.sector_size = info.size;
fs.sector_count = 6U;
err = nvs_init(&fs, DT_FLASH_DEV_NAME);
if(err)
{
#ifdef INNER_FLASH_DEBUG
LOGD("Flash Init failed");
#endif
}
nvs_init_flag = true;
return err;
}
#ifndef __INNER_FLASH_H__
#define __INNER_FLASH_H__
#include <zephyr.h>
#include <stdio.h>
#include <zephyr/types.h>
#include <drivers/gps.h>
#include "datetime.h"
#include "Settings.h"
//存储时间和设置项的地址ID
#define DATETIME_ID 1
#define SETTINGS_ID 2
//存储索引的地址ID
//实时数据ID
#define CUR_SPORT_ID 3
#define CUR_HEALTH_ID 4
#define CUR_LOCAL_ID 5
//定时数据的地址ID
#define SPORT_INDEX_ADDR_ID 6
#define HEALTH_INDEX_ADDR_ID 8
#define LOCAL_INDEX_ADDR_ID 10
//储存总条数的地址ID
#define SPORT_COUNT_ADDR_ID 7
#define HEALTH_COUNT_ADDR_ID 9
#define LOCAL_COUNT_ADDR_ID 11
//存储索引的起止编号
#define SPORT_INDEX_BEGIN 1000
#define SPORT_INDEX_MAX 1100
#define HEALTH_INDEX_BEGIN 2000
#define HEALTH_INDEX_MAX 2100
#define LOCAL_INDEX_BEGIN 3000
#define LOCAL_INDEX_MAX 3100
typedef enum
{
RECORD_TYPE_LOCATION,
RECORD_TYPE_HEALTH,
RECORD_TYPE_SPORT,
RECORD_TYPE_MAX
}ENUM_RECORD_TYPE;
typedef struct
{
sys_date_timer_t timestamp;
u16_t steps;
u16_t distance;
u16_t calorie;
u16_t light_sleep;
u16_t deep_sleep;
}sport_record_t;
typedef struct
{
sys_date_timer_t timestamp;
u8_t hr;
u8_t spo2;
u8_t systolic; //收缩压
u8_t diastolic; //舒张压
u16_t deca_temp;///实际温度放大10倍(36.5*10)
}health_record_t;
typedef struct
{
sys_date_timer_t timestamp;
double latitude;
double longitude;
float altitude;
float speed;
float heading;
struct gps_datetime datetime;
}local_record_t;
typedef union
{
sport_record_t sport;
health_record_t health;
local_record_t local;
}imu_data_u;
extern sport_record_t last_sport;
extern health_record_t last_health;
extern void test_nvs(void);
extern void ReadSettingsFromInnerFlash(global_settings_t *settings);
extern void SaveSettingsToInnerFlash(global_settings_t settings);
extern void ReadDateTimeFromInnerFlash(sys_date_timer_t *time);
extern void SaveDateTimeToInnerFlash(sys_date_timer_t time);
extern bool save_cur_local_to_record(local_record_t *local_data);
extern bool save_cur_health_to_record(health_record_t *health_data);
extern bool save_cur_sport_to_record(sport_record_t *sport_data);
extern bool get_cur_local_from_record(local_record_t *local_data);
extern bool get_cur_health_from_record(health_record_t *health_data);
extern bool get_cur_sport_from_record(sport_record_t *sport_data);
extern bool save_local_to_record(local_record_t *local_data);
extern bool save_health_to_record(health_record_t *health_data);
extern bool save_sport_to_record(sport_record_t *sport_data);
extern bool get_local_from_record(local_record_t *local_data, u32_t index);
extern bool get_health_from_record(health_record_t *health_data, u32_t index);
extern bool get_sport_from_record(sport_record_t *sport_data, u32_t index);
extern bool get_last_sport_from_record(sport_record_t *sport_data);
extern bool get_last_health_from_record(health_record_t *health_data);
extern bool get_last_local_from_record(local_record_t *local_data);
extern bool get_local_from_record_by_time(local_record_t *local_data, sys_date_timer_t begin_time, u32_t index);
extern bool get_health_from_record_by_time(health_record_t *health_data, sys_date_timer_t begin_time, u32_t index);
extern bool get_sport_from_record_by_time(sport_record_t *sport_data, sys_date_timer_t begin_time, u32_t index);
#endif/*__INNER_FLASH_H__*/
In addition, I want to know how many sectors can NVS be divided into at most? Is there a limit on the size of each sector? How many records can each sector store? How many bytes of data can each record store at most?