TinyOS 2.x 入门教程.doc

上传人:仙人指路1688 文档编号:2392531 上传时间:2023-02-17 格式:DOC 页数:57 大小:6.12MB
返回 下载 相关 举报
TinyOS 2.x 入门教程.doc_第1页
第1页 / 共57页
TinyOS 2.x 入门教程.doc_第2页
第2页 / 共57页
TinyOS 2.x 入门教程.doc_第3页
第3页 / 共57页
TinyOS 2.x 入门教程.doc_第4页
第4页 / 共57页
TinyOS 2.x 入门教程.doc_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《TinyOS 2.x 入门教程.doc》由会员分享,可在线阅读,更多相关《TinyOS 2.x 入门教程.doc(57页珍藏版)》请在三一办公上搜索。

1、TinyOS 2.x 编程入门教程Version 1.02010/12/17目录前言1第1章编程环境的建立21.1安装Java 1.6 JDK21.2安装cwgwin(window only)21.3安装编译器21.4安装TinyOS工具31.5设置环境变量41.6安装 Graphviz41.7检测软件安装情况41.8USB串口驱动下载及安装5第2章TINYOS简介72.1nesC语言简介72.1.1组件(components)72.1.2并发模型112.2常用make命令简介122.3应用举例:Blink -TinyOS编程的“Hello World”程序122.3.1Blink配件132.

2、3.2BlinkC模块142.3.3事件evenst和命令commands162.3.4编译Blink应用程序172.3.5安装Blink程序到Telosb节点并运行172.4下载程序出错故障排除182.5小结20第3章TELOSB硬件平台常用可编程器件和对应的TINYOS组件介绍213.1Led223.1.1Telosb硬件平台上的Led器件展示223.1.2TinyOS中Led编程组件介绍223.2传感器233.2.1Telosb硬件平台上的传感器展示233.2.2TinyOS中传感器编程组件介绍243.3串口253.3.1Telosb硬件平台上的串口展示253.3.2TinyOS中串口编

3、程组件介绍263.4Radio273.4.1Telosb硬件平台上的Radio相关器件展示273.4.2TinyOS中Radio编程组件介绍273.5小结27第4章用事件驱动方式从传感器获取数据284.1模块实现284.2ADC30第5章TINYOS任务及应用举例335.1任务的创建和调度335.2举例:SenseTask应用程序335.3小结34第6章TINYOS串口编程356.1TestSerial应用程序356.2串口助手:PC上显示从串口读取的数据386.3Telosb从串口读取数据406.4Oscilloscope应用程序数据感知426.5BaseStation应用程序466.6小结

4、51附录1 TINYOS命名约定53附录2 NESC语言特有关键字54前言随着传感器技术、微机电系统、现代网络、无线通信、低功耗等技术的飞速发展,推动了无线传感器网络 (WSN:wireless sensor network) 的产生和发展。无线传感器网络涉及IT领域的多种技术,成为目前IT领域的研究热点之一。无线传感器网络就是由部署在监测区域内大量的廉价微型传感器节点组成,通过无线通信方式形成一个多跳的自组织网络。无线传感器网络所具有的众多类型的传感器,可探测包括地震、电磁、温度、湿度、噪声、光强度、压力、土壤成分、移动物体的大小、速度和方向等各种各样的现象。具有广阔应用前景,潜在的应用领域

5、可归纳为:军事、航空、反恐、防暴、救灾、环境、医疗、保健、家居、城市管理等诸多领域。传感器节点是一个微型的嵌入式系统,具有非常有限的硬件资源,需要操作系统能够高效地使用其仅有的内存、处理器和通信模块,且能够对各种特定应用提供最大的支持。传感器节点有两个突出的特点。一是并发性密集,即可能存在多个需要同时执行的逻辑控制,这需要操作系统能够有效地满足这种发生频繁、并发程度高、执行过程比较短的控制逻辑流程;另一个特点是传感器节点模块化程度很高,要求操作系统能够很方便让应用程序方便地对硬件进行控制,且保证在不影响整体开销的情况下,应用程序中的各个部分能够比较方便地进行重新组合。美国加州大学伯克利分校针对

