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

# 目录 [点击这里查看所有博文](https://blog.csdn.net/weixin_44570083/article/details/104285283) > 本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的A...

目录

点击这里查看所有博文

本系列博客,理论上适用于合宙的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类型,平时常用的变量基本都有,也可以自行添加其他变量
    1. module(...)
    2. strPara = "str1"
    3. numPara = 1
    4. boolPara = false
    5. 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类型进行了设置和读取。

  1. --必须在这个位置定义PROJECTVERSION变量
  2. --PROJECTascii string类型,可以随便定义,只要不使用,就行
  3. --VERSIONascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
  4. PROJECT = "LED"
  5. VERSION = "0.0.1"
  6. require "sys"
  7. --加载日志功能模块,并且设置日志输出等级
  8. --如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
  9. require "log"
  10. LOG_LEVEL = log.LOGLEVEL_TRACE
  11. require "config"
  12. require "nvm"
  13. local function Test_Task()
  14. while true do
  15. log.info("Test_Task_run")
  16. local num = nvm.get("numPara")
  17. num = num + 1
  18. nvm.set("numPara", num)
  19. log.info("numPara",num)
  20. sys.wait(2000)
  21. end
  22. end
  23. local function user_main()
  24. sys.wait(10000)
  25. nvm.init("config.lua")
  26. nvm.set("strPara", "str2")
  27. nvm.set("boolPara", false)
  28. nvm.set("tablePara", {"item2-1", "item2-2", "item2-3"})
  29. log.info("testNvm.strPara", nvm.get("strPara"))
  30. log.info("testNvm.boolPara", nvm.get("boolPara"))
  31. local tableValue = nvm.get("tablePara")
  32. log.info("testNvm.tablePara", tableValue[1], tableValue[2], tableValue[3])
  33. sys.taskInit(Test_Task)
  34. end
  35. --启动系统框架
  36. sys.taskInit(user_main)
  37. sys.init(0, 0)
  38. sys.run()

三、下载测试程序到开发板

下载时要注意的是必须带上config.lua才能正常使用
在这里插入图片描述
下载完成打开监视端口,读写正常

  1. [2020-04-02 21:51:31.742] [I]-[nvm.set] true strPara str2 nil nil
  2. [2020-04-02 21:51:31.753] [I]-[nvm.set] false boolPara false nil nil
  3. [2020-04-02 21:51:31.757] [I]-[nvm.set] true tablePara table: 06fc3358 nil nil
  4. [2020-04-02 21:51:31.768] [I]-[testNvm.strPara] str2
  5. [2020-04-02 21:51:31.772] [I]-[testNvm.boolPara] false
  6. [2020-04-02 21:51:31.782] [I]-[testNvm.tablePara] item2-1 item2-2 item2-3
  7. [2020-04-02 21:51:31.788] [I]-[Test_Task_run]
  8. [2020-04-02 21:51:31.792] [I]-[nvm.set] true numPara 2 nil nil
  9. [2020-04-02 21:51:31.971] [I]-[numPara] 2
  10. [2020-04-02 21:51:33.943] [I]-[Test_Task_run]
  11. [2020-04-02 21:51:33.947] [I]-[nvm.set] true numPara 3 nil nil
  12. [2020-04-02 21:51:33.953] [I]-[numPara] 3
  13. [2020-04-02 21:51:35.960] [I]-[Test_Task_run]
  14. [2020-04-02 21:51:35.973] [I]-[nvm.set] true numPara 4 nil nil
  15. [2020-04-02 21:51:35.993] [I]-[numPara] 4
  16. [2020-04-02 21:51:37.955] [I]-[Test_Task_run]
  17. [2020-04-02 21:51:37.959] [I]-[nvm.set] true numPara 5 nil nil

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

  • 发表于 2020-04-02 22:17
  • 阅读 ( 2222 )
  • 分类:默认分类

0 条评论

请先 登录 后评论
不写代码的码农
陈夏

26 篇文章

作家榜 »

  1. 技术销售Delectate 43 文章
  2. 陈夏 26 文章
  3. 国梁 24 文章
  4. miuser 21 文章
  5. 晨旭 20 文章
  6. 朱天华 19 文章
  7. 金艺 19 文章
  8. 杨奉武 18 文章