简介:NVS的主要功能是:存储键值(存在flash上面);

NVS利用spi_flash_{read|write|erase}这些API来操作数据在内存上的删改写,内存上data类型nvs子类型所代表的空间全部是NVS使用的;

NVS操作 数据的删改些运用一些API,就像是在电脑上打开文件,写文件,关闭文件一样。如nvs_open, nvs_close, nvs_write;

NVS一般存储一下比较小的数据还是很好使用的,如果要存储比较大的内容,还是用FAT更合适;

NVS操作的数据为键值对,key是ASCII字符串,最大长度是15个字符,数值的话可以包含下列类型:uint8_tint8_tuint16_tint16_tuint32_tint32_tuint64_tint64_t;数据类型还包括以0结尾的字符串,可变长度的二进制数据;String values are currently limited to 4000 bytes. This includes the null terminator. Blob values are limited to 508000 bytes or (97.6% of the partition size - 4000) bytes whichever is lower.字符串数据当前限制为4000字节,这4000自己包括NULL,BLOB数据限制为508000字节

key值要求是唯一的,如果给存在的key更新对应的数据,如果更新的数据和老数据是同一个类型,那么数据会更新,如果新数据老数据是不同类型,报错;

Currently NVS uses a portion of main flash memory through spi_flash_{read|write|erase} APIs. The library uses the all the partitions with data type and nvs subtype. The application can choose to use the partition with label nvs through nvs_open API or any of the other partition by specifying its name through nvs_open_from_part API.

上面这段英文翻译:NVS通过spi_flash_{read|write|erase} API来使用内存上指定的分区,data类型,nvs分类型分区的存储都可以被NVS使用,可以用nvs_open这个API打开,或者用nvs_open_from_part 这个API打开指定类型和分类型名称的内存分区;

将来NVS可能会支持将数据存储在另外的存储上(比如SPI或者I2C)

如果NVS存储被破坏了,那么就会被整体清楚掉,make erase_flash就是用来干这个事情的;

To mitigate potential conflicts in key names between different components, NVS assigns each key-value pair to one of namespaces. Namespace names follow the same rules as key names, i.e. 15 character maximum length. Namespace name is specified in the nvs_open or nvs_open_from_partcall. This call returns an opaque handle, which is used in subsequent calls to nvs_read_*nvs_write_*, and nvs_commit functions. This way, handle is associated with a namespace, and key names will not collide with same names in other namespaces. Please note that the namespaces with same name in different NVS partitions are considered as separate namespaces.

上面英文的翻译如下:为了减少不同组件之间键名之间的冲突(至于什么组件,这段英文没有提),NVS给每个键值对分配了一个名空间(这段英文的意思是名空间有很多),名空间的命名规则和键的命名规则是相同的,比如说最多允许15个字符的字符串。名空间的名字在nvs_open 或者nvs_open_from_part这两个API中都有明确写出。这两个API都会返回句柄,返回的句柄在 nvs_read_*nvs_write_*, 和 nvs_commit 这些API中都有用到,句柄和名空间的名字之间存在对应关系。不同名空间下即使存在同名的key值也是不冲突的。请注意不同的NVS存储空间内同名的名空间是相互独立的,没有任何互相影响;

NVS stores key-value pairs sequentially, with new key-value pairs being added at the end. When a value of any given key has to be updated, new key-value pair is added at the end of the log and old key-value pair is marked as erased.

上面这段翻译:NVS存储键值对在内存中是连续的,新存储的键值对 放在最后头,当更新一个已经存在的键值对时,也是放在最后头,原先的键值对就标记删除。

esp_err_tnvs_flash_init(void)

初始化NVS分区,就是在分区表上标为NVS的那部分;

esp_err_tnvs_flash_init_partition(const char *partition_label)

初始化NVS分区,这个分区是特别指定的分区;

esp_err_tnvs_flash_deinit(void)

取消NVS分区初始化;

esp_err_tnvs_flash_deinit_partition(const char *partition_label)

NVS特别指定分区的去初始化;

esp_err_tnvs_flash_erase(void)

擦除NVS分区;

esp_err_tnvs_flash_erase_partition(const char *part_name)

擦除NVS指定分区;

esp_err_tnvs_flash_secure_init(nvs_sec_cfg_t *cfg)

初始化NVS默认分区,但是不知道和第一个NVS初始化的区别,可能这个是安全级别上的初始化把;

esp_err_tnvs_flash_secure_init_partition(const char *partition_labelnvs_sec_cfg_t*cfg)

初始化指定分区的NVS,可能也是安全级别上的初始化;

esp_err_tnvs_flash_generate_keys(constesp_partition_t *partitionnvs_sec_cfg_t *cfg)

产生并存储NVS键;

esp_err_tnvs_flash_read_security_cfg(constesp_partition_t *partitionnvs_sec_cfg_t*cfg)

读取分区的安全设置;

