ESP32中的NVS
这几天的天气只有钱包的余额能让我冷静,好好活着,每天都有新的打击,写写博客压压惊。
一、什么是NVS?
NVS即Non-volatile storage,意思是非易失存储,也就是掉电后能依然能持久化保存数据。在我们应用NVS时,一般用于存储一些配置数据、状态数据等,一般不会用来存储存放大量的数据量。
在嵌入式系统中,NVS主要是在flash进行键值对的存储。那么什么是键值对?这边举一个例子方便大家理解,假设我们要把东西存到flash中,按照底层的操作习惯,我们要先指定一个地址,然后对这个地址执行擦除操作,然后才能写入;读取的时候也需要根据这个地址,然后指定读取长度。如果我们要存的项比较多,又在代码中比较分散,我们对flash的地址就很难管理。因为我们很难知道要存的内容与其他地址有没冲突,会不会误擦除。存在诸多问题。那如果有一个机制,方便帮我们把这些检测判断活都干了,不需要我们指定地址操作,那岂不是很好。有的人又说了,文件系统不就是这样吗?是的,文件系统是这样,但NVS操作更加轻量级。
在NVS中,我们要存一个值,我们不需要指定地址,但需要指定一个“键”,我们称为key,然后我们在这个“键”索引下存我们的值,也就是value。假设我们要存wifi的ssid和密码,我们可以在nvs中这样定义。
key = ssid,value = testwifi
key = password,value = 12345678
在键名ssid下,我们存的值是testwifi,在键名password下,我们存的值是12345678。因此键名key一般不会修改,经常修改的是value。
在ESP32中对于NVS的操作,还需要指定一个命名空间,是因为还考虑了一种情况,在各个不同的功能模块中,键名是有可能取到一样的,比如对于wifi模块,存在一个password键名,对于管理员模块,可能也存在一个password键名,这样有可能就造成了重复,程序无法按我们的意思进行。如果我们增加了一个命名空间进行隔离,那么键名有重复也不怕,比如说在wifi模块中,我们指定一个命名空间”wifi”,在此命名空间下有ssid和password键名,在管理员模块,我们指定一个命名空间”manager”,在此命名空间下有password键名,这两组命名空间互不干扰。
二、ESP32中NVS的使用