ESP-IDF NVS
-
ESP-IDF NVS
- 1. 什么是NVS?
-
2. NVS中的概念
- 2.1. partition 分區(qū)
- 2.2. namespace 命名空間
- 2.3. key-value 鍵值對
- 3. ESP-IDF中NVS的代碼實現
1. 什么是NVS?
非易失性存儲 (NVS) 庫主要用于在 flash 中存儲鍵值格式的數據。
2. NVS中的概念
2.1. partition 分區(qū)
這里的Flash分區(qū)與分區(qū)表中所提到的Flash分區(qū)是相同的概念。
所以在希望調用nvs_open_from_partition()
進行初始化時,需要先在分區(qū)表中設置對應名稱的Flash分區(qū)。
在使用默認分區(qū)的情況下,可以直接使用nvs_open()
進行初始化。
2.2. namespace 命名空間
為了減少不同組件之間鍵名的潛在沖突,NVS將每個鍵值對分配給一個命名空間。文章來源:http://www.zghlxwxcb.cn/news/detail-844328.html
- 命名空間的命名規(guī)則遵循鍵名的命名規(guī)則,例如,最多可占15個字符。
- 單個NVS分區(qū)最多只能容納254個不同的命名空間。
- 不同NVS分區(qū)中具有相同名稱的命名空間將被視為不同的命名空間。
2.3. key-value 鍵值對
- 支持的最大鍵長為15個字符。
- 值可以分為以下幾種類型:整數型;以0結尾的字符串;可變長度的二進制數據(BLOB)。
- 讀取值時會執(zhí)行數據類型檢查。如果讀取操作預期的數據類型與對應鍵的數據類型不匹配,則返回錯誤。
3. ESP-IDF中NVS的代碼實現
基于nvs_flash_init()
和nvs_open(space_name, NVS_READWRITE, &my_handle)
實現的NVS文章來源地址http://www.zghlxwxcb.cn/news/detail-844328.html
#include <stdio.h>
#include "esp_system.h"
#include "nvs_flash.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void app_main(void)
{
// 初始化NVS
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
ESP_ERROR_CHECK(err);
nvs_handle_t my_handle;
char* space_name = "storage";
err = nvs_open(space_name, NVS_READWRITE, &my_handle);
if (err != ESP_OK) {
printf("打開命名空間失敗,具體錯誤 (%s) \n", esp_err_to_name(err));
} else {
printf("打開命名空間成功 \n");
// printf("Reading restart counter from NVS ... ");
int32_t restart_counter = 0;
char* key_name = "restart_counter";
err = nvs_get_i32(my_handle, key_name, &restart_counter); // 獲取鍵值對restart_counter的值
switch (err) {
case ESP_OK:
printf("鍵值對restart_counter的值獲取成功 \n");
printf("Restart counter的值為%ld\n", restart_counter);
break;
case ESP_ERR_NVS_NOT_FOUND:
printf("鍵值對restart_counter的值未被設置 \n");
break;
default :
printf("鍵值對restart_counter的值讀取錯誤,具體錯誤 (%s) \n", esp_err_to_name(err));
}
// 更新restart_counter的值
restart_counter++;
err = nvs_set_i32(my_handle, key_name, restart_counter);
printf((err != ESP_OK) ? "設置鍵值對失敗!\n" : "設置鍵值對成功\n");
// 提交寫入值
err = nvs_commit(my_handle);
printf((err != ESP_OK) ? "提交寫入值失敗!\n" : "提交寫入值成功\n");
nvs_close(my_handle);
}
printf("\n");
// 重啟倒計時
for (int i = 10; i >= 0; i--) {
printf("%ds后重啟設備...\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
printf("現在重啟!\n");
esp_restart();
}
到了這里,關于ESP-IDF NVS的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!