6、无线传感器网络的特点研发了TinyOS操作系统,在科研机构的研究中应用比较广泛。TinyOS是无线传感器网络中较为流行的操作系统,所用编程语言为nesC (network embedded system C),nesC语言由C语言扩展而来,意在把组件化、模块化思想和TinyOS基于事件驱动的执行模型结合起来。目前在国内,关于TinyOS的资料并不多,而且很散,给各个方面的人员在使用TinyOS时造成了诸多不便,我们在使用TinyOS时积累了一些经验,在此希望能对大家有一定的帮助。本教程所用硬件平台为Telosb,操作系统版本为TinyOS 2.x,nesC语言版本为1.3。主要内容的几乎覆盖T

7、elosb硬件平台的所有常用可编程器件及TinyOS一些重要概念,内容不是很深入,适合没有接触过TinyOS的初学者,但就其对于Telosb硬件平台而言,是使用Telosb硬件平台的工作人员或爱好者不可多得的参考文档,并且在熟悉了此教程之后,读者朋友们可以很容易地转到其它硬件平台上去。在范例的选择方面,本教程尽量选择了TinyOS自带的例子,方便读者测试。只有少数例子在TinyOS中没有,已编写了尽量简短的程序并在教程中展示了这些例子的完整代码。在讲解某些内容方面,特别是概念性的内容,我们借鉴了TinyOS官方公布的一些讲解方式、引用了部分内容及例子,以便尽可能准确传达TinyOS研发者的初衷

8、。最后,本教程要求读者均具有C语言编程的基础。因为nesC是C语言的扩展,在此教程不会讲解任何C编程方面的内容,如有读者未有C语言基础,请先学习C方面内容,以便可以进一步学习此教程涉及的内容。更加深入的内容及本教程使用到的工具会在“相关资源”列出,以方便大家进一步学习。 第1章 编程环境的建立目前TinyOS支持两种平台:cygwin(windows)和Linux。下面介绍在这两种操作系统下TinyOS的安装步骤。1.1 安装Java 1.6 JDK(1) 下载JAVA JDK SE 6 或(2) 安装路径c:UCBJavajdk1.6.0_10c:UCBJavajre6(3) 设置环境变量(

9、a)CLASSPATH我的电脑-属性-高级-环境变量-系统变量-新建变量名:CLASSPATH变量值:.;c:UCBJavajdk1.6.0_10bin;c:UCBJavajdk1.6.0_10libtools.jar(b)Path我的电脑-属性-高级-环境变量-系统变量-编辑变量名:Path变量值:c:UCBJavajdk1.6.0_10bin;c:UCBJavajdk1.6.0_10jrebin(c)JAVA_HOME我的电脑-属性-高级-环境变量-系统变量-新建变量名:JAVA_HOME变量值:c:UCBJavajdk1.6.0_101.2 安装cwgwin(window only)(1

10、) 从tinyos上下载Cygwin的兼容包http:/cone.informatik.uni-freiburg.de/people/aslam/cygwin-files.zip(2) 解压到c:cygwin-installationfiles(3) 运行c:cygwin-installationfilessetup.exe下一步-Install from Local Directory-下一步-Root Directory输入c:UCBcygwin-下一步-Local Package Directory输入c:cygwin-installationfiles-下一步-下一步-安装-完成(4)

11、 运行C:cygwincygwin.bat1.3 安装编译器(1) 安装Atmel AVR ToolsToolWindows/CygwinLinuxavr-binutilsavr-binutils-2.17tinyos-3.cygwin.i386.rpmavr-binutils-2.17tinyos-3.i386.rpmavr-gccavr-gcc-4.1.2-1.cygwin.i386.rpmavr-gcc-4.1.2-1.i386.rpmavr-libcavr-libc-1.4.7-1.cygwin.i386.rpmavr-libc-1.4.7-1.i386.rpm avariceavar