ESP NVS的更多相关文章

  1. “破解大牛是怎么炼成的”之壳与ESP定律

    文章难易度:★★★ 文章阅读点/知识点:逆向破解 文章作者:Sp4ce 文章来源:i春秋   关键字:网络 信息安全技术 本文参与i春秋社区原创文章奖励计划,未经许可禁止转载! 一.前言 通过前面几篇 ...

  2. 函数调用关于从Ring3转到Ring0 ESP堆栈变化

    在ring0堆栈获取ring3堆栈方式 第一种方式 [esp+4] == [esp+参数个数*4+4] 如果这里不相等就需要用第二种方式 [[esp+参数个数*4+8]] 这里面的值就是Ring3的堆 ...

  3. esp和ebp详解

    最近在研究栈帧的结构,但总是有点乱,所以写了一个小程序来看看esp和ebp在栈帧中的作用.这个程序如下: 这个程序很简单,就是求两个数的值,然后输出即可.所以首先把它用gcc编译链接成a.out,进入 ...

  4. 栈帧%ebp,%esp详解

    首先应该明白,栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部( ...

  5. EBP的妙用[无法使用ESP定律时]

    1.了解EBP寄存器 在寄存器里面有很多寄存器虽然他们的功能和使用没有任何的区别,但是在长期的编程和使用 中,在程序员习惯中已经默认的给每个寄存器赋上了特殊的含义,比如:EAX一般用来做返回值,ECX ...

  6. EBP与ESP寄存器的使用

    push ebp mov esp,ebp esp是堆栈指针 ebp是基址指针 这两条指令的意思是将栈顶指向ebp的地址 ---------------------------------------- ...

  7. C++代码反汇编后的堆栈寄存器EBP和ESP

    最近在分析一个进程崩溃的严重问题,其中有些过程分析需要对ebp, esp 有清晰的理解,对于ebp 和esp 相信大家都很熟悉了,但是为了使本文自成体系,我还是解释一下. ebp--栈底指针 esp- ...

  8. 堆栈中的EIP EBP ESP

    EIP,EBP,ESP都是系统的寄存器,里面存的都是些地址.  为什么要说这三个指针,是因为我们系统中栈的实现上离不开他们三个.  我们DC上讲过栈的数据结构,主要有以下特点:  后进先处.(这个强调 ...

  9. GCC优化选项-fomit-frame-pointer对于esp和ebp优化的作用

    我的博客:www.while0.com -fomit-frame-pointer选项是发布产品时经常会用到的优化选项,它可以优化汇编函数中用edp协助获取堆栈中函数参数的部分,不使用edp,而是通过计 ...

随机推荐

  1. [转] Mac下 快速写博客的软件 MarsEdit

    正文 marsedit最好. 这东西还是收费的,这里, 我给个注册码: Name: The Blade SN: RSME3-DA4KUN-3EL6Y-MXD2X-LYMT9-6KGX8-4 ~~~~~ ...

  2. API输出的时候是return还是echo?

    写php API写的很少,最近才开始接口的写法,在框架里面一直用return,但是在api中retrun就失效了,为什么呢? 网友给出的答案: 1. return 一般用于函数或方法的返回. echo ...

  3. 设置div背景透明的CSS样式

    div背景透明样式: 样式代码: .alert{filter:alpha(opacity=100); /* IE */ -moz-opacity:1.0; /* Moz + FF */ opacity ...

  4. 纯css抖动效果

    HTML: <button class="shake">按钮</button> CSS: .shake{ width: 120px; height: 33p ...

  5. nativefier(一行代码将任意网页转化为桌面应用)

    刚刚在看前端九部的手册的时候,发现一个之前没有用过的骚东西,看上去还挺好用,我这个好奇心瞬间就窜的老高了,赶紧试一试,看看这个东西有没有必要收入我的胯下 结果实验完了之后, 必须必须要强行安利给你们 ...

  6. map标签

    map和area 标签配合img标签制作分区超链接效果 http://www.w3school.com.cn/tiy/t.asp?f=html_areamap

  7. 每篇半小时1天入门MongoDB——1. MongoDB介绍和安装

    目录:ASP.NET MVC企业级实战目录 MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据 ...

  8. 将Windows下的InfluxDB、Grafana做成Windows服务

    从网上下载的Windows下的InfluxDB.Grafana,都是控制台程序,打开窗口后,很容易被别人给关掉,因此考虑做成Windows服务,nssm正是解决该问题的利器. 1.下载nssm htt ...

  9. Linux 学习笔记之超详细基础linux命令 Part 7

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 6----------------- ...

  10. 安卓开发_浅谈DatePicker(日期选择器)

    DatePicker继承自FrameLayout类,日期选择控件的主要功能是向用户提供包含年.月.日的日期数据并允许用户对其修改.如果要捕获用户修改日期选择控件中的数据事件,需要为DatePicker ...