Toggle navigation
首页
(current)
问答
文章
话题
商城
登录
注册
9、合宙Air模块Luat开发:认识NVS数据管理模块
Lua
nvs
教程
二次开发
# 目录 [点击这里查看所有博文](https://blog.csdn.net/weixin_44570083/article/details/104285283) > 本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的A...
# 目录 [点击这里查看所有博文](https://blog.csdn.net/weixin_44570083/article/details/104285283) > 本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。 > 先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获 我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考! # 一、前言 ## 1.1、NVS 介绍 NVS: Non-volatile storage , 即将数据存储到 flash 中, 掉电或重启后数据仍然存在, flash 类似于 PC 上磁盘。 Air720SL 上提供 nvs 接口给用户, 来保存和读取用户数据. 具体参考 nvm.lua,本接口不适合大容量数据的存储管理,如果数据量超过10K,建议直接使用io接口操作文件来管理。 ## 1.2、NVS 优势 * 擦写均衡, 使 flash 寿命更长 NVS 在操作少量数据上, NVS 分区更大时, 擦写均衡表现的更为明显.。 例如: flash 一个 sector 为 4KB, NVS 分配大小为一个 sector, 写同一个 64 Bytes 数据到 flash, 分别比较spi_flash_xxx 和 nvs 写 64 次。 * spi_flash_write: 每次写 flash 前, 需擦除 flash. 对应: 64 次擦除 flash, 64 次写 flash。 nvs: nvs 内部有擦写均衡, 有标志位记录当前有效存储. 如第一次擦除 sector, 再写 sector 0-63 Byte, 第二次写 sector 64-127 Bytes, 第 64 次(4KB/64Bytes) 写完 sector 最后一个 64 Byte. 对应: 1 次擦除 flash, 64 次写 flash。 这样 NVS 减少 64 倍擦除操作, 对 flash 寿命有较大提升. 在 NVS 分区更大, 存储信息少时, 表现的更为明显.。 > 以上内容引用[espressif的ESP8266/ESP32 NVS 基本操作](https://blog.csdn.net/espressif/article/details/84749096)有兴趣的自行了解 ## 1.3、NVS数据管理模块 * NVS是通过`config.lua`文件进行数据初始化的,这个文件只在第一次运行时有效,需要提前把要存储的键值对放进去才能使用,不能在程序随意添加其他的键值对,只能修改文件中提前写好的 * para.lua:每次开机初始化时,如果para.lua不存在,则从config.lua复制出一个文件,重命名为para.lua,在程序运行过程中,写参数都是操作这个para.lua * 本例程config.lua提前定义了如下几个变量,有string类型、有numble类型、有bool类型、有table类型,平时常用的变量基本都有,也可以自行添加其他变量 ```c module(...) strPara = "str1" numPara = 1 boolPara = false tablePara = {"item1-1","item1-2","item1-3"} ``` 注意:重新下载会清空数据存储区,旧数据会被清空 # 二、编写测试程序 nvs在luat中封装的很简单,几乎可以认为是无脑,对着例程看一下就知道怎么用,一共就涉及到了三个函数,分别是 * nvm.init("config.lua")--初始化nvs模块 * nvm.get("strPara")--读取键值对,该键值对必须提前在config中定义 * nvm.set("strPara", "str2")--设置键值对,前提是存在这个键值对 完整的测试代码如下,测试代码中分别对string类型、numble类型、bool类型、table类型进行了设置和读取。 ```c --必须在这个位置定义PROJECT和VERSION变量 --PROJECT:ascii string类型,可以随便定义,只要不使用,就行 --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义 PROJECT = "LED" VERSION = "0.0.1" require "sys" --加载日志功能模块,并且设置日志输出等级 --如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可 require "log" LOG_LEVEL = log.LOGLEVEL_TRACE require "config" require "nvm" local function Test_Task() while true do log.info("Test_Task_run") local num = nvm.get("numPara") num = num + 1 nvm.set("numPara", num) log.info("numPara",num) sys.wait(2000) end end local function user_main() sys.wait(10000) nvm.init("config.lua") nvm.set("strPara", "str2") nvm.set("boolPara", false) nvm.set("tablePara", {"item2-1", "item2-2", "item2-3"}) log.info("testNvm.strPara", nvm.get("strPara")) log.info("testNvm.boolPara", nvm.get("boolPara")) local tableValue = nvm.get("tablePara") log.info("testNvm.tablePara", tableValue[1], tableValue[2], tableValue[3]) sys.taskInit(Test_Task) end --启动系统框架 sys.taskInit(user_main) sys.init(0, 0) sys.run() ``` # 三、下载测试程序到开发板 下载时要注意的是必须带上`config.lua`才能正常使用 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200402212937386.png) 下载完成打开监视端口,读写正常 ```c [2020-04-02 21:51:31.742] [I]-[nvm.set] true strPara str2 nil nil [2020-04-02 21:51:31.753] [I]-[nvm.set] false boolPara false nil nil [2020-04-02 21:51:31.757] [I]-[nvm.set] true tablePara table: 06fc3358 nil nil [2020-04-02 21:51:31.768] [I]-[testNvm.strPara] str2 [2020-04-02 21:51:31.772] [I]-[testNvm.boolPara] false [2020-04-02 21:51:31.782] [I]-[testNvm.tablePara] item2-1 item2-2 item2-3 [2020-04-02 21:51:31.788] [I]-[Test_Task_run] [2020-04-02 21:51:31.792] [I]-[nvm.set] true numPara 2 nil nil [2020-04-02 21:51:31.971] [I]-[numPara] 2 [2020-04-02 21:51:33.943] [I]-[Test_Task_run] [2020-04-02 21:51:33.947] [I]-[nvm.set] true numPara 3 nil nil [2020-04-02 21:51:33.953] [I]-[numPara] 3 [2020-04-02 21:51:35.960] [I]-[Test_Task_run] [2020-04-02 21:51:35.973] [I]-[nvm.set] true numPara 4 nil nil [2020-04-02 21:51:35.993] [I]-[numPara] 4 [2020-04-02 21:51:37.955] [I]-[Test_Task_run] [2020-04-02 21:51:37.959] [I]-[nvm.set] true numPara 5 nil nil ``` > 不会下载的[点击这里](https://blog.csdn.net/weixin_44570083/article/details/104285283),进去查看我的第二篇博文`2、Air720SL模块Luat开发:第一个Luat的Hello World`里面讲了怎么下载 > 这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束
发表于 2020-04-02 22:17
阅读 ( 1983 )
分类:
默认分类
1 推荐
收藏
你可能感兴趣的文章
13、RDA8910CSDK二次开发:将你的代码藏起来----编译静态库
5367 浏览
3、RDA8910CSDK二次开发:GPIO输入详解
2024 浏览
11、合宙Air模块Luat开发:通过http协议获取天气信息
2415 浏览
10、合宙Air模块Luat开发:JSON字符串的生成与解析
2273 浏览
8、合宙Air模块Luat开发:基于官方库的二次封装,使串口更加易用
2531 浏览
相关问题
关于二次开发功能上的咨询
1 回答
air202,用mqtt协议连接onenet平台(lua)。
1 回答
请问lua中number类型的浮点数有没有快速的函数将其转换成按字节存储的table变量
1 回答
关于字符串中按位写入数值的问题
1 回答
Lua数据处理问题
2 回答
0 条评论
请先
登录
后评论
陈夏
26 篇文章
作家榜
»
技术销售Delectate
43 文章
陈夏
26 文章
国梁
24 文章
miuser
21 文章
晨旭
20 文章
朱天华
19 文章
金艺
19 文章
杨奉武
18 文章
×
发送私信
发给:
内容:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!