12、ice-2.4-1.cygwin.i386.rpmavarice-2.4-1.i386.rpminsightavr-insight-6.3-1.cygwin.i386.rpmavr-insight-6.3-1.i386.rpmavrdudeavrdude-tinyos-5.6cvs-1.cygwin.i386.rpmavrdude-tinyos-5.6cvs1.i386.rpm如果在安装时提示错误:有一个更新版本的rpm包已经安装,尝试使用命令 rpm -Uvh -force如果在安装时提示错误:找不到/bin/sh,尝试使用命令rpm -Uvh -force -nodeps(2) 安装TI

13、MSP430 ToolsToolWindows/CygwinLinuxbasemsp430tools-base-0.1-20050607.cygwin.i386.rpm msp430tools-base-0.1-20050607.i386.rpmpython toolsmsp430tools-python-tools-1.0-1.cygwin.noarch.rpm msp430tools-python-tools-1.0-1.noarch.rpmbinutilsmsp430tools-binutils-2.16-20050607.cygwin.i386.rpmmsp430tools-binut

14、ils-2.16-20050607.i386.rpmgccmsp430tools-gcc-3.2.3-20050607.cygwin.i386.rpmmsp430tools-gcc-3.2.3-20050607.i386.rpmlibcmsp430tools-libc-20080808-1.cygwin.i386.rpmmsp430tools-libc-20080808-1.i386.rpmjtagNot yet availablemsp430tools-jtag-lib-20031101cvs-20050610.i386.rpmgdbNot yet availablemsp430tools-

15、gdb-6.0-20050609.i386.rpm1.4 安装TinyOS工具ToolWindows/CygwinLinuxCommandNescnesc-1.3.1-1.cygwin.i386.rpm(not available yet)nesc-1.3.1-1.fc9.i386.rpmrpm Uvhrpm Uvh ignoreos (if Cygwin complains)ToolWindows/CygwinLinuxCommandDeputytinyos-deputy-1.1-1.cygwin.i386.rpmtinyos-deputy-1.1-1.fc9.i386.rpmrpm irp

16、m i ignoreos (if Cygwin complains)ToolWindows/CygwinLinuxCommandTinyos-toolstinyos-tools-1.4.0-3.cygwin.i386.rpmtinyos-tools-1.4.0-3.ubuntu.i386.rpmrpm ivh -force (2.x tree)rpm Uvh (no 2.x tree)1.5 设置环境变量需要在TinyOS的配置文件中对环境变量进行设置:Environment VariableWindowsLinuxTOSROOT/opt/tinyos-2.xsame as in Cygwin

17、TOSDIR$TOSROOT/tossame as in CygwinCLASSPATHC:cygwinoptTinyos-2.xsupportsdkjavatinyos.jar$TOSROOTMAKERULES$TOSROOT/support/make/Makerulessame as in CygwinPATH/opt/msp430/bin:/opt/jflashmm:$PATHsame as in Cygwin只有在使用MSP430或者是iMote2的硬件平台的时候,才需要对环境变量PATH进行设置。在理想情况下,可以通过将这些环境变量写入shell脚本文件中,它会在每次shell启动的

18、时候自动运行。可以使用命令“/.bash_profile”打开配置文件进行添加。1.6 安装 Graphviz对于Windows操作系统,可以到http:/webs.cs.berkeley.edu/tos/dist-1.1.0/tools/windows/graphviz-1.10.exe下载所需的安装文件,否则到http:/www.graphviz.org/Download.php下载所需的rpm包进行安装。1.7 检测软件安装情况安装完TinyOS等软件包之后,打开Cygwin shell,输入命令:$tos-check-env系统将会检测各个程序是否正常,查看安装时是否有错误发生。一般情

