首页 > 其他分享 >ESP-IDF NVS

ESP-IDF NVS

时间:2024-04-07 14:55:38浏览次数:21  
标签:nvs err ESP counter IDF NVS restart

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

标签:nvs,err,ESP,counter,IDF,NVS,restart
From: https://www.cnblogs.com/HoNorthNorth/p/18119040

相关文章

  • GESP 2024年3月C++ 1级至8级
    GESP编程能力等级认证标准一级至八级(大纲)GESP编程能力等级认证标准一级至八级(大纲)-CCF-GESP编程能力等级认证GESP真题解析真题解析-CCF-GESP编程能力等级认证GESPC++/Python/图形化编程认证样题GESPC++/Python/图形化编程认证样题-CCF-GESP编程能力等级认证......
  • utilseq.h:92:30: error: ‘Iefp’ is not a class or namespace
     001、问题,make编译报错如下:utilseq.h:92:30:error:‘Iefp’isnotaclassornamespace 002、感觉像是c++版本低造成的测试一下,将gcc编译器有4.8升级到11,问题解决。升级方法:https://www.cnblogs.com/liujiaxin2018/p/16744442.html(base)[root@pc1src]#gcc......
  • LG_B3951 [GESP样题 五级] 小杨的队列 题解
    比较简单的一道逆序对的题,甚至不用\(\Omicron(n\logn)\)的归并,只需要\(\Omicron(n^2)\)的优化冒泡。就是一个在队列里每次push一个元素,然后查找逆序对的问题。值得一提的是,这道题身高不重复,所以才能优化冒泡拿满分,不然的话就得老实用归并了。直接看代码吧。#include<b......
  • pageSpy - 远程调试利器
    视频版:https://www.bilibili.com/video/BV1Zi4y167TZ前言在工作中,经常需要面对的问题就是处理客户提出的bug.但是这个事儿最耗费精力甚至决定能不能修的核心点,就是复现bug.因为不同业务的平台和表现形式不同,可能大家调试的方式也有些差异.对于笔者来说,最高......
  • pageSpy - 远程调试利器
    视频版:https://www.bilibili.com/video/BV1Zi4y167TZ前言在工作中,经常需要面对的问题就是处理客户提出的bug.但是这个事儿最耗费精力甚至决定能不能修的核心点,就是复现bug.因为不同业务的平台和表现形式不同,可能大家调试的方式也有些差异.对于笔者来说,最高效的方......
  • 闲来无事-esp32cam实现延时摄影
    扯淡时间在上一篇文章中我提了一嘴,打算使用esp32cam实现一个延迟摄影,奈何存在各种硬件问题,商家发了好几个地板都不好使(就是那个拼多多商家的问题,还说我供电不稳,我特意买了独立供电的hub),后来逛淘宝的时候又给我推送了esp32的板子,我不信邪的买了一个~他妈的上来就好使,所以才有了......
  • HTB-Responder
    HTB-Responder1.TASK1问题:使用IP地址访问Web服务时,我们要重定向到的域是什么?答案:unika.htb2.TASK2由于网站无法打开,需要在/etc/hosts里把域名加入注意这里得用root帐号修改,否则无法修改修改完成后可正常打开用Wappalyzer插件可以发现是PHP或者可以用BP抓包发现......
  • YesPMP | 分享有礼,领取现金奖励!
    YesPMP是专业的一站式互联网开发众包服务平台,始终以客户需求为导向,深耕于满足各类企业的软件开发需求。为了实现这一目标,我们打造了一个服务品类丰富的平台,涵盖了从网站开发、APP开发到微信开发等众多领域。不仅如此,还提供UI设计、软件开发、营销推广等一系列服务,旨在为企业提......
  • kali中解决docker报错:Error response from daemon: Get “https://registry-1.docker.
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、问题二、解决方法1.添加DNS2.写入DNS3.重启网络服务三、测试docker是否能正常拉取镜像前言Kali在使用docker下载镜像报错,如下部分报错所示。故对docker报错进行处理方案的记录。E......
  • ESP8266_Servo
    Servo的使用,以SG90舵机为例舵机控制说明(Servo.h里时间单位都是微秒us,角度是°)舵机通过脉冲宽度的时间来控制(PWM),频率是50Hz的(即一个周期是20ms)。(!!!脉宽是本质)SG90舵机的控制参数范围是:0°:0.5ms,180°:2.5ms。然后对于每一度,将脉宽范围除以180°即得。servo.attach......