【ESP-IDF】介绍NVS

因此,学习和使用ESP-IDF中的NVS可以帮助开发者在ESP32和ESP32-S系列芯片上实现持久化数据存储,并简化数据管理和提高应用程序的稳定性和效率。

如何使用NVS

简单来说,我们可以把nvs比喻成一个“U盘”,那接下来我们就开始对这个“U盘”进行操作吧!

接下来我们做一个简单的演示,代码如下:

#include <stdio.h>
#include "nvs\_flash.h"
void app\_main(void)
{
    // 对“U盘”进行初始化
    nvs\_flash\_init();

    char \*bilibili_name_space = "BiliBili";
    nvs_handle_t bilibili_handle;
    // 创建一个句柄来打卡它
    nvs\_open(bilibili_name_space, NVS_READWRITE, &bilibili_handle);

    // 创建初始变量counter\_val记录ESP32重启次数
    uint32\_t counter_val = 0;
    // 创建初始变量counter\_val的key,可以将其比喻成文件名
    char \*counter_key = "counter";
    // 查看是否存在counter\_val(因为我们的counter\_val是uint32\_t类型,所以下面我们要用nvs\_get\_u32())
    nvs\_get\_u32(bilibili_handle, counter_key, &counter_val);
    counter_val = counter_val + 1;
    // 设置counter\_val
    nvs\_set\_u32(bilibili_handle, counter_key, counter_val);
		// 提交执行
		nvs\_commit(bilibili_handle);
    // 关闭窗口(句柄)
    nvs\_close(bilibili_handle);
    // 退出“U盘”
    nvs\_flash\_deinit();
}

对于上述代码,我们可以这样形象的理解

当我执行nvs_flash_init()的时候,相当于插入了“U盘”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMrB7AL4-1681699998241)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/709fae5b-853a-489d-9a0d-b0637de0090b/Untitled.png)]

当我执行nvs_open(bilibili_name_space , NVS_READWRITE, &bilibili_handle)时,相当于新建bilibili_name_space文件夹,并进入其中,其中这个文件夹是NVS_READWRITE即可读可写的,而bilibili_handle就相当于这个窗口,我接下来所有的操作都需要通过这个窗口(句柄)进行操作

在这里插入图片描述

在这里插入图片描述

当我运行nvs_get_u32(bilibili_handle, counter_key, &counter_val)时,其实就是相当于打开名字为:counter_key的文件,而文件内的值就是counter_val

nvs_set_u32(bilibili_handle, counter_key, counter_val)就是设置文件里的内容

在这里插入图片描述

nvs_commit(bilibili_handle),就是提交执行,nvs_close(bilibili_handle)就是关闭窗口(句柄),nvs_flash_deinit()就是退出“U盘”。

优化代码后:

#include <stdio.h>
#include "esp\_log.h"
#include "nvs\_flash.h"
void app\_main(void)
{
    // 对“U盘”进行初始化
    nvs\_flash\_init();

    char \*bilibili_name_space = "BiliBili";
    nvs_handle_t bilibili_handle;
    // 创建一个句柄来打卡它
    nvs\_open(bilibili_name_space, NVS_READWRITE, &bilibili_handle);

    // 创建初始变量counter\_val记录ESP32重启次数
    uint32\_t counter_val = 0;
    // 创建初始变量counter\_val的key,可以将其比喻成文件名
    char \*counter_key = "counter";
    // 查看是否存在counter\_val(因为我们的counter\_val是uint32\_t类型,所以下面我们要用nvs\_get\_u32())
    nvs\_get\_u32(bilibili_handle, counter_key, &counter_val);

    ESP\_LOGI("NVS", "KEY:VALUE %s:%lu", counter_key, counter_val);

    // 设置counter\_val
    nvs\_set\_u32(bilibili_handle, counter_key, ++counter_val);
		// 提交执行
		nvs\_commit(bilibili_handle);
    // 关闭窗口(句柄)
    nvs\_close(bilibili_handle);
    // 退出“U盘”
    nvs\_flash\_deinit();
}

接下来我们来测试一下这段代码:
可以看到,第1次为1,第2次为2,但是按理来说,第一次应该为0,第二次才是1,这是由于ESP-IDF太快了,在打印之前它就重启了一遍,所以才会被记录成1。

在这里插入图片描述

在这里插入图片描述

这里我们可以通过给几秒的延时来避免这种情况发生,如下:

在这里插入图片描述

这里我们重点注意一下这行代码:

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值