19、况下,不会发生什么严重错误。当全部程序正确安装时,最后一行是:toscheck completed without error.注意:这一行很重要,如果有任何错误,请根据提示信息进行改正。若在检测后出现如下提示:toscheck completed with errors:- WARNING: CLASSPATH may not include . (that is, the symbol for the current working directory). Please add . to your CLASSPATH or you may experience configuration

20、problems.此信息提示:某环境变量配置有点问题,但是这是关于TinyOS自带的java工具的,这是因为在配置文件中格式的问题,进行修改后即可。1.8 USB串口驱动下载及安装Telosb硬件平台使用FTDI公司的“USB转串口芯片”:FT232B,该芯片的驱动程序请在FTDI公司的网站下载,具体链接为: xp,故本人选择windows xp版本的驱动。当您第一次使用Telosb时,需要安装驱动程序。将Telosb节点插入PC的USB接口,如果找不到驱动程序,Windows 会弹出“发现新硬件向导”的对话框,如图1.11所示。选择 “Install from a list or speci

21、fic location (Advanced) ”,然后点击 “Next”, 图1.11 弹出的安装向导接着,选择 “Include this location in the search”,然后点击 “Browse”。 如图1.12所示: 图1.12 选择您的驱动程序然后 ,选择驱动程序所在文件,例如:在笔者的电脑中,文件夹如图1.12所示,点击 “OK”,然后点击 “Next”。紧接着Windows安装该驱动程序,安装完成后就把 Telob 变成一个USB 串口设备。此时您可以检查设备管理器端口,看是否有 USB Serial Port 这个设备,如果没有可以重试几次。第2章 TinyOS

22、简介TinyOS作为无线传感器网络中比较流行的操作系统,支持目前出现的多种节点。就2.x版本而言,支持mica系列、telos系列等节点。TinyOS作为开源的操作系统,其价值不单为支持多个系列的节点,对单片机爱好者而言,更是学习多种单片机编程的上佳资料;对操作系统爱好者而言也有一定参考价值,其简单性让读者更加容易入门。本章简单介绍TinyOS的基本概念和其编写语言:nesC。包括nesC语言的一些概念和语法,让读者能够在这个环境下编写自己的应用程序。最后结合TinyOS自带的一个例子:Blink,让大家在此例子中熟悉涉及到的概念。在此再次明确指出,为方便读者朋友,本教程尽可能使用TinyOS

23、自带的例程及源代码。另外,本章在讲解TinyOS、nesC语言相关概念时引用了TinyOS官方公布的讲解方式及内容。2.1 nesC语言简介TinyOS操作系统、库、及其应用程序都是用nesC语言编写的。TinyOS是一种面向传感器网络的新型操作系统,它最初是用汇编和C语言编写的。但在应用过程中,发现C语言不能有效方便地支持面向传感器网络的应用和操作系统的开发,相关工作人员为此对C语言进行了一定的扩展,开发出nesC语言。nesC不但支持TinyOS的并发模型,还同时具有结构化机制,命名机制,能够跟其它软件组件连接成一个健壮的网络嵌入式系统。其主要目标是让应用程序开发人员能够方便地建立起完整的

24、、并发式系统的组件,并可以在编译时作出全面的检查。TinyOS定义了很多的重要的概念,这些概念都体现在nesC语言上了。第一,nesC应用程序都是由组件组成的,这些组件之间的连接是通过定义良好的、具有双向性质的接口。第二,nesC定义了并发模型,此模型是基于任务 (task) 和硬件事件句柄 (hadware event handler),并且在编译期间可以进行数据竞争检测 (data race)。nesC建立在C语言的基础上,其显著与C语言不同的概念有如下内容。2.1.1 组件(components)(1)基本概念任何一个使用nesC编写的应用程序都是由一个或多个组件连接而成,从而成为一个可

