通常,应用程序需要可靠地记录事件和小数据项,因此TinyOS提供一种日志形式的记录方式,这种记录方式记录的数据即使在系统崩溃时也不会丢失。日志记录可以是顺序录入(卷满就停止录入)也可以是循环录入(卷满就从该卷的起始地址开始写入)。
TinyOS系统的日志存储抽象具有这些特点:
1)日志是基于记录的,每次调用LogWrite.append命令就创建一条新纪录;
2)节点断电时(崩溃或能量循环),日志只丢失最近的记录;
3)一旦循环日志绕了一圈,日志就覆盖最早的记录。
示例程序PacketParrot(tinyos-2.x/apps/tutorials/PacketParrot/)演示了如何使用LogWrite和LogRead接口记录日志。该应用程序的主要功能是:节点将无线接收到的数据记录到flash中;如果读取失败,则擦除该日志,然后继续接收并记录数据包,如此循环运行。为了便于观察和调试,我们在程序中设定:当日志被擦除时,点亮红色LED灯(Led0);接收到数据包时则点亮黄色LED灯(Led1),成功录入后熄灭;如果数据包被接收但没有被录入(因为日志正在被擦除),黄色LED灯保持点亮状态;在一个能量循环后,如果记录的数据包被取出并发送出去,绿色LED灯(Led2)快速闪烁。下面将对PacketParrot的设计要点和具体操作步骤进行介绍。(www.xing528.com)
(1)使用日志存储使用日志存储的第1步是要确定存储什么样的数据到日志里。PacketParrot程序声明了如下的结构体:
(2)传递缓冲区指针和读取字节数。与配置存储不同,日志存储不需要挂载卷。一个简单的read命令就可以实现日志的读取,LogRead.read命令传递缓冲区指针和读取字节数,代码如下:
(3)检查返回的数据长度。如果LogRead.read命令返回SUCCESS,那LogRead.read Done事件就会马上被触发。在LogRead.readDone事件中,首先检查返回的数据长度是否和预期长度一样。如果一致,可以将该数据无线发送出去;否则,可以认为日志是空的,或已失去了同步,那么日志就需要被擦除,代码如下:
(4)接收数据包并将其中的数据写入flash。接收到来自无线电的数据包,并调用LogWrite.append命令将数据包中的数据写入到flash,具体实现代码如下:
(5)触发LogWrite.appendDone事件如果LogWrite.append返回SUCCESS,就会触发LogWrite.appendDone事件。这个事件返回了日志写入的详情,如缓冲区指针、写入数据的长度、是否有记录丢失(如果是循环缓冲)以及错误提示。如果没有错误发生,数据就在原子性(每条记录不可被分隔开保存)、连续性(前后条的记录是连续的)和耐用性(能经受节点崩溃和重启)的保证下写入到flash,具体实现代码如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。