TinyOS 2.x 入门教程 - 图文

TinyOS Programming

其中接口Timer是一个带参数的接口,它使用类型作为参数,接口中的类型参数被放在一对尖括号中,当串连提供者和使用者的接口带有类型参数时,它们的类型必须相互匹配,有时类型参数只是用来做类型匹配检测的,而并没有用到命令和事件中去,本例中的Timer接口就是如此,虽然它带有一个类型参数,但它里面没有一个函数用到了这个类型参数。

Blink示例是一个LEDs的闪烁示例,其中LED0的开关频率为4HZ,LED1的开关频率为2HZ,LED2的开关频率为1HZ。模块BlinkC使用了三个Timer接口示例,同时也使用了LEDs和Boot接口,也就是说BlinkC在调用这些接口所定义的命令的同时必须实现接口所定义的事件的处理函数,如图2.3所示:

图2.3 Blink接口

其中各个组件和接口的作用为: Main.Boot:初始化并启动程序

LEDs.Leds:控制LED的动作(亮、灭、闪烁) Timer.Timer:计时器

之前提到过Timer是一个带类型参数的接口,它的3个标注的类型是TMilli, T32khz, 和 TMicro,分别表示毫秒级,32Khz和微妙级的计时器。这些类型都各自的定义为C的结构体。

2、 组成和编译

接口可以由组件提供或使用。被提供的接口表现它为使用者提供的功能,被使用者表现使用者完成它的作业所需要的功能。例如在Blink示例中,组件LEDs和Timer提供了使用的接口,实际上它们也需要再调用下层的组件,如MSP430GPIO和MSP430TimerB7等。

考虑到较好的代码重用性,nesC是基于由编译器生成完整程序代码的需求设计的。作为一个必要的组成部分,nesC的编译器会根据用户所指定的平台编译生成一个对应于特定平台的C源文件。对于其产生的C源文件,nesC依据不同的微控制器使用一个对应的本地GNU的C编译器将产生的C源文件编译成可执行文件并将其下载到对应硬件平台上。如图2.4所示,nesC就根据不同的环境使用不同的编译器:Atmel128 C 源文件对应的是AVRgcc 编译器,MPS430 C 源文件对应的是mspgcc 编译器,其他的C 源文件对应的是另外的编译组件,它们对应的下载到的硬件平台分别为MicaZ和Mica2、Telosb和Taroko、其他硬件平台。

Page 10 of 94

TinyOS Programming

图2.4 组成和编译方式

3、 开发环境

开发环境是一个命令行界面,下图是在Windows操作系统上Cygwin + TinyOS的一个开发环境界面。

图2.5 开发环境

2.1.2 并发模型

TinyOS一次只执行一个应用程序,而一个应用程序由一些必要的组件和一些可选的组件组合而成。TinyOS程序有两个执行线程:任务和硬件事件句柄。任务是一种被延迟执行的函数。一旦任务被执行,它们就一直运行直至结束,中间不会被其它任务中断。硬件事件句柄是对硬件中断的处理,同样会一直运行到结束,但是可能会抢占一个任务或其它硬件事件句柄的运行。命令和事件要作为硬件事件句柄来执行,则必须用关键字async来声明。

Page 11 of 94

TinyOS Programming

因为任务和硬件事件句柄是可以被其它异步代码抢占的,所以在一定竞争情况下,nesC程序是很容易受到影响,从而导致数据的不一致或错误。为避免竞争而带来的错误产生,可以在任务内排外地访问数据,或者每次访问都采用原子 (atomic) 语句。nesC编译器在编译期间给程序员报告潜在的数据竞争。编译器也可能会产生错误的报告(例如:该变量需要随时变化),这种情况下,变量可以用关键字norace声明。注意:关键字

>>鐏炴洖绱戦崗銊︽瀮<<
12@gma联系客服:779662525#qq.com(#替换为@)