25、执行的、完整的程序。在nesC中,组件的类型有两种:模块 (module) 和配件 (configuration)。模块主要用来提供应用程序的代码,以实现一个或多个接口。而配件则是用来汇聚其它组件,连接接口的使用者和提供者。nesC设计者称这种关系为连接 (wiring)。每个nesC应用程序均是由一个顶层的配件(top-level configuration)所描述,其内容就是把应用程序用到的所有组件都连接起来,从而形成一个整体。nesC的源文件:接口、模块、和配件的扩展名是 “.nc”。关于命名约定的更多的信息请查看组件的定义格式如图2.1所示:图2.1 组件的原型一个组件提供(provi

26、des)和使用(uses)接口。接口是访问组件的唯一途径,并且接口是具有双向性的。一个接口声明了一系列称之为命令 (command) 的函数,及一系列称之为事件 (event) 的函数,接口的提供者必须实现该接口声明的所有的命令,而接口的使用者则必须实现该接口声明的所有的事件。一个组件可以提供或使用多个接口,并且可以提供或使用同一个接口的多个实例。(2)基于组件的模型 一个简单的基于组件的调用模型如图2.2所示。图2.2 基于组件的模型 上层的应用调用TinyOS所提供的不同组件,而每个组件都会相应的提供自身的应用接口。实际上各个组件的实现还需要调用其下层的图中所示的模型类似于一个库(libr

27、ary),不同的组件(components)相当于库中的元素(objects),而接口(interfaces)相当于APIs。(3)简单示例Blink Blink示例的主要现象为通过对Timer的调用触发红、绿、黄三种颜色的灯的闪烁事件: Toggle Red LED 0.25 Hz Toggle Green LED 0.25 Hz Toggle Yellow LED 0.25 Hz 如右图所示,在Blink示例中只需要用到以下三个组件: LEDs Timer Main 1、 接口不同的组件提供自身相应的接口,应用程序则通过调用这些接口来实现对于更低层的组件和硬件的调用。例如在本例中的如下代码

28、: uses interface Timer as Timer0; uses interface Timer as Timer1; uses interface Timer as Timer2; uses interface Leds; uses interface Boot;and you implement what you want to do in your program 当Timer被触发的时候,所对应的灯闪烁; 其中接口Timer是一个带参数的接口,它使用类型作为参数,接口中的类型参数被放在一对尖括号中,当串连提供者和使用者的接口带有类型参数时,它们的类型必须相互匹配,有时类型参

29、数只是用来做类型匹配检测的,而并没有用到命令和事件中去,本例中的Timer接口就是如此,虽然它带有一个类型参数,但它里面没有一个函数用到了这个类型参数。Blink示例是一个LEDs的闪烁示例,其中LED0的开关频率为4HZ,LED1的开关频率为2HZ,LED2的开关频率为1HZ。模块BlinkC使用了三个Timer接口示例,同时也使用了LEDs和Boot接口,也就是说BlinkC在调用这些接口所定义的命令的同时必须实现接口所定义的事件的处理函数,如图2.3所示:图2.3 Blink接口其中各个组件和接口的作用为:Main.Boot:初始化并启动程序LEDs.Leds:控制LED的动作(亮、灭、

30、闪烁)Timer.Timer:计时器 之前提到过Timer是一个带类型参数的接口,它的3个标注的类型是TMilli, T32khz, 和 TMicro,分别表示毫秒级,32Khz和微妙级的计时器。这些类型都各自的定义为C的结构体。2、 组成和编译接口可以由组件提供或使用。被提供的接口表现它为使用者提供的功能,被使用者表现使用者完成它的作业所需要的功能。例如在Blink示例中,组件LEDs和Timer提供了使用的接口,实际上它们也需要再调用下层的组件,如MSP430GPIO和MSP430TimerB7等。考虑到较好的代码重用性,nesC是基于由编译器生成完整程序代码的需求设计的。作为一个必要的组

