针对nvm demo的特殊说明

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

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

1
2
3
4
5
6
7
8
9
module(...) --必须!绝对不可删除

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

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

1
2
3
4
5
6
7
8
9
require”nvm”  --必须!引用nvm.lua
requireconfig--必须!保存的文件

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错误或者不存在,则会出现如下提示:

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

1
2
3
4
5
module(...)

devStart = false
bootNum = 0

###main.lua

1
2
3
4
5
6
7
8
9
PROJECT = "NVM"
VERSION = "2.0.0"

require "sys"
require "testNvm"

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

###testNvm.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

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

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

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

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

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

#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保存的参数 -> 将参数保存在配置文件 -> 走正常开机流程,连接服务器等

上次更新 2021-01-28