• 欢迎大家分享资料!前往留言板评论即可!

9、合宙Air模块Luat开发:认识NVS数据管理模块

合宙 模组资料网 7个月前 (05-15) 96次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

目录

点击这里查看所有博文

本系列博客,理论上适用于合宙的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 基本操作有兴趣的自行了解

1.3、NVS数据管理模块

  • NVS是通过config.lua文件进行数据初始化的,这个文件只在第一次运行时有效,需要提前把要存储的键值对放进去才能使用,不能在程序随意添加其他的键值对,只能修改文件中提前写好的
  • para.lua:每次开机初始化时,如果para.lua不存在,则从config.lua复制出一个文件,重命名为para.lua,在程序运行过程中,写参数都是操作这个para.lua
  • 本例程config.lua提前定义了如下几个变量,有string类型、有numble类型、有bool类型、有table类型,平时常用的变量基本都有,也可以自行添加其他变量
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类型进行了设置和读取。

--必须在这个位置定义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才能正常使用
9、合宙Air模块Luat开发:认识NVS数据管理模块
下载完成打开监视端口,读写正常

[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

不会下载的点击这里,进去查看我的第二篇博文2、Air720SL模块Luat开发:第一个Luat的Hello World里面讲了怎么下载
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束


喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址