因此,学习和使用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盘”
当我执行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年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!