




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、TinyOS系统与nesC程序设计课内实验指导书一、 课内实验项目一览表序号实验项目学时类型每组人数基本教学要求1编程环境的建立221熟悉TinyOS安装过程,了解系统环境2BlinkTinyOS编程的“Hello World”221通过Blink程序,理解TinyOS编程结构3TinyOS任务及应用举例221通过实验了解任务的建立、调度及其作用4节点间的无线通信221通过实验了解和使用基本通信接口和组件5节点与PC的通信221了解数据包源和串口通信6传感221了解节点如何从环境中采集数据并显示在PC上 7存储221了解TinyOS上永久数据存储方法及应用8多线程程序设计221了解线程工作原理
2、和实现方法二、详细实验指导书实验一:编程环境建立一 实验目的1、掌握Java基本开发环境(JDK)的安装和配置方法。2、掌握cygwin程序的安装,在建立windows下类似Unix环境。3、 掌握Linux基本命令及cygwin下安装TinyOS的方法。二 实验原理无三 实验环境1、运行Windows的PC机,能够连接Internet2、PC机配置要求:CPU最低CR 1GHz,建议P4 2.0以上内存最低256M,建议512M以上硬盘容量10G以上,cygwin安装盘符大于2 G操作系统Windows 2000 系列、Windows XP 系列四 实验内容和步骤1、 java jdk安装首
3、先,我们安装JAVA 开发工具JAVA JDK 1.6 官方下载地址:/javase/downloads/. 安装过程只需下一步下一步便可,默认安装路径是C:Program FilesJava上图是TinyOS 2.0.2 安装时截取的JAVA JDK1.5的图,只供参考。然后,我们需要设置电脑的环境变量,需要新建两个环境变量,以便使用JDK具体过程如下:右击我的电脑属性高级环境变量先新建或编辑系统变量:变量名(N):JAVA_HOME 变量值(V):JDK安装的路径,其默认的路径为:C:Program FilesJavajdk1.6.0_10变量名(N):
4、CLASSPATH变量值(V):.;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar;%JAVA_HOME%bin;%JAVA_HOME%jrebin; 在系统变量(S)栏选中变量为Path的选项,点编辑在变量值(V)的末尾添加:;%JAVA_HOME%bin; ;%JAVA_HOME%jrebin;然后新建或编辑用户变量:同样再设置一个JAVA_HOME,变量值也一样。在用户变量的PATH中添加:;%JAVA_HOME%bin:$PATH;%JAVA_HOME%jrebin:$PATH;这样,我们的环境变量已经设置完毕了。我们可以编个JAVA小程序简单
5、地测试一下:打开记事本,输入下面这个小程序,另存为HelloWorld.java(注意扩展名是java,不是txt文本文件)。public class HelloWorld public static void main(String args) System.out.println(Hello, World!); 运行cmd,到HelloWorld.java所在目录,执行命令:javac HelloWorld.java javaHelloWorld如果能正确输出Hello, World! 说明环境变量设置成功。2、 cygwin软件平台安装我们需要安装Cygwin这个软件来虚拟Linux平台
6、,运行TinyOS-2.X。下载地址1:. 下载地址2:rmatik.uni-freiburg.de/people/aslam/cygwin-files.zip安装时,最好先将安装包下载到本地,然后选择Install from Local Directory安装。紧接着需要设置安装目录,默认是C:cygwin然后是选择下载的本地安装包源文件的文件路径安装包策略选择:“Keep”、“Prev”、“Curr”、“Exp”等等选项Keep, 意思就是说保持目前已经安装的版本不动,不替换你目前的版本。升级时比较方便。Prev,意思是说安装上一个
7、版本。Curr,意思就是说把最新的版本下载下来安装,第一次安装时默认选项View按钮是用来选择显示方式的在选择安装包时候,一般默认,点下一步即可。最后我们可以通过桌面上添加Cygwin的快捷方式或者运行安装目录下的cwgwin.bat文件,来运行该软件平台。第一次运行Cygwin会稍微慢点。Cygwin启动界面如下图:下面我们可以先来尝试一些简单的Linux命令:help: 帮助命令。例如 ls -help 。显示ls命令使用说明。pwd:显示所在路径。rpm qa :查看已经安装的程序,刚安装的Cygwin是没有安装任何系统的。 rpm ivh 文件名:rpm文件安装。rpm ignoreo
8、s force或者rpm -ivh -force -ignoreos:忽略错误,安装rpm文件-ignoreos选项是用于忽略cygwin的版本号rpm uvh 文件名:rpm文件升级安装。cd:切换目录 比如:cd /tmp 进入tmp文件。cp:cp -R Blink BlinkSingle:复制文件或目录,复制Blink为BlinkSingle。ls:显示当前目录下的文件。whoami:显示登陆Windows帐号uname a: 显示版本信息echo $PATH: 显示执行程式的搜索路径ps ax: 显示process list ,显示目前有哪些process 执行ctrl-D或exit
9、 或logout:结束bash 视窗motelist 查询当前设备,Yang:命令不可用3、 本地编译器安装当你给低功耗微控制器编译代码时,你需要可以产生适当的代码的编译器。如果你使用mica系列无线传感器节点,你需要的AVR工具;如果你使用的是telos系列节点,则需要的MSP430工具。先以AVR为例,在根目录下创建文件夹avr,把下面所有rpm文件放在这个文件夹里。l avr-binutils-2.17tinyos-3.cygwin.i386.rpm :/dist-2.1.0/tools/windows/avr-binutils-2.17tinyo
10、s-3.cygwin.i386.rpml avr-gcc-4.1.2-1.cygwin.i386.rpm :/dist-2.1.0/tools/windows/avr-gcc-4.1.2-1.cygwin.i386.rpml avr-libc-1.4.7-1.cygwin.i386.rpm :/dist-2.1.0/tools/windows/avr-libc-1.4.7-1.cygwin.i386.rpml avarice-2.4-1.cygwin.i386.rpm :/d
11、ist-2.1.0/tools/windows/avarice-2.4-1.cygwin.i386.rpml avr-insight-6.3-1.cygwin.i386.rpm :/dist-2.1.0/tools/windows/avr-insight-6.3-1.cygwin.i386.rpml avrdude-tinyos-5.6cvs-1.cygwin.i386.rpm :/dist-2.1.0/tools/windows/avrdude-tinyos-5.6cvs-1.cygwin.i386.rpm用cd
12、命令进入该文件夹目录,输入:rpm -ivh -ignoreos rpmname.rpm 可以选择安装rpmname这个rpm包。如果碰到missing /bin/sh的错误信息,则rpm ivh -ignoreos -force -nodeps rpmname.rpm最简单的方法是,同时安装这个文件夹下所有的rpm包,输入命令:$ cd /avr$ rpm -ivh -ignoreos -force -nodeps *.rpmMSP430工具包的安装方法也是一样的。其rpm包如下:l msp430tools-base-0.1-20050607.cygwin.i386.rpm :http:/w
13、/dist-2.0.0/tools/windows/msp430tools-base-0.1-20050607.cygwin.i386.rpml msp430tools-python-tools-1.0-1.cygwin.noarch.rpm :/dist-2.0.0/tools/windows/msp430tools-python-tools-1.0-1.cygwin.noarch.rpml msp430tools-binutils-2.16-20050607.cygwin.i386.rpm :http:/www.tinyos
14、.net/dist-2.0.0/tools/windows/msp430tools-binutils-2.16-20050607.cygwin.i386.rpml msp430tools-gcc-3.2.3-20050607.cygwin.i386.rpm :/dist-2.0.0/tools/windows/msp430tools-gcc-3.2.3-20050607.cygwin.i386.rpml msp430tools-libc-20080808-1.cygwin.i386.rpm :/dist-2.1.0
15、/tools/windows/msp430tools-libc-20080808-1.cygwin.i386.rpm在根目录下新建的MSP430文件夹,将所有rpm下载后全部放到这里,运行:$ cd /msp430$ rpm -ivh -ignoreos -force -nodeps *.rpm安装成功。(若提示安装不了,可以先安装第四步的TinyOS工具包再回头安装这里)。4、 TinyOS工具包安装下载rpm包:l Nesc :/dist-2.1.0/tinyos/windows/nesc-1.3.0-1.cygwin.i386.rpml deput
16、y :/dist-2.1.0/tinyos/windows/tinyos-deputy-1.1-1.cygwin.i386.rpml tinyos-tools :/dist-2.1.0/tinyos/windows/tinyos-tools-1.3.0-1.cygwin.i386.rpm安装方法同上面一样。将rpm下载后全部放到一个根目录下新建的tinyos_tools文件夹,运行:$ cd /tinyos_tools$ rpm -ivh -ignoreos *.rpm注:在win7或者是vista下安装nesC时
17、可能会报错如下:unpacking of archive failed on file /usr: cpio: chmod failed - Permission denied解决方法:运行cygwim的时候右键选择 “以管理员身份运行”5、 TinyOS 2.x安装下载rpm包:/dist-2.1.0/tinyos/windows/tinyos-2.1.0-2.cygwin.noarch.rpm安装方法同上面一样$ cd /tinyosrpm -ivh -ignoreos *.rpm安装成功。6、 设置TinyOS2.x环境变量2011-11-27 下
18、午到此Environment VariableWindowsLinuxTOSROOT/opt/tinyos-2.xsame as in CygwinTOSDIR$TOSROOT/tossame as in CygwinCLASSPATHC:cygwinopttinyos-2.xsupportsdkjavatinyos.jar;.$TOSROOT/support/sdk/java/tinyos.jar:.MAKERULES$TOSROOT/support/make/Makerulessame as in CygwinPATH/opt/msp430/bin:/opt/jflashmm:$PATHs
19、ame as in Cygwin注:只有在使用msp430平台时才有必要设置PATH变量用UltraEdit创建C:cygwinetcprofile.dtinyos.sh,输入以下内容:(使用UNIX换行符-LF保存,这一步很关键,字符是有区别的)(配置文件已经写好了)# script for profile.d for bash shells, adjusted for each users# installation by substituting /opt for the actual tinyos tree# installation point.export TOSROOT=/opt
20、/tinyos-2.xexport TOSDIR=$TOSROOT/tosexport CLASSPATH=C:cygwinopttinyos-2.xsupportsdkjavatinyos.jarexport CLASSPATH=$CLASSPATH;.export MAKERULES=$TOSROOT/support/make/Makerulesexport PATH=/opt/msp430/bin:$PATHexport PATH=/cygdrive/c/Program Files/Java/jdk1.6.0_10/bin:$PATH执行命令: tos-install-jni如果出现一下
21、错误信息:Installing 32-bit Java JNI code in /cygdrive/c/Program Files/Java/jdk1.6.0_10/jre/bin .install: cannot stat /usr/lib/tinyos/*-32.dll: No such file or directory我们需要将以下目录中的toscomm.dll,重命名为:toscomm-32.dllC:cygwinlibtinyos C:Program FilesJavajdk1.6.0_10jrebintoscomm.dll toscomm-32.dll重新tos-install-
22、jni命令。7、 安装 Graphviz下载地址:/tos/dist-1.1.0/tools/windows/graphviz-1.10.exe,默认安装到C:Program FilesATT目录下。一直点NEXT就可以完成安装。8、 测试安装1环境测试: 运行cygwin,输入命令: $ tos-check-env 如果上述安装成功,可能会出现WARNING:java 1.4 or java1.5,tos-check-env completed without error等,这是JAVA版本的问题,不必理会。 $ which java正常情
23、况出现:/cygdrive/c/Program Files/Java/jdk1.6.0_10/bin/java如果出现/cygdrive/c/WINDOWS/system32/java则尝试输入:export PATH=/cygdrive/c/Program Files/Java/jdk1.6.0_10/bin:$PATH2、检查己经让TinyOS build system环境可运行的.输入如下命令:$ printenv MAKERULES如果看到:/opt/tinyos-2.x/support/make/Makerules这是正确的五 实验报告要求实验名称实验内容说明程序源代码实验步骤,实验
24、中出现的问题,观察到的结果实验总结实验二:BlinkTinyOS编程的“Hello World”一 实验目的1、掌握Linux基本命令及其使用。2、掌握安装应用程序到节点(如telosb)的方法。3、 掌握nesC语言语法风格、组织、命名和连接组件的机制。4、 掌握组件中命令(command)和事件(event)接口的使用。5、 掌握模块(module)和配件(configuration)的作用及使用方法。二 实验原理TinyOS操作系统、库和程序服务程序是用nesC写的。 nesC是一种开发组件式结构程序的语言。nesC是一种C语法风格的语言,但是支持TinyOS的并发模型,以及组织、命名和
25、连接组件成为健壮的嵌入式网络系统的机制。 nesC应用程序是由有良好定义的双向接口的组件构建的。 nesC定义了一个基于任务和硬件事件处理的并发模型,并能在编译时检测数据流组件。规范 nesC应用程序由一个或多个组件连接而成 一个组件可以提供或使用接口 组件中command接口由组件本身实现 组件中event接口由调用者实现 接口是双向的,调用command接口必须实现其event接口实现modules 包含应用程序代码,实现接口configurations装配模块,连接模块使用的接口到其提供者每个nesC应用程序都有一个顶级configuration连接内部模块并发模型TinyOS只能运行单
26、个由所需的系统模块和自定义模块构成的应用程序两个线程任务 一次运行完成,非抢占式硬件事件处理 处理硬件中断 一次运行完成,抢占式用于硬件中断处理的command和event必须用async关键字声明执行流程(race conditions)nesC要避免任务排他性访问共享数据nesC要避免所有共享数据访问都通过原子语句nesC在编译过程中要检测数据流,但可能误报,可用norace关键字声明不检测,但对其使用应格外小心三 实验环境1、JDK1.6 for windows2、Cygwin with TinyOS 2.x3、UltraEdit / EditPlus四 实验内容和步骤1、实验内容:(1
27、) 进入tmp文件夹并创建文件夹,取名Blink,进入这个文件夹。cd /tmpmkdir Blinkcd Blink(2) 定义一个Blink配件BlinkAppC.nc。configuration BlinkAppC implementation components MainC, BlinkC, LedsC; components new TimerMilliC() as Timer0; components new TimerMilliC() as Timer1; components new TimerMilliC() as Timer2; BlinkC - MainC.Boot;
28、BlinkC.Timer0 - Timer0; BlinkC.Timer1 - Timer1; BlinkC.Timer2 - Timer2; BlinkC.Leds - LedsC;(3) 定义一个Blink配件BlinkC.nc。#include Timer.hmodule BlinkC uses interface Timer as Timer0; uses interface Timer as Timer1; uses interface Timer as Timer2; uses interface Leds; uses interface Boot;implementation e
29、vent void Boot.booted() call Timer0.startPeriodic( 250 ); call Timer1.startPeriodic( 500 ); call Timer2.startPeriodic( 1000 ); event void Timer0.fired() call Leds.led0Toggle(); event void Timer1.fired() call Leds.led1Toggle(); event void Timer2.fired() call Leds.led2Toggle(); (4) 新建一个Makefile文件。COMP
30、ONENT=BlinkAppCinclude $(MAKERULES) (5)新建一个说明文档README(可选) (6)编译程序make telosb (7)下载到telosb节点,观察实验结果make telosb reinstall.ID bsl,serialport. (8) 用nesdoc显示程序结构和配件组成,然后进入/tinyos-2.x/doc/nesdoc,打开index.htmlmake telosb docs(9)编写实验报告 五 实验报告要求实验名称实验内容说明程序源代码实验步骤,实验中出现的问题,观察到的结果实验总结实验三:TinyOS任务及应用举例一 实验目的1、了
31、解TinyOS两层调度策略:任务和硬件事件句柄。2、掌握任务(Task)的建立、提交及其作用。3、 掌握nesC语法中的分相操作(split-phase operation)。4、 理解BlinkTask应用程序。二 实验原理1、任务(Task)TinyOS 提供任务和硬件事件句柄组成的两层调度策略。关键字 async 声明了可被硬件事件句柄执行的命令或事件。这意味着它可以在任何时候执行(可能会抢占其它代码的执行)。因此,用 async 声明的命令和事件所做的工作应该做尽量少,且要快速完成。此外,还得注意被异步命令或事件访问的数据可能存在的数据竞争。任务则被用来处理一些较长时间的操作,例如:后
32、台数据处理,但任务可以被硬件事件句柄抢占。 一个任务可以用以下语法在你的实现模块中声明: task void taskname() / 其中,taskname 是程序员任意指定的任务的标识,也就是“函数名”。一个任务的返回值类型必须是void,并且不能有任何参数。而向操作系统提交任务则可以用以下语法: post taskname(); 一个任务可以在命令、事件或其它任务内部向操作系统提交。post 操作把任务放置到一个以先进先出为处理方式的内部任务队列中去。当一个任务开始执行的时候,只有它运行结束,下一个任务才能开始运行;因此,一个任务不应该占用或阻塞太长时间。任务之间不可以互相抢占,但是会被
33、硬件事件句柄抢占。如果你的任务需要执行一系列长时间的操作,最好把任务分成几个而不是使用一个大的任务。2、分相(split-phase)操作在TinyOS中每一个长时间运行的操作都是分相的。在阻塞系统中,当一个调用长时间运行的操作时,只有操作完成时调用才会返回;而在分相系统中,调用会立即返回,当操作完成会发出callback。分相操作相对于顺序代码有些复杂,但他可以使操作并行并且节省内存。Timer.StartOneShot就是一个分相调用的例子。if (send() = SUCCESS) sendCount+;/ start phasesend();/completion phasevoid
34、sendDone(error_t err) if (err = SUCCESS) sendCount+; 阻塞(Blocking)分相(Split-Phase)三 实验环境1、JDK1.6 for windows2、Cygwin with TinyOS 2.x3、UltraEdit / EditPlus四 实验内容和步骤 (1) 进入tmp文件夹并创建文件夹,取名BlinkTask,进入这个文件夹。cd /tmpmkdir BlinkTaskcd BlinkTask(2) 把Blink文件夹里的所有文件复制到BlinkTask中。cp r /opt/tinyos-2.x/apps/Blink/
35、* /tmp/(3) 现给程序设置一个较长的计算任务。用UltraEdit打开模块文件BlinkC.nc,并修改如下:#include Timer.hmodule 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 );
36、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) 编译程序并把它下载到节点观察三盏灯情况,记录结果。若第一盏灯没有闪烁,则将值改
37、成20001,100001再观察结果。400001:没有闪烁。第一盏灯一直亮,后面两盏不亮20001:红灯有闪烁,绿灯的闪烁频率是黄灯的两倍100001:红灯一直亮,没有闪烁 (5)一个长的计算操作会一直占用CPU,从而阻塞其他操作的执行。所以,我们需要使用建立任务(Task)任务的方法来解决上述问题,重新修改程序。implementationtask void computeTask() uint32_t i; for (i = 0; i 400001; i+) event void Timer0.fired() call Leds.led0Toggle(); post computeTas
38、k();记录:没有闪烁 (6)编译、安装程序,观察记录结果。若第一盏灯仍然没有闪烁(想想为什么?),则将代码再次修改如下:uint32_t i;task void computeTask() uint32_t start = i; for (;i start + 10000 & i = 400000) i = 0; else post computeTask(); 记录:三站灯都闪烁 (7)再次编译并安装程序,观察记录结果。(8)编写实验报告 五 实验报告要求实验名称实验内容说明程序源代码实验步骤,实验中出现的问题,观察到的结果实验总结实验四:节点间的无线通信一 实验目的1、了解TinyOS消
39、息缓冲抽象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 headersizeof(messa
40、ge_header_t); nx_uint8_t dataTOSH_DATA_LENGTH; nx_uint8_t footersizeof(message_footer_t); nx_uint8_t metadatasizeof(message_metadata_t); message_t;2、通信接口与组件 基本通信接口:(1)Packet:提供对message_t的基本访问a. 清除消息内容(命令)b. 得到有效载荷的长度(命令)c. 得到指向有效载荷地址的指针(命令)(2)Send:提供与地址无关的发送接口a. 发送消息内容(命令)b. 取消挂起消息的发送(命令)c. 消息是否发送成功
41、(事件)d. 得到有效载荷的长度(函数)e. 得到指向有效载荷地址的指针(函数)(3)Receive:提供基本消息的接收接口a. 接收消息(事件)b. 得到有效载荷的长度(命令)c. 得到指向有效载荷地址的指针(命令)(4)PacketAcknowledgements:为每个包的请求确认提供机制(5)RadioTimeStaming:提供时间戳 活动消息接口(1)AM层次实现了对radio的多路访问。“AM tpye”涉及到多路复用的领域。(2)支持AM服务的接口:a. AMPacket:提供基本的AM访问b. AMSend:提供基本的AM发送接口(3)一个节点的AM地址可以在初始化的时候设置
42、:make install.n or meke reinstall.n 通信组件:许多组件实现了基本通信接口与AM接口(1)AMReceiverC - Provides: Receive, Packet, and AMPacket. (2)AMSenderC-Provides: AMSend, Packet, AMPacket, RacketAcknowledgements as Acks. (3)AMSnooperC - Provides Receive, Packet, and AMPacket. (4)AMSnoopingReceiverC - Provides Receive, Pac
43、ket, and AMPacket. (5)ActiveMessageAddressC 提供用来得到或设置节点AM地址的命令(少用)三 实验环境1、JDK1.6 for windows2、Cygwin with TinyOS 2.x3、UltraEdit / EditPlus四 实验内容和步骤1、重新实现Blink(1)进入tmp文件夹并创建文件夹,取名BlinkToRadio,进入这个文件夹。cd /tmpmkdir BlinkToRadiocd BlinkToRadio(2)新建模块文件BlinkToRadio.nc#include #include BlinkToRadio.hmodul
44、e BlinkToRadioC uses interface Boot; uses interface Leds; uses interface Timer as Timer0;implementation uint16_t counter = 0; event void Boot.booted() call Timer0.startPeriodic(TIMER_PERIOD_MILLI); event void Timer0.fired() counter+; call Leds.set(counter); (3)TIMER_PERIOD_MILLI的值被定义头文件BlinkToRadio.
45、h中#ifndef BLINKTORADIO_H#define BLINKTORADIO_H enum TIMER_PERIOD_MILLI = 250;#endif(4)编写配件BlinkToRadioApp.nc,连接提供和使用各接口的组件#include #include BlinkToRadio.h configuration BlinkToRadioAppC implementation components MainC; components LedsC; components BlinkToRadioC as App; components new TimerMilliC() a
46、s Timer0; App.Boot - MainC; App.Leds - LedsC; App.Timer0 - Timer0;(5)最后创建Makefile文件COMPONENT=BlinkToRadioAppCinclude $(MAKERULES)2、定义消息结构typedef nx_struct BlinkToRadioMsg nx_uint16_t nodeid; nx_uint16_t counter; BlinkToRadioMsg;除了struct和uint16_t前面的nx_前缀之外,上面的消息结构与C语言结构体基本一样。它是nesC所特有的,表示struct和uint1
47、6_t为外部类型(external types)。nx_前缀表示数据为外部类型的大端(big-endian)数据,小端(little-endian)前缀为nxle_。不同类型的节点会采用不同类型的处理器,它们对于字节、字等的存储机制有所不同,因而会引发计算机通信领域中一个很重要的问题,即通信双方交流的信息单元应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。TCP/IP各层协议将字节序定义为big-endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。nesC语言定义了外部类型,可以让程序员不必考虑字节序的重新排列。3、发送数据
48、包定义好消息的数据结构,我们接下去要学习怎么把指定结构的数据包发送出去。首先我们因明确程序要完成的功能:在定时器每次触发的时候(i)计数器+1;(ii)把计数器值的最低三位显示在三盏灯上;(iii)把由发送节点的节点号和计数器值组成数据包通过无线收发器发送出去。为了完成上述功能,我们将程序分成以下几步:(1)找出相应的接口和组件,使我们能够控制收发器(radio)并对message_t进行操作。我们使用AMSend接口来发送数据包,Packet和AMPacket接口进入message_t抽象数据类型。这些接口都用组件AMSendC来提供,虽然它们也可以由ActiveMessageC来提供,但是
49、AMSendC提供了虚拟抽象(virtualized abstraction)。因为收发器是一个公共资源,不同的组件都可以使用,所以需要将它虚拟化以避免不同组件间的相互干扰(后面课程会讲)。同时,我们使用由组件ActiveMessageC提供的SplitControl来开启和关闭收发器。(2)更新BlinkToRadio.nc中的module板块代码,用uses语句添加上述接口。module BlinkToRadioC .uses interface Packet;uses interface AMPacket;uses interface AMSend;uses interface Spli
50、tControl as AMControl;注意,这里SplitControl被重命名为AMControl,通过as关键字。(3)声明新变量,并初始化。implementation bool busy = FALSE; /标记无线电收发器是否忙碌 message_t pkt; .在定时器开始之前,首先要彻底开启收发器。event void Boot.booted() call AMControl.start();event void AMControl.startDone(error_t err) if (err = SUCCESS) call Timer0.startPeriodic(TIM
51、ER_PERIOD_MILLI); else call AMControl.start();event void AMControl.stopDone(error_t err) (4)添加程序逻辑。首先要检查busy标记,保证没有数据包正在发送。然后用一个指针指向一个数据包的payload部分,往payload里面各个域填写数据。最后通过send命令把数据包发送给所有接受范围内的节点(因为目的地址为AM_BROADCAST_ADDR)。如果成功(返回SUCCESS),则证实AM层已经收到数据包,准备发送。event void Timer0.fired() .if (!busy) BlinkTo
52、RadioMsg* btrpkt = (BlinkToRadioMsg*)(call Packet.getPayload(&pkt,NULL); sizeof (BlinkToRadioMsg);btrpkt-nodeid = TOS_NODE_ID;btrpkt-counter = counter;if (call AMSend.send(AM_BROADCAST_ADDR, &pkt, sizeof(BlinkToRadioMsg) = SUCCESS)SUCCESS) busy = TRUE;(5)实现所有用到的接口中所包含的事件(events)。通过观察Packet,AMPacket,AMSend接口,发现只
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国PU男沙滩鞋数据监测研究报告
- 2025年中国PE保鲜膜数据监测报告
- 2025年中国KU波段卫星通信便携站数据监测研究报告
- 2025年中国D型尖嘴钳数据监测研究报告
- 2025年中国6位半数字交直流电压表头数据监测报告
- 2025年中国17α-甲基-5α-雄烷二醇数据监测报告
- 2025至2030年中国高温耐热带市场分析及竞争策略研究报告
- 2025至2030年中国防水实木地板市场分析及竞争策略研究报告
- 2025至2030年中国金银铜制品市场分析及竞争策略研究报告
- 2025至2030年中国设备维修清洗剂市场分析及竞争策略研究报告
- l辐射安全管理制度
- 健康评估(第3版)课件6-2 泌尿系统常见症状评估
- 餐厨废弃食用油脂管理制度
- 贵州省黔东南州2024-2025学年高二下册期末教学质量检测数学试卷(附答案)
- 武汉大学2020年强基计划物理试题(解析版)
- 2024年海原县社区专职工作者招聘考试真题
- 人工智能在畜牧业中的应用研究-洞察阐释
- 2025届浙江省杭州滨江区六校联考七年级英语第二学期期末质量跟踪监视模拟试题含答案
- T/CACEM 39-2024交通企业标准化评价指南
- 2025春国开《创业基础》形考任务1-4答案
- 天航题库理论SOP复习试题及答案
评论
0/150
提交评论