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

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

合宙 模组资料网 2年前 (2021-05-15) 329次浏览 0个评论 扫描二维码
                        <div style="border-top: none; border-right: none; border-left: none; border-image: initial; border-bottom: 1pt solid rgb(238, 238, 238); padding: 0cm 0cm 4pt; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;">

一、概述

            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”),执行的流程图如下:

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

2.2、读参数

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

2.3、写参数

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

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

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万次


转载请注明原文链接:Air系列模块Lua版本nvm功能汇总
喜欢 (0)
发表我的评论
取消评论

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

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

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