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
3、para.lua文件中的内容加载到内存para_ram_table中
2.5、删除参数文件
调用nvm.remove(),会删除para.lua, 然后用户自行控制重启,重启后自动执行初始化流程
三、常见问题
3.1、api文档和demo在哪里
api文档详见脚本发布包中:script_LuaTask\doc\lib\index.html modules--->nvm
demo参考脚本发布包中:script_LuaTask\demo\nvm
3.2、nvm适用于什么场景
nvm每次更新参数,保存到参数文件中时,会把所有参数拼接在一起,然后执行一次全量写文件的动作;此拼接操作消耗内存较多,如果数据量很大,需要的内存就很大,在系统可用内存紧张的情况下,很容易出现内存不足,从而导致参数更新失败,严重情况下还会造成系统重启
所以说:nvm仅适用于小数据量的简单键值对参数;不适用于大容量数据的存储管理,如果数据量超过10KB【仅仅为经验值,实际能够存储的数据量和系统运行过程中的动态可用内存有关:可用内存越小,允许存储的数据量就越少;可用内存越大,允许存储的数据量就越多,但是也不建议超过10KB】,建议参考fs的demo直接使用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.5、2G模块使用远程升级时,config.lua的注意事项
Ø 不要删除旧版本的任何参数
Ø 不同版本中,同名参数的参数值数据类型要保持一致
Ø 如果有必要,增加新的参数用于新的功能
这样做的原因是:2G远程升级后,存在版本回退的概率(参考),但是版本回退并不会自动删除para.lua,回退到旧版本后,如果参数数值类型发生了改变,或者参数不见了(实际上也是数值类型变成了nil),旧版本的代码如果写的不够健壮,很容易引发代码运行异常。例如:
1.0.0版本的para.lua中有一个keyPara = 1,远程升级到1.0.1版本后,keyPara的数据类型被定义成了string类型,1.0.1版本运行出错,导致版本自动回退到1.0.0,1.0.0的脚本直接对keyPara的值进行数学运算,就会导致运行异常
3.6、nvm操作过程中,掉电会丢失数据吗
nvm有备份机制,如果掉电时正在写nvm,可能会造成正在写入的参数数据不生效,但是会恢复为上次写入的数据,不会导致数据内容出错。如果掉电时正在读nvm,不会对参数数据造成任何影响
3.7、nvm可以操作多少次flash
nvm通过文件接口写flash,具有擦写均衡机制
2G模块和4G模的flash可以完全擦写10万次
假设通过rtos.get_fs_free_size()获取到的文件系统剩余空间为512K字节,nvm参数文件总大小为1K字节,则写512次可以完全擦写一次文件系统剩余空间。总得允许擦写次数理论值就是512*10万次
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!