Air系列模块Lua版本nvm功能汇总

nvm功能模块实现原理

一、概述

            nvm是利用文件实现的一种非易失性参数存储管理模块,掉电后参数不会丢失,典型的应用场景为:小数据量的简单键值对参数。不适合大容量数据的存储管理,如果数据量超过10K,建议直接使用io接口操作文件来管理

      nvm功能模块中,涉及到两个文件和一个表

         两个文件包括“默认配置文件”和“实时参数文件”,下文用config.lua来表示默认配置文件,para.lua来表示实时参数文件:

Ø  config.lua:本地烧录程序时,烧录进模块的一个用户自定义文件,定义了默认的键值对参数结构和内容,例如下图

module(...)

 

strPara = "str1"

numPara = 1

boolPara = false

tablePara = {"item1-1","item1-2","item1-3"}

Ø  para.lua:每次开机初始化时,如果para.lua不存在,则从config.lua复制出一个文件,重命名为para.lua,在程序运行过程中,写参数都是操作这个para.lua

         一个表指的是:para.lua的内存加载表,下文用para_ram_table来表示这个表,每次开机初始化时,会把para.lua文件中的内容加载到para_ram_table,在程序运行过程中,读参数都是直接读取para_ram_table

二、接口实现原理

2.1、初始化

            调用nvm.init("config.lua"),执行的流程图如下:


2.2、读参数

       调用nvm.get(...)或者nvm.gett(...),直接返回para_ram_table中的参数值

2.3、写参数

       调用nvm.set(...)或者nvm.sett(...),执行的流程图如下:


2.4、恢复出厂设置

       调用nvm.restore(),执行的流程如下:

         1、删除para.lua

         2、复制config.lua,重命名为para.lua

         3para.lua文件中的内容加载到内存para_ram_table

2.5、删除参数文件

       调用nvm.remove(),会删除para.lua, 然后用户自行控制重启,重启后自动执行初始化流程

三、常见问题

3.1api文档和demo在哪里

         api文档详见脚本发布包中:script_LuaTask\doc\lib\index.html        modules--->nvm

         demo参考脚本发布包中:script_LuaTask\demo\nvm

3.2nvm适用于什么场景

         nvm每次更新参数,保存到参数文件中时,会把所有参数拼接在一起,然后执行一次全量写文件的动作;此拼接操作消耗内存较多,如果数据量很大,需要的内存就很大,在系统可用内存紧张的情况下,很容易出现内存不足,从而导致参数更新失败,严重情况下还会造成系统重启

         所以说:nvm仅适用于小数据量的简单键值对参数;不适用于大容量数据的存储管理,如果数据量超过10KB【仅仅为经验值,实际能够存储的数据量和系统运行过程中的动态可用内存有关:可用内存越小,允许存储的数据量就越少;可用内存越大,允许存储的数据量就越多,但是也不建议超过10KB】,建议参考fsdemo直接使用io接口操作文件来管理

3.3、远程升级后,para.lua会被自动删除吗

         不会自动删除

         如果需要删除,在升级包下载成功,软件重启之前,主动调用nvm.remove()接口来删除para.lua,重启应用新版本后,para.lua就是新版本config.lua的复制文件了

3.4、本地烧录后,para.lua会被自动删除吗

         本地烧录程序,会格式化文件系统,para.lua属于文件系统中的一个文件,所以会被自动删除

         如果参数需要不受本地烧录的影响,可以保存到模块的sn区,sn区最多可存储64字节的数据,在脚本中使用misc.getSn()misc.setSn(...)可以读写sn区域的数据

3.52G模块使用远程升级时,config.lua的注意事项

Ø  不要删除旧版本的任何参数

Ø  不同版本中,同名参数的参数值数据类型要保持一致

Ø  如果有必要,增加新的参数用于新的功能

         这样做的原因是:2G远程升级后,存在版本回退的概率(参考),但是版本回退并不会自动删除para.lua,回退到旧版本后,如果参数数值类型发生了改变,或者参数不见了(实际上也是数值类型变成了nil),旧版本的代码如果写的不够健壮,很容易引发代码运行异常。例如:

         1.0.0版本的para.lua中有一个keyPara = 1,远程升级到1.0.1版本后,keyPara的数据类型被定义成了string类型,1.0.1版本运行出错,导致版本自动回退到1.0.01.0.0的脚本直接对keyPara的值进行数学运算,就会导致运行异常

3.6nvm操作过程中,掉电会丢失数据吗

         nvm有备份机制,如果掉电时正在写nvm,可能会造成正在写入的参数数据不生效,但是会恢复为上次写入的数据,不会导致数据内容出错。如果掉电时正在读nvm,不会对参数数据造成任何影响

3.7nvm可以操作多少次flash

         nvm通过文件接口写flash,具有擦写均衡机制

         2G模块和4G模的flash可以完全擦写10万次

         假设通过rtos.get_fs_free_size()获取到的文件系统剩余空间为512K字节,nvm参数文件总大小为1K字节,则写512次可以完全擦写一次文件系统剩余空间。总得允许擦写次数理论值就是512*10万次

  • 发表于 2019-08-19 22:55
  • 阅读 ( 3800 )
  • 分类:默认分类

0 条评论

请先 登录 后评论
不写代码的码农
朱天华

软件工程师

19 篇文章

作家榜 »

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