31、成部分,nesC的编译器会根据用户所指定的平台编译生成一个对应于特定平台的C源文件。对于其产生的C源文件,nesC依据不同的微控制器使用一个对应的本地GNU的C编译器将产生的C源文件编译成可执行文件并将其下载到对应硬件平台上。如图2.4所示,nesC就根据不同的环境使用不同的编译器:Atmel128 C 源文件对应的是AVRgcc 编译器,MPS430 C 源文件对应的是mspgcc 编译器,其他的C 源文件对应的是另外的编译组件,它们对应的下载到的硬件平台分别为MicaZ和Mica2、Telosb和Taroko、其他硬件平台。 图2.4 组成和编译方式3、 开发环境开发环境是一个命令行界面,

32、下图是在Windows操作系统上Cygwin + TinyOS的一个开发环境界面。图2.5 开发环境2.1.2 并发模型TinyOS一次只执行一个应用程序,而一个应用程序由一些必要的组件和一些可选的组件组合而成。TinyOS程序有两个执行线程:任务和硬件事件句柄。任务是一种被延迟执行的函数。一旦任务被执行,它们就一直运行直至结束,中间不会被其它任务中断。硬件事件句柄是对硬件中断的处理,同样会一直运行到结束,但是可能会抢占一个任务或其它硬件事件句柄的运行。命令和事件要作为硬件事件句柄来执行,则必须用关键字async来声明。因为任务和硬件事件句柄是可以被其它异步代码抢占的,所以在一定竞争情况下,n

33、esC程序是很容易受到影响,从而导致数据的不一致或错误。为避免竞争而带来的错误产生,可以在任务内排外地访问数据,或者每次访问都采用原子 (atomic) 语句。nesC编译器在编译期间给程序员报告潜在的数据竞争。编译器也可能会产生错误的报告(例如:该变量需要随时变化),这种情况下,变量可以用关键字norace声明。注意:关键字norace必须极其小心地使用。要了解用 nesC 编程的更多信息,请参看: 2.2 常用make命令简介TinyOS编程中,有一些make命令是经常用到的,下面对其一一进行介绍。1) make platform此命令是将nesC代码编译成可在某平台运行的代码。在执行前要

34、切换到代码所在的目录。例如:Blink程序的代码在C:UCBcygwinopttinyos-2.xappsBlink 目录下。打开Cygwin shell后用cd命令转到该目录下,然后输入make telosb (make mica) 命令就可以让编译器将其编译成可以在telosb (mica) 平台运行的代码了,当然首先得保证没有任何语法错误。2) make platform reinstall使用 make platform命令后,就可以将在某平台的可执行代码下载到对应的平台上了。例如:make telosb reinstall (make mica reinstall) 就可以将编译好的

35、可在telosb (mica) 平台上运行的代码下载到telosb (mica) 硬件平台。3) make platform install此命令的功能相当于先执行命令make platform,再执行命令make platform reinstall。当然,如果执行make platform 命令时,发现程序有错误,则不会执行下载动作,即不会执行make platform reinstall命令。4) make clean此命令删除上述编译命令产生的文件及文件夹。5) make platform docs此命令生成程序使用的所有组件、接口的关系的文件。生成的文件在tinyos-2.xdocn

36、esdoc 目录下,其中索引文件为 “index.html”。2.3 应用举例:Blink -TinyOS编程的“Hello World”程序上面的nesC语言简介中,简略介绍了组件、接口、模块、连接、命令、事件等基本概念。对于初学者来说相当抽象,下面结合一个例子来看看各个概念在nesC/TinyOS编程中的用法。这个例子是TinyOS自带的程序,位于tinyos-2.x/apps/Blink,其功能是让一个LED以1Hz的频率闪烁。Blink应用程序由两个组件组成:一个模块定义文件“BlinkC.nc”和一个配置文件“BlinkAppC.nc”,“BlinkAppC.nc”也就是顶层配置,它

37、连接“BlinkC.nc”和其他必要组件。请记住,任何一个应用程序都有一个用应用程序名命名的顶层配件,在此处,配件BlinkAppC.nc就是Blink应用程序的顶层配件,nesC编译器根据该文件的内容产生可执行文件。另一方面,模块BlinkC.nc提供Blink应用程序的实现代码。正如你所想的,BlinkAppC配件是用来连接组件:BlinkC模块和Blink应用程序用到的其它组件的。让配件和模块之间有所区别的理由是:配件允许系统设计人员快速建立程序。例如:设计者设计一个应用程序可以只提供一个配件,这个配件只是简单地将一个或多个模块连接起来,而此时设计者实际上并没有实现任何东西。同样地,另一

