对于通信模块的二次开发,flash的读写是一个必不可少的功能。而普通的io操作较为复杂,所以提供了近似ini文件的操作方式,即nvm demo。
但是,很多开发者并不认真读代码,也不读文档,所以实际操作中会遇到各种问题,反而认为是代码有问题,到处抱怨。所以特书此文,以正视听。
#初识
首先,看一下config.lua的文件结构:
1 | module(...) --必须!绝对不可删除 |
接下来,我们来看一下nvm的用法。示例代码:
1 | require”nvm” --必须!引用nvm.lua |
请注意,如果config.lua中,nvm.get请求的key错误或者不存在,则会出现如下提示:
#Demo
由于demo的演示不够具体,所以在此给出一个相对完整的代码,帮助开发者更好的了解并运用。代码如下(字符编码为utf-8):
###config.lua
1 | module(...) |
###main.lua
1 | PROJECT = "NVM" |
###testNvm.lua
1 | module(...,package.seeall) |
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保存的参数 -> 将参数保存在配置文件 -> 走正常开机流程,连接服务器等