ESP-IDF NVS

来源:https://www.cnblogs.com/HoNorthNorth/p/18119040
-Advertisement-
Play Games

ESP-IDF NVS 目錄ESP-IDF NVS1. 什麼是NVS?2. NVS中的概念2.1. partition 分區2.2. namespace 命名空間2.3. key-value 鍵值對3. ESP-IDF中NVS的代碼實現 1. 什麼是NVS? 非易失性存儲 (NVS) 庫主要用於在 ...


ESP-IDF NVS

目錄

1. 什麼是NVS?

非易失性存儲 (NVS) 庫主要用於在 flash 中存儲鍵值格式的數據。

2. NVS中的概念

2.1. partition 分區

這裡的Flash分區與分區表中所提到的Flash分區是相同的概念。

所以在希望調用nvs_open_from_partition()進行初始化時,需要先在分區表中設置對應名稱的Flash分區。

在使用預設分區的情況下,可以直接使用nvs_open()進行初始化。

2.2. namespace 命名空間

為了減少不同組件之間鍵名的潛在衝突,NVS將每個鍵值對分配給一個命名空間。

  1. 命名空間的命名規則遵循鍵名的命名規則,例如,最多可占15個字元。
  2. 單個NVS分區最多只能容納254個不同的命名空間。
  3. 不同NVS分區中具有相同名稱的命名空間將被視為不同的命名空間。

2.3. key-value 鍵值對

  1. 支持的最大鍵長為15個字元。
  2. 值可以分為以下幾種類型:整數型;以0結尾的字元串;可變長度的二進位數據(BLOB)。
  3. 讀取值時會執行數據類型檢查。如果讀取操作預期的數據類型與對應鍵的數據類型不匹配,則返回錯誤。

3. ESP-IDF中NVS的代碼實現

基於nvs_flash_init()nvs_open(space_name, NVS_READWRITE, &my_handle)實現的NVS

#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();
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引言 在現代化的軟體開發中,單元測試和集成測試是確保代碼質量和可靠性的關鍵部分。ASP.NET Core 社區內提供了強大的單元測試框架,xUnit 是其中之一,它提供了簡單、清晰和強大的測試功能,編寫單元測試有許多優點;有助於回歸、提供文檔及輔助良好的設計。下麵幾節我們來深入淺出探討如何使用 xU ...
  • 隨著跨平臺應用的需求不斷增長,開發人員需要一種能夠在不同操作系統上運行的用戶界面(UI)框架。 Avalonia 是一種引人註目的選擇。在本文中,我們將深入瞭解 Avalonia 是什麼,它與 WPF 的區別,以及它的 UI 繪製引擎和原理、優點,以及一個簡單的示例代碼。 Avalonia 是什麼? ...
  • iNeuOS工業互聯網操作系統“表單設計”功能經過升級後,能夠適用於更多應用場景,從業務上來講可以擴展設備管理、MES等表單類的管理功能,從技術上來講可以支持資料庫單表應用、多級關聯表應用、可以自定義寫SQL語句等,現在支持22個基礎表單組件、9個高級表單組件。 ...
  • 本篇教程深入探討了 ILGenerator 中的參數載入指令,通過詳細解釋Ldarg、Ldarga、Ldloc和Ldloca等指令的使用,讀者能夠清晰地認識到Ld指令用於載入參數或本地變數到堆棧,而St指令用於將值從堆棧存儲到參數或本地變數中。這些指令為動態方法的生成提供了基礎,幫助開發者更好地掌握... ...
  • CSharpe線程 目錄CSharpe線程C#如何操作線程Thread1. Thread如何開啟一個線程呢?2. Thread中常見的API3. thread的擴展封裝threadpool一、 .NET Framework2.0時代:出現了一個線程池ThreadPool二、線程池如何申請一個線程呢? ...
  • 前面學習了一些Source Generators的基礎只是,接下來就來實踐一下,用這個來生成我們所需要的代碼。 本文將通過讀取swagger.json的內容,解析並生成對應的請求響應類的代碼。 創建項目 首先還是先創建兩個項目,一個控制台程式,一個類庫。 添加swagger文件 在控制台程式中添加F ...
  • 前言 本文將探討如何利用WPF框架實現樹形表格控制項,該控制項不僅能夠有效地展示覆雜的層級數據,還能夠提供豐富的個性化定製選項。我們將介紹如何使用WPF提供的控制項、模板、佈局、數據綁定等技術來構建這樣一個樹形表格。 一、運行效果 1.1預設樣式 1.2 自定義樣式 二、代碼實現 2.1 創建自定義控制項( ...
  • @目錄前言簡介一、準備工作1.1 創建寫入腳本1.2 設置執行許可權1.3 添加定時任務1.4 配置生效二、Tomcat日誌 按每天分割2.1 創建一個 sh文件2.2 設置執行許可權2.3 設置crontab指令,指定每日定時任務2.4 配置生效總結 前言 請各大網友尊重本人原創知識分享,謹記本人博客 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...