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

针对nvm demo的特殊说明

合宙 模组资料网 2年前 (2021-05-15) 333次浏览 0个评论 扫描二维码

对于通信模块的二次开发,flash的读写是一个必不可少的功能。而普通的io操作较为复杂,所以提供了近似ini文件的操作方式,即nvm demo。

但是,很多开发者并不认真读代码,也不读文档,所以实际操作中会遇到各种问题,反而认为是代码有问题,到处抱怨。所以特书此文,以正视听
#初识
首先,看一下config.lua的文件结构:

module(...) --必须!绝对不可删除

--格式为key = value
--key需要符合Lua的变量命名规范,即不可数字开头等;
--value可以是Boolean、Str、Int、Table,但是不可为空;
strPara = "str1"
numPara = 1
boolPara = false
tablePara = {"item1-1","item1-2","item1-3"}

接下来,我们来看一下nvm的用法。示例代码:

require”nvm”  --必须!引用nvm.lua
require”config” --必须!保存的文件

nvm.init("config.lua")  --必须!初始化并使用config.lua作为配置文件进行读写,任何情况下都不可删除!

nvm.get(“test”) --读取config.lua中test的值。config.lua中,”test”对应的key=value 都不可为空,且key不可出现拼写错误
nvm.set(“test”, “abcd”) –设置config.lua中test的值位“abcd”
nvm.restore()   --将config.lua恢复默认值

请注意,如果config.lua中,nvm.get请求的key错误或者不存在,则会出现如下提示:
针对nvm demo的特殊说明

#Demo
由于demo的演示不够具体,所以在此给出一个相对完整的代码,帮助开发者更好的了解并运用。代码如下(字符编码为utf-8):
###config.lua

module(...)

devStart = false
bootNum = 0

针对nvm demo的特殊说明

###main.lua

PROJECT = "NVM"
VERSION = "2.0.0"

require "sys"
require "testNvm"

sys.init(0, 0)
sys.run()

针对nvm demo的特殊说明

###testNvm.lua

module(...,package.seeall)

require"config"
require"nvm"

nvm.init("config.lua")
nvm.set("bootNum", nvm.get("bootNum") + 1)  --开机次数+1


if nvm.get("devStart") == false then
    print("第一次上电开机")
    nvm.set("devStart", true)
    print("开机信息已经记录,5s后重启")
    sys.timerStart(rtos.restart, 5000)
elseif nvm.get("bootNum") == 2 then
    print("第二次上电开机")
    nvm.restore()
    print("已经恢复出厂设置,5s后重启")
    sys.timerStart(rtos.restart, 5000)
end

针对nvm demo的特殊说明

Demo的流程是:开机后,修改devStart标识,同时增加开机次数计数。并根据标识符和开机次数判断是恢复出厂设置。

下载到模块运行一下看看效果如何:

针对nvm demo的特殊说明

第一次开机,开机次数+1,修改devStart,然后重启;

针对nvm demo的特殊说明

第二次开机,开机次数+1,恢复配置文件为默认设置,然后重启;

针对nvm demo的特殊说明

第三次开机,因为配置文件已经恢复成默认值,所以和第一次开机无异。

#OTA

nvm在初始化config.lua时,自动生成多重备份文件。日常的读取和写入操作,也是对备份文件进行操作,而不涉及config.lua文件本身。所以,即使是读写中,出现意外掉电的情况,也不会影响数据的准确性,更不会出现读写失败的情况。

因此,需要注意的是,远程升级时,升级包的config.lua文件即使已经更新,也不会影响到模块存储的“备份文件”。所以,如果需要启用升级包内新版的config.lua,则需要修改update.lua,在升级包下载成功后,重启前调用nvm.remove(),删掉nvm保存的备份文件。

如此一来,升级重启后的开机过程中,执行nvm.init(“config.lua”)时,会用新的config.lua文件自动覆盖参数文件,这样就ok了。

有的开发者可能有疑问,如果删掉备份文件,但是新的config.lua都是默认值,保存的参数岂不是都丢失了?这个倒是不用担心,可以把他们保存在模块的sn,它最长支持64字节。sn保存的内容,不受工具下载、远程升级的影响。

如此一来,完整的流程如下:
下载升级包 -> 下载成功 -> 调用misc.setSn(“test”)将现模块的重要参数存储在sn -> 调用 nvm.remove() 删掉备份文件 -> 重启模块 -> 远程升级成功 -> 调用nvm.init(“config.lua) 初始化 -> 调用misc.getSn()读取sn保存的参数 -> 将参数保存在配置文件 -> 走正常开机流程,连接服务器等


转载请注明原文链接:针对nvm demo的特殊说明
喜欢 (0)
发表我的评论
取消评论

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

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

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