教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

TinyOS系统与nesC程序设计课内实验指导书(4)

来源:网络收集 时间:2026-07-10
导读: 实验三:TinyOS任务及应用举例 一 实验目的 1、 了解TinyOS两层调度策略:任务和硬件事件句柄。 2、 掌握任务(Task)的建立、提交及其作用。 3、 掌握nesC语法中的分相操作(split-phase operation)。 4、 理解Bl

实验三:TinyOS任务及应用举例

一 实验目的

1、 了解TinyOS两层调度策略:任务和硬件事件句柄。 2、 掌握任务(Task)的建立、提交及其作用。

3、 掌握nesC语法中的分相操作(split-phase operation)。 4、 理解BlinkTask应用程序。

二 实验原理

1、任务(Task)

TinyOS 提供任务和硬件事件句柄组成的两层调度策略。关键字 async 声明了可被硬件事件句柄执行的命令或事件。这意味着它可以在任何时候执行(可能会抢占其它代码的执行)。因此,用 async 声明的命令和事件所做的工作应该做尽量少,且要快速完成。此外,还得注意被异步命令或事件访问的数据可能存在的数据竞争。任务则被用来处理一些较长时间的操作,例如:后台数据处理,但任务可以被硬件事件句柄抢占。 一个任务可以用以下语法在你的实现模块中声明:

task void taskname() { //…… }

其中,taskname 是程序员任意指定的任务的标识,也就是“函数名”。一个任务的返回值类型必须是void,并且不能有任何参数。而向操作系统提交任务则可以用以下语法:

post taskname();

一个任务可以在命令、事件或其它任务内部向操作系统提交。

post 操作把任务放置到一个以先进先出为处理方式的内部任务队列中去。当一个任务开 始执行的时候,只有它运行结束,下一个任务才能开始运行;因此,一个任务不应该占用或阻塞太长时间。任务之间不可以互相抢占,但是会被硬件事件句柄抢占。如果你的任务需要执行一系列长时间的操作,最好把任务分成几个而不是使用一个大的任务。 2、分相(split-phase)操作

在TinyOS中每一个长时间运行的操作都是分相的。在阻塞系统中,当一个调用长时间运行的操作时,只有操作完成时调用才会返回;而在分相系统中,调用会立即返回,当操作完成会发出callback。

分相操作相对于顺序代码有些复杂,但他可以使操作并行并且节省内存。Timer.StartOneShot就是一个分相调用的例子。

阻塞(Blocking) 分相(Split-Phase)

if (send() == SUCCESS) { sendCount++; } // start phase send(); //completion phase void sendDone(error_t err) { if (err == SUCCESS) { sendCount++; } }

三 实验环境

1、JDK1.6 for windows 2、Cygwin with TinyOS 2.x 3、UltraEdit / EditPlus

四 实验内容和步骤

(1) 进入tmp文件夹并创建文件夹,取名BlinkTask,进入这个文件夹。

cd /tmp

mkdir BlinkTask cd BlinkTask

(2) 把Blink文件夹里的所有文件复制到BlinkTask中。

cp –r /opt/tinyos-2.x/apps/Blink/* /tmp/

(3) 现给程序设置一个较长的计算任务。用UltraEdit打开模块文件BlinkC.nc,并修改

如下:

#include \

module BlinkC {

uses interface Timer as Timer0; uses interface Timer as Timer1; uses interface Timer as Timer2; uses interface Leds; uses interface Boot;

}

implementation {

event void Boot.booted() {

call Timer0.startPeriodic( 250 ); call Timer1.startPeriodic( 500 ); call Timer2.startPeriodic( 1000 ); }

event void Timer0.fired() { uint32_t i;

for (i = 0; i < 400001; i++) { call Leds.led0Toggle(); } }

event void Timer1.fired() {

call Leds.led1Toggle(); }

event void Timer2.fired() {

call Leds.led2Toggle(); } }

(4) 编译程序并把它下载到节点观察三盏灯情况,记录结果。若第一盏灯没有闪烁,则

将值改成20001,100001再观察结果。

(5)一个长的计算操作会一直占用CPU,从而阻塞其他操作的执行。所以,我们需要

使用建立任务(Task)任务的方法来解决上述问题,重新修改程序。 implementation{ …

task void computeTask() { uint32_t i;

for (i = 0; i < 400001; i++) {} }

event void Timer0.fired() { call Leds.led0Toggle(); post computeTask(); } …

}

(6)编译、安装程序,观察记录结果。若第一盏灯仍然没有闪烁(想想为什么?),则

将代码再次修改如下: uint32_t i;

task void computeTask() { uint32_t start = i;

for (;i < start + 10000 && i < 400001; i++) {} if (i >= 400000) { i = 0; } else {

post computeTask(); } }

(7)再次编译并安装程序,观察记录结果。 (8)编写实验报告

五 实验报告要求

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

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

实验四:节点间的无线通信

一 实验目的

1、 了解TinyOS消息缓冲抽象—message_t。

2、 掌握用于抽象底层通信服务的基本通信接口名称及它们所实现的功能。 3、 掌握活动消息(AM)接口。 4、 掌握基本通信组件。

5、 理解BlinkToRadio程序代码,实现节点间的无线通信。

二 实验原理

1、message_t:TinyOS的消息缓冲

(1)TinyOS提供了许多接口去抽象底层通信服务,所有的这些接口以及许多提供这些接口的组件使用共同的消息缓冲抽象:message_t(底层通信数据的结构),用nesC结构体实现。

(2)message_t结构: typedef nx_struct message_t { nx_uint8_t header[sizeof(message_header_t)]; nx_uint8_t data[TOSH_DATA_LENGTH]; nx_uint8_t footer[sizeof(message_footer_t)]; nx_uint8_t metadata[sizeof(message_metadata_t)]; } message_t; 2、通信接口与组件 ? 基本通信接口:

(1)Packet:提供对message_t的基本访问

a. 清除消息内容(命令)

b. 得到有效载荷的长度(命令)

c. 得到指向有效载荷地址的指针(命令) (2)Send:提供与地址无关的发送接口

a. 发送消息内容(命令)

b. 取消挂起消息的发送(命令) c. 消息是否发送成功(事件) d. 得到有效载荷的长度(函数)

e. 得到指向有效载荷地址的指针(函数) (3)Receive:提供基本消息的接收接口

a. 接收消息(事件)

b. 得到有效载荷的长度(命令)

c. 得到指向有效载荷地址的指针(命令)

(4)PacketAcknowledgements:为每个包的请求确认提供机制 (5)RadioTimeStaming:提供时间戳 ? 活动消息接口

(1)AM层次实现了对radio的多路访问。“AM tpye”涉及到多路复用的领域。 (2)支持AM服务的接口:

…… 此处隐藏:1591字,全部文档内容请下载后查看。喜欢就下载吧 ……
TinyOS系统与nesC程序设计课内实验指导书(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/447636.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)