当前位置:文档之家› TinyOS入门

TinyOS入门

如有错误警告,根据提示检查环境搭建的步骤。
2
一、编译和安装
• 接下来要检查TinyOS系统是否正常启用。 • $ printenv MAKERULES • Make命令编译TinyOS应用程序的方法是: 在应用程序的文件夹下运行: • make [platform] 。如 make micaz。 • TOSSIM仿真编译则为: • make [platform] sim 。如 make micaz sim。
Blink
3.5 MainC.nc
#include "hardware.h" configuration MainC { provides interface Boot; //提供接口Boot uses interface Init as SoftwareInit; } implementation { components PlatformC, RealMainP, TinySchedulerC; RealMainP.Scheduler -> TinySchedulerC; RealMainP.PlatformInit -> PlatformC; SoftwareInit = RealMainP.SoftwareInit; Boot = RealMainP; //RealMainP使用SoftwareInit接口,提供Boot接口 }
3
1.1 确认 nesc语言的ncc编译器的版本
• nesC语言是TinyOS使用的语言,而ncc是对gcc的 扩展,专门用来编译nesC应用程序。 • 可输入 which ncc来查看系统调用的是哪个ncc编译 器,会跳出该ncc的文件位置,再输入该文件目录 的 –version选项命令,得到其版本号。
• 运行环境:TinyOS 2.1 + Cygwin (Windows XP) • Cygwin在Windows下提供一个类似Linux的环境
1
一、编译和安装
• 作为一开始的学习,先来编译一个非常简 单的程序 Blink。若没有硬件节点,可以用 TinyOS的TOSSIM仿真平台进行编译运行。 • 编译TinyOS程序使用make命令,TinyOS系 统有一个强大的扩展性很强的make 系统, 位于 tinyos-2.x/support/make目录中。 • 先运行如下命令检查环境是否正确配置。 • $ tos-check-env
10
三、例子程序Blink
• Blink是一个基本的应用程序,它通过开启定时器来实现周 期性地切换LED灯。 • 其文件位置为/opt/tinyos-2.x/apps/Blink。 • 编译下载到节点上,可以看到,该应用程序在节点的3个 LED灯上显示了一个计数器。它只是简单的以4Hz的频率开 关LED0,以2Hz开关LED1,以1HZ开关LED2。其效果就 是: 每两秒3个LED显示了二进制计数从0到7。 • Blink程序由两个文件组成:模块文件(BlinkC.nc)和 配件 文件(BlinkAppC.nc)。记住:所有程序都需要一个顶层 配件,通常是以应用程序的名字命名。BlinkAppC就是 Blink程序的配件,也是nesC编译器产生可执行文件的源头。 而BlinkC则提供Blink程序的逻辑实现。BlinkAppC是用来连 接BlinkC模块和Blink所需的其他功能组件。
Lesson1 TinyOS入门
• 介绍TinyOS系统的一些基本概念:组件 (components),模块(modules),配件 (configurations)和接口( interfaces)。 • 如何编译和安装一个TinyOS程序在一个mote (尘埃)节点上。 • 以Blink为例介绍一个简单的应用程序是如何组 建起来的。
3.3 BlinkC.nc
module BlinkC () { uses interface Timer<TMilli> as Timer0; //定义使用到的接口 … … //Timer1、Timer2的定义同上 uses interface Leds; uses interface Boot; //BlinkC 可以调用这些它使用的接口的任何命令,但必须 实现这些接口的所有事件 event } implementation { event void Boot.booted() { call Timer0.startPeriodic( 250 ); //250ms周期性触发 call Timer1.startPeriodic( 500 ); call Timer2.startPeriodic( 1000 ); } event void Timer0.fired() { dbg(“BlinkC”, “Timer 0 fired @ %s.\n”, sim_time_string()); call Leds.led0Toggle(); //led0灯切换灭-亮状态 } … … //Timer1、Timer2的fired()事 源文件命名的一些注意
文件名 文件类型
Foo.nc
Foo.h FooC.nc FooP.nc
接口文件
头文件 公共组件(配件或模块) 私有组件(配件或模块)
虽然可以给应用程序中的模块和配件取任意的名称, 但为了简便,建议在编写代码时使用如上表所示的统一的 命名格式。
12
3.2 BlinkAppC.nc
4
1.2 在mica系列节点上下载程序
• • • • micaz 节点+串口编程辅助开发板mib510。 $ make micaz install.x mib510,serialport $ make micaz reinstall.x mib510,serialport 其中,x是分配给节点的全网唯一的身份标识码; serialport是串口设备的名字,在Windows下,如果 当前串口是COMn,那使用 /dev/ttySn-1 作为设备 名字。 • reinstall命令告诉make 系统下载当前已编译的二进 制文件到节点上,它跳过了编译的过程。 • 输入 “make clean ”可以清除所有已经编译完成的 二进制文件,然后输入 “make micaz install ”重新 编译文件,然后再下载一次。 • $ make micaz install.3 mib510,/dev/ttyS5
5
• 如果程序下载成功将会如下图所示,如果没 有请重新编译下载。
6
二、组件和接口
• TinyOS程序代码是用nesC语言编写的,这是C语 言扩展了一些组件和并发特征后的语言。 • 一个nesC语言编写的程序由一个或多个组件构成 或连接而成。 • 一个组件(conponent)由两部分组成:一个是规 范说明,包含要用接口的名字;另一部分是它们 的实现。 • 一个组件可以提供接口(interface),也可以使用 接口。提供的接口描述了该组件提供给上一层调 用者的功能,而使用的接口则表示了该组件本身 工作时需要的功能。
15
3.4 接口连接
• 当一个组件只含有一个接口的时候,就可以省略 接口的名字了。如 BlinAppC中Blinkc.leds – > ledsC 。 就省略了 LedsC组件中包含的接口leds。 其等同于:Blinkc.leds – > ledsC.leds 。 • 由于 BlinkC组件中仅仅含有一个leds的接口实例, 那也同样等同于:Blinkc – > ledsC.leds 。 • 同样地,TimerMilliC 组件只提供了单一的 timer 接口实例,也不必包含在下面的连接里: BlinkC.Timer0 -> Timer0 • 连接的箭头是 可以对称倒反的。如 Timer0 <- BlinkC.Timer0; //等同于BlinkC.Timer0 -> Timer0为了方便阅读,大 多数连接的箭头还是 从左到右的。 16
configuration BlinkAppC { // 这里一般由uses 和 provides 从句来说明使用到的和提供的接口,除了顶 层配件,模块和配件多可以使用和提供接口 } Implementation //实现部分 { components MainC, BlinkC, LedsC; //BlinkC是编写的模块 components new TimerMilliC() as Timer0; //as命名别名方便识别 components new TimerMilliC() as Timer1; //同一组件不同实例 components new TimerMilliC() as Timer2; //components指定了这个配件用到的组件components BlinkC -> MainC.Boot; // BlinkC.Boot -> MainC.Boot BlinkC.Timer0 -> Timer0; //BlinkC.Timer0 -> Timer0.Timer0 BlinkC.Timer1 -> Timer1; // ->是连接的意思 BlinkC.Timer2 -> Timer2; // ->是一种包含两个内部规范元素的连接 BlinkC.Leds -> LedsC; //BlinkC.Leds -> LedsC.Leds //也就是把负责实现应用部分的模块BlinkC与系统的组件库连接起来 //记住, BlinkAppC 和 BlinkC 组件是不一样的。更确切的说, BlinkAppC 是 由 Blinkc 组件连同 mainc ,ledsc 和3个 timer定时器一起组成的。 } 13
7
二、组件和接口
• 接口是双向的:提供或使用。 • 接口指定了一组命令(command),其职能由接口 的提供者实现。还指定了一组事件( event),其 职能由该接口的使用者实现。 • 也就是说,提供了接口的组件必须实现该接口的命 令函数;而使用了某接口的组件必须实现该接口的 事件函数。
相关主题