38、个开发人员会提供可以在广泛范围应用程序中使用的“库”模块。当然,有时您需要同时拥有配件和模块(在此处是 BlinkAppC 和 BlinkC)。TinyOS 中的其他命名规则请参看:2.3.1 Blink配件nesC 的编译器为ncc,它可以将包含顶层配件的文件编译成可执行的应用程序。一般而言,TinyOS 应用程序还拥有一个标准的Makefile 文件,允许进行平台选择以及在调用ncc时使用某些适当的选项。Blink程序由两个组件构成。BlinkC.nc为模块,BlinkAppC.nc为配件。让我们先看看Blink程序的配件:BlinkAppC.nc。/BlinkAppC.nc config

39、uration BlinkAppCimplementation components MainC, BlinkC, LedsC; components new TimerMilliC() as Timer0; components new TimerMilliC() as Timer1; components new TimerMilliC() as Timer2; BlinkC - MainC.Boot; BlinkC.Timer0 - Timer0; BlinkC.Timer1 - Timer1; BlinkC.Timer2 - Timer2; BlinkC.Leds - LedsC;Ti

40、nyOS应用程序中,configuration可以提供和使用接口,但并不是所有的配置都是应用程序顶层的配置。Implementation是配置的内容,它将一系列的组件建立起引用关系。首先,需要注意的是关键字 configuration ,此词声明这是一个配件文件。头两行:configuration BlinkAppC由于这个组件本身并不使用或者提供任何接口,所以在其声明部分为空。首先简单地说明这个配件名为 BlinkAppC。跟模块一样,在声明后的这个花括号内可以指定 uses 语句和 provides 语句。有一点非常重要,必须记住:配件可以提供和使用接口。配件实际的实现代码是在紧接着的im

41、plementation后面的一对大括号里面。components那行列出了此配件用到的一组组件,分别是MainC,BlinkC和LedsC。剩下的语句是连接使用到的接口到该接口的提供者。因为BlinkC模块使用了Boot、Leds和Timer接口,所以必须指明这些接口都是由其他哪些组件提供的。先使用component关键字标明,这个程序当中,总共要用到哪几个组件。其中包括我们自己编写的BlinkC模块。还有负责提供Boot接口的MainC组件,负责提供Leds接口的LedsC组件。还有提供Timer接口的TimerMilliC,其属于泛型(generic)配置,支持被实例化。这里先不细说,因

42、为我们需要用到三个计时器,所以需要使用new关键字创建三个计时器的实例,然后分别用as被重命名为Timer0、Timer1和Timer2。components new TimerMilliC() as Timer0;components new TimerMilliC() as Timer1;components new TimerMilliC() as Timer2; 再往下就是组件之间的连接了。BlinkC使用了Boot接口,而MainC正好提供了BlinkC所需的Boot接口,所以我们将他们进行连接。nesC使用箭头来指示接口之间的关系。你可以把向右箭头()当作“绑定到”(binds t

43、o)。箭头左边的接口绑定一个接口到右边的(接口的)实现上。换句话说,组件使用的接口在左边,而右边组件提供的接口在右边。BlinkC-MainC.Boot/ 或者像下面这样也是可以的。MainC.BootMainc.Boot接着是控制发光二极管的Leds接口,由LedsC组件提供。这里也进行了简写,完整的书写格式为:BlinkC.Leds-LedsC.Leds计数器的连接同理。2.3.2 BlinkC模块 BlinkC模块的代码如下:#include Timer.hmodule BlinkC uses interface Timer as Timer0; uses interface Timer as Timer1; uses interface Timer as Timer2; uses in

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号