TinyOS系统与nesC程序设计课内实验指导书 联系客服

发布时间 : 星期二 文章TinyOS系统与nesC程序设计课内实验指导书更新完毕开始阅读

3、日志数据 可靠的记录事件或是小的数据项是一个普通应用程序的要求。当系统崩溃时,那些数据不应被丢失。我们可以线性的记录这些数据(当卷满时停止记录)或是循环的记录它们(当卷满时,把最不常用的数据项覆盖掉)。 TinyOS中LogStorage抽象支持这些需求。演示程序PacketParrot,向大家展示了如何使用LogWrite和LogRead抽象。它先将接收到的数据包写入日志,当下一个电力循环(power cycle)开始时,发送记录到日志的数据包,同时擦除日志。 (1)首先定义我们想要存储的日志结构:

typedef nx_struct logentry_t { nx_uint8_t len; message_t msg; } logentry_t; (2)与Config存储不同,Log存储不要求在应用程序中明确地挂载卷。一个简单的读命令就足够了。

event void AMControl.startDone(error_t err) { if (err == SUCCESS) { if (call LogRead.read(&m_entry, sizeof(logentry_t)) != SUCCESS) { // Handle error } } else { call AMControl.start(); } } (3)读出的数据长度如果与期望的相同,我们就把数据发送出去;如果不同,我们假设此日志是空的或是没有同步,将其擦除。

event void LogRead.readDone(void* buf, storage_len_t len, error_t err) { if ( (len == sizeof(logentry_t)) && (buf == &m_entry) ) { call Send.send(&m_entry.msg, m_entry.len); call Leds.led1On(); } else { if (call LogWrite.erase() != SUCCESS) { // Handle error. } call Leds.led0On(); } } (4)在接收事件中,我们把接收到的数据包及其长度记录到本地结构体中,然后调用LogWrite.append。 event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len){ call Leds.led2On(); if (!m_busy) { m_busy = TRUE; m_entry.len = len; m_entry.msg = *msg; if (call LogWrite.append(&m_entry, sizeof(logentry_t)) != SUCCESS) { m_busy = FALSE; } } return msg; } (5)在LogWrite.appendDone事件中,返回了源缓存地址,写数据的长度,以及数据是否有丢失,错误代码。若没有错误发生,则把要写的数据包原子的、连续的、一致的写入闪存。

event void LogWrite.appendDone(void* buf, storage_len_t len, bool recordsLost, error_t err) { m_busy = FALSE; call Leds.led2Off(); } 3、存储大的对象 块(block)存储常常用来存储大的数据对象,这些数据对象不能很好的在RAM中存放。Block是一个低层的系统接口,在使用它的时候需要非常小心。因为它是一个写一次模型,重新写需要耗费很长的时间。 具体可以到tinyos-2.x/apps/tests/storage/Blockj目录下,查看使用Block抽象的演示程序。 五 实验报告要求

①实验名称 ②实验内容说明 ③程序源代码

④实验步骤,实验中出现的问题,观察到的结果 ⑤实验总结