TinyOS系统与nesC程序设计课内实验指导书(9)
2、Cygwin with TinyOS 2.x 3、UltraEdit / EditPlus
四 实验内容和步骤 1、卷
一个卷表具体的写法如下:
本节介绍如何从闪存读/写配置数据。配置数据有以下几个特点:这些数据的大小有限,从几十到几百字节不等;这些值在不同节点平台上是不统一的;这些值有时是未知的,有时又与硬件相关。由于上述特点,在节点重启,重新供电,或是对它重新写程序时,配置数据必须依然存在并且能够重新存储。配置数据包括以下几种:
? 校验 传感器节点的系数校验是在节点出厂时就已经配置好的,这些数据需要在节
点中永久存在。例如一个假想的温度传感器可能会有偏移(offset)和获取(gain)两个数据需要校验,它们必须永久的存储着,这样才能将输出由电压值转换成摄氏度。这些校验数据如下结构:
typedef struct calibration_config_t { int16_t temp_offset; int16_t temp_gain; } calibration_config_t; ? 识别 设备识别信息,像IEEE MAC地址或是TinyOS的TOS_NODE_ID参数。它
们虽然不是由硬件指定的,但是一旦分配了,就得永久的存储起来。 typedef struct radio_config_t { ieee_mac_addr_t mac; uint16_t tos_node_id; } radio_config_t; ? 定位 节点位置数据在编译时是不知道的,只有当部署时才会有用。应用程序可能
会像下面给出的坐标方式存储:
typedef struct coord_config_t { uint16_t x; uint16_t y; uint16_t z; } coord_config_t; ? 传感 传感器采集和处理数据过程中,使用的参数像采样周期,过滤系数和检测阈
值等配置数据可能会进行调整。 typedef struct sense_config_t { uint16_t temp_sample_period_milli; uint16_t temp_ema_alpha_numerator; uint16_t temp_ema_alpha_denominator; uint16_t temp_high_threshold; uint16_t temp_low_threshold; } sense_config_t; 上面介绍了几种配置数据以及为什么要使用这种存储,接下来,我们要看看如何使用 它们。/tinyos-2.x/apps/tutorials/BlinkConfig/ 在程序第一次运行之前,一个卷它不包含任何有用数据。所以,我们的代码需要检测卷的第一次使用并采取合适的措施(事先加载默认值)。类似的,当卷的数据布局改变了(例如,应用程序需要不同的配置变量时),程序也要检测出来并采取相应的动作。因此,我们需要追踪卷的版本号,定义的配置结构包含版本号和灯闪烁周期:
typedef struct config_t { uint16_t version; uint16_t period; } config_t; (1)卷表volumes-stm25p.xml(telosb)信息用于创建一个包含文件(include file)。这个文件是系统自己生成的,但是需要在声明ConfigStorageC组件的配置文件(BlinkConfigAppC.nc)中手动添加一句话: #include \
(2)BlinkConfigC使用了Mount和ConfigStorage接口。
module BlinkConfigC { uses { ... interface ConfigStorage as Config; interface Mount; ... } } (3)这两个接口都是由ConfigStorageC(VOLUME_CONFIGTEST)提供的,这是一个泛型组件。
configuration BlinkConfigAppC { } implementation { components BlinkConfigC as App; components new ConfigStorageC(VOLUME_CONFIGTEST); ... App.Config -> ConfigStorageC.ConfigStorage; App.Mount -> ConfigStorageC.Mount; ... }
(4)在闪存芯片被使用之前,必须先将它挂载(mount)。
event void Boot.booted() { conf.period = DEFAULT_PERIOD; if (call Mount.mount() != SUCCESS) { // Handle failure } } (5)当挂载成功后,接下来需要检查各卷是否有用(valid)。若可用,则读闪存(ConfigStore.read);不可用,则调用Config.commit(该命令也可以将缓存数据刷到闪存里)使它变得可用。
event void Mount.mountDone(error_t error) { if (error == SUCCESS) { if (call Config.valid() == TRUE) { if (call Config.read(CONFIG_ADDR, &conf, sizeof(conf)) != SUCCESS) // Handle failure } else { // Invalid volume. Commit to make valid. call Leds.led1On(); if (call Config.commit() == SUCCESS) { call Leds.led0On(); } else { // Handle failure } } } else{ // Handle failure } } (6)如果读成功,我们检查版本号。若版本号相同,则把配置数据复制到本地变量,并调整它的值;不然,设为默认值。最后,调用Config.write命令。
event void Config.readDone(storage_addr_t addr, void* buf, storage_len_t len, error_t err) __attribute__((noinline)) { if (err == SUCCESS) { memcpy(&conf, buf, len); if (conf.version == CONFIG_VERSION) { conf.period = conf.period/2; conf.period = conf.period > MAX_PERIOD ? MAX_PERIOD : conf.period; conf.period = conf.period < MIN_PERIOD ? MAX_PERIOD : conf.period; } else { // Version mismatch. Restore default. call Leds.led1On(); conf.version = CONFIG_VERSION; conf.period = DEFAULT_PERIOD; } call Leds.led0On(); call Config.write(CONFIG_ADDR, &conf, sizeof(conf)); } else { // Handle failure. } }
(7)在Config.write之后,再用Config.commit来确保数据写到闪存中。 event void Config.writeDone(storage_addr_t addr, void *buf, storage_len_t len, error_t err) { // Verify addr and len if (err == SUCCESS) { if (call Config.commit() != SUCCESS) { // Handle failure } } else { // Handle failure } } (8)安装程序到节点,观察实验现象。
(9)将节点拔下后重新插上供电,观察实验现象。 (10)重复(9),观察实验现象。
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(log …… 此处隐藏:3041字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [政务民生]2013年公共基础知识热点问题(七)
- [政务民生]检验检测机构资质认定评审准则及释义20
- [政务民生]关于印发重庆市房屋建筑和市政基础设施
- [政务民生]1、隧道洞身开挖支护施工技术交底书
- [政务民生]2015年山东省17地市中考语文试题分类汇
- [政务民生]2-高级会计师资格考试和评审流程图
- [政务民生]2018版中国清分机行业发展分析及前景策
- [政务民生]新课改高中政治探究
- [政务民生]2018-2024年中国新型组合房屋行业投资
- [政务民生]2015年上海市春季高考数学模拟试卷五
- [政务民生]灌砂法及环刀法测压实度(带计算过程)
- [政务民生]运筹学实验2求解非线性规划
- [政务民生]劝学、逍遥游默写(教师卷)
- [政务民生]《运筹学》 - 期末考试 - 试卷A - 答案
- [政务民生]八年级英语下册 Module 6 Hobbies测试
- [政务民生]2019年宪法知识竞赛试题库100题(含答
- [政务民生]自动化英文文献翻译
- [政务民生]公文格式实施细则
- [政务民生]高一地理上册课堂跟踪练习题6
- [政务民生]会计继续教育习题及答案
- 第三章 无约束最优化方法
- 泛读教程第三册答案
- 魏晋南北朝文学
- 幂的运算复习题
- 城市环境问题的成因与治理策略_以社会
- 钢结构行业产业链及竞争分析研究
- 新型热塑性弹性体增韧聚丙烯的研究
- 中国旅游地理B卷试题及答案
- (苏教版)五年级数学上册第三单元测试卷
- 不稳定性心绞痛诊断与治疗
- 俞氏国际后勤职能部门绩效考核办法
- GB7258-2017新标准考试题含答案
- 小学生汉字听写比赛活动方案
- 1.3《平抛运动》学案 教科版必修2
- 2011香港特别行政区公务员考试复习资料
- 考虑水力条件变化的城市给水管网可靠性
- 表面活性剂在油田开发和生产中的应用
- ITT内部培训资料-FI端吸泵的介绍
- 文明守纪,从我做起学生发言稿
- 初中读《聊斋志异》心得体会800字范文




