首页 理论教育 分析BlinkConfig例子程序的设计要点和具体的操作步骤

分析BlinkConfig例子程序的设计要点和具体的操作步骤

时间:2023-06-28 理论教育 版权反馈
【摘要】:配置数据是指用于配置节点属性的一组参数。本节主要介绍配置数据如何保存以及如何从存储中读取。在很多场合,完整保存配置数据的能力是非常必要的。对于传感器网络节点而言,配置数据中一个很重要的部分是刻度校正。BlinkConfig应用中配置数据的字段包括卷的版本和读取周期。当调用ConfigStore.write命令并触发Config.writeDone事件时,并不能保证数据一定写入了flash。

分析BlinkConfig例子程序的设计要点和具体的操作步骤

配置数据是指用于配置节点属性的一组参数。它们的字节数是不确定的,从几十字节到几百字节,一般都属于小数据对象。另外,它们的值也不确定,在各个节点可能都不一样,甚至是未知的。本节主要介绍配置数据如何保存以及如何从存储中读取。

配置数据要求必须能够在复位、能量循环(关闭电源,再重开电源,算作一个能量循环)或者重编程时保存下来。在很多场合,完整保存配置数据的能力是非常必要的。

对于传感器网络节点而言,配置数据中一个很重要的部分是刻度校正。一般情况下,传感器的校准系数在节点出厂时就已配置好,并存储下来,所以它们不会在节点掉电或者重编程时丢失。例如,温度传感器利用校准系数将输出电压信号转换成直观的温度数据。传感器校准系数的结构定义代码可参考如下:

身份信息,即设备辨认信息,也是配置数据的重要组成部分。如IEEE兼容的MAC地址或TinyOS的TOSNODE_ID参数在各个节点都是不一样的,一旦被分配到节点上,这些值就会被保存,即使碰到复位、能量循环和重编程,也不会丢失。其结构定义代码下:

除了校正信息和身份信息之外,配置数据中一般还包括位置信息和传感参数等。节点的位置数据可能在编译时是未知的,只有在部署节点时才确定。例如,一个应用程序可以按下面的数据形式存储节点的坐标信息。

传感参数与信号检测和发送有关的参数,如采样周期、滤波系数以及可调的报警值。这些配置数据的结构形式如下:

接下来我们将用一个简单的例子程序来说明如何存储和读取配置数据,这个示例程序的功能是节点周期性地从flash中读出配置数据,处理后再写回flash。

卷在第1次使用之前不包含任何有效数据。因此,应当首先检测卷是否是初次使用,并作出适当的行为(例如预加载默认值)。同样,当卷中的数据发生变化时(例如应用程序需要新的或不同的配置变量),应用程序应当检测到变更,并作出相应的响应(例如擦写卷,并重新加载默认值)。类似这些情况,建议跟踪卷的版本。为此,在配置数据的结构中,引入了版本控制变量。BlinkConfig应用中配置数据的字段包括卷的版本和读取周期。其结构形式如下:

下面将分析BlinkConfig例子程序的设计要点和具体的操作步骤:

创建volumes-CHIPNAME.xml文件,即建立卷表,并保存在应用程序所在目录。注意,CHIPNAME是目标平台上的flash芯片名字。例如,Telos平台上的flash是stm25p,Micaz平台的flash则是at45db。卷表的具体内容如下:(www.xing528.com)

编译工具会利用该卷表自动创建一个StorageVolumes.h头文件。然而,在有Config StorageC组件声明的配件(如BlinkConfigAppC组件)里,需要手动添加该头文件:

(2)在BlinkConfigC模块的规范说明里,声明Mount接口和ConfigStorage接口。注意,ConfigStorage接口被重命名为Config接口。其代码如下:

(3)每个接口必须绑定到提供该接口的组件。相应的代码如下:

(4)在使用flash存储芯片前,必须先挂载卷。在Boot.booted事件处理函数中调用Mount.mount命令,启动挂载,其代码如下:

(5)卷挂载成功,就会触发Mount.mountDone事件。接下来,需要检查挂载的卷是否有效。如果卷有效,使用Config.read命令读取卷中的数据即可。否则,调用Config.commit命令使其有效(这个命令也可用来书信缓冲数据,类似于UNIX系统中调用fsync命令可以刷新写入到磁盘上的缓冲),检查挂载的卷的代码如下:

(6)Config.read命令执行成功,就会触发Config.readDone事件。这时,先检查是否成功读取了卷中的内容,如果数据读取成功,再检查版本号。如果版本号与预期的一样,就可以复制配置数据到本地的配置变量,并调节变量period的值;如果版本号不对,就将配置变量设为默认值。最后,调用Config.write函数将新的配置变量写回到flash存储,具体实现代码如下:

(7)调用Config.commit命令。当调用ConfigStore.write命令并触发Config.writeDone事件时,并不能保证数据一定写入了flash。为了确保数据被保存到flash,就要调用Config.commit命令,调用Config.commit命令的代码如下:

(8)将数据写入flash中,当Config.commitDone事件触发时,数据就将被永久地写入到flash中,并能够存活一个能量循环,具体实现代码如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