TinyOS 2.x 入门教程 - 图文 下载本文

TinyOS Programming

图1.12 选择您的驱动程序

然后 ,选择驱动程序所在文件,例如:在笔者的电脑中,文件夹如图1.12所示,点击 “OK”,然后点击 “Next”。紧接着Windows安装该驱动程序,安装完成后就把 Telob 变成一个USB 串口设备。此时您可以检查设备管理器端口,看是否有 USB Serial Port 这个设备,如果没有可以重试几次。

Page 6 of 94

TinyOS Programming

第2章 TinyOS简介

TinyOS作为无线传感器网络中比较流行的操作系统,支持目前出现的多种节点。就2.x版本而言,支持mica系列、telos系列等节点。TinyOS作为开源的操作系统,其价值不单为支持多个系列的节点,对单片机爱好者而言,更是学习多种单片机编程的上佳资料;对操作系统爱好者而言也有一定参考价值,其简单性让读者更加容易入门。

本章简单介绍TinyOS的基本概念和其编写语言:nesC。包括nesC语言的一些概念和语法,让读者能够在这个环境下编写自己的应用程序。最后结合TinyOS自带的一个例子:Blink,让大家在此例子中熟悉涉及到的概念。在此再次明确指出,为方便读者朋友,本教程尽可能使用TinyOS自带的例程及源代码。另外,本章在讲解TinyOS、nesC语言相关概念时引用了TinyOS官方公布的讲解方式及内容。

2.1 nesC语言简介

TinyOS操作系统、库、及其应用程序都是用nesC语言编写的。TinyOS是一种面向传感器网络的新型操作系统,它最初是用汇编和C语言编写的。但在应用过程中,发现C语言不能有效方便地支持面向传感器网络的应用和操作系统的开发,相关工作人员为此对C语言进行了一定的扩展,开发出nesC语言。nesC不但支持TinyOS的并发模型,还同时具有结构化机制,命名机制,能够跟其它软件组件连接成一个健壮的网络嵌入式系统。其主要目标是让应用程序开发人员能够方便地建立起完整的、并发式系统的组件,并可以在编译时作出全面的检查。

TinyOS定义了很多的重要的概念,这些概念都体现在nesC语言上了。第一,nesC应用程序都是由组件组成的,这些组件之间的连接是通过定义良好的、具有双向性质的接口。第二,nesC定义了并发模型,此模型是基于任务 (task) 和硬件事件句柄 (hadware event handler),并且在编译期间可以进行数据竞争检测 (data race)。

nesC建立在C语言的基础上,其显著与C语言不同的概念有如下内容。

2.1.1 组件(components) (1)基本概念

任何一个使用nesC编写的应用程序都是由一个或多个组件连接而成,从而成为一个可执行的、完整的程序。在nesC中,组件的类型有两种:模块 (module) 和配件 (configuration)。模块主要用来提供应用程序的代码,以实现一个或多个接口。而配件则是用来汇聚其它组件,连接接口的使用者和提供者。nesC设计者称这种关系为连接 (wiring)。每个nesC应用程序均是由一个顶层的配件(top-level configuration)所描述,其内容就是把应用程序用到的所有组件都连接起来,从而形成一个整体。

nesC的源文件:接口、模块、和配件的扩展名是 “.nc”。关于命名约定的更多的信息请查看http://www.tinyos.net/tinyos-2.x/doc/tutorial/naming.html,也可以参看本教程的附录二:《TinyOS命名约定》。

组件的定义格式如图2.1所示:

Page 7 of 94

TinyOS Programming

图2.1 组件的原型

一个组件提供(provides)和使用(uses)接口。接口是访问组件的唯一途径,并且接口是具有双向性的。一个接口声明了一系列称之为命令 (command) 的函数,及一系列称之为事件 (event) 的函数,接口的提供者必须实现该接口声明的所有的命令,而接口的使用者则必须实现该接口声明的所有的事件。一个组件可以提供或使用多个接口,并且可以提供或使用同一个接口的多个实例。

(2)基于组件的模型

一个简单的基于组件的调用模型如图2.2所示。

Page 8 of 94

TinyOS Programming

图2.2 基于组件的模型

上层的应用调用TinyOS所提供的不同组件,而每个组件都会相应的提供自身的应用接口。实际上各个组件的实现还需要调用其下层的图中所示的模型类似于一个库(library),不同的组件(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、 接口

不同的组件提供自身相应的接口,应用程序则通过调用这些接口来实现对于更低层的组件和硬件的调用。例如在本例中的如下代码: {

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被触发的时候,所对应的灯闪烁; }

Page 9 of 94