主要参考资料:
B站Up主 孤独的二进制《ESP32 存储篇 NVS 非易失性存储库》
ESP-IDF开发指南>API参考>非易失性存储: https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-reference/storage/nvs_flash.html
目录
- 概述
- NVS使用(以Wi-Fi账号密码为例)
- 打开NVS
- 存储数据
- 读取数据
- 关闭NVS
- 迭代器
- 获取状态信息
概述
怎么理解NVS(非易失性存储库)?其实可以把它与我们的电脑磁盘做类比。
进一步拆解NVS,我们在分区表中可以看到NVS只有24K的空间,每个NVS有很多的4096B的Page,每个Page又是由32B的Entry组成。
这个Entry就是一个最小单位,即使你只存int8一个字节,也要消耗一个Entry。
一个Entry里会包括15B的key和value,以及CRC验证,因此NVS适合存储int类,而不是string或者Blob二进制。
NVS使用(以Wi-Fi账号密码为例)
打开NVS
nvs_flash_init();//打开时需要输入一个命名空间 、状态和一个句柄
char* namespace ="namespace";
nvs_handle_t handle;
nvs_open(namespace, NVS_READWRITE, handle);
存储数据
//定义一个结构体存储账号密码
typedef struct{char ssid[50];char password[50];
}ap_t;
ap_t aps_set;//将准备好的账号密码复制进来
strcpy(aps_set.ssid,"wifi_ssid");
strcpy(aps_set.ssid,"wifi_password");//往NVS存储数据,这个API需要输入handle、key、value和大小
nvs_set_blob(handel, "ap", aps_set, sizeof(aps_set));
读取数据
//定义一个结构体存储账号密码
typedef struct{char ssid[50];char password[50];
}ap_t;
ap_t aps_set;//从NVS获取数据,这个API需要输入handle、key、value和大小的指针
size_t length = sizeof(aps_set);
nvs_get_blob(handel, "ap", aps_set, &length );
关闭NVS
//关闭时需要输入一个句柄
nvs_close(handle);
nvs_flash_deinit();
迭代器
迭代器简单说就是可以罗列出所有键值对
这是它的一些API
这是使用的一个案例
// Example of listing all the key-value pairs of any type under specified partition and namespacenvs_iterator_t it = NULL;esp_err_t res = nvs_entry_find(<nvs_partition_name>, <namespace>, NVS_TYPE_ANY, &it);while(res == ESP_OK) {nvs_entry_info_t info;nvs_entry_info(it, &info); // Can omit error check if parameters are guaranteed to be non-NULLprintf("key '%s', type '%d' \n", info.key, info.type);res = nvs_entry_next(&it);}nvs_release_iterator(it);
获取状态信息
可以查看有多少Entry和空余Entry,案例如下
// Example of nvs_get_stats() to get the number of used entries and free entries:
nvs_stats_t nvs_stats;
nvs_get_stats(NULL, &nvs_stats);
printf("Count: UsedEntries = (%d), FreeEntries = (%d), AllEntries = (%d)\n",nvs_stats.used_entries, nvs_stats.free_entries, nvs_stats.total_entries);