TinyOS入门
tinyos编译环境搭建(windows)
将Tinyos2.x移植到cc2530
编译环境的搭建
流程:在windows下建立cygwin平台,并搭建Tinyos的编译环境,然后将基于Tinyos的应用程序编译成hex文件,通过仿真器下载到cc2530片子上运行。
原材料:硬件(cc2530节点,仿真器等)、软件(Cygwin,Keil,TinyOS 2.x,编译环境配置软件包,SmartRF04 Flash Programer等)。注意:硬件是原来在IAR下能正常使用的CC2530开发硬件就OK声明:一.里面很多东西我借鉴了网上的资料,并写在后面的参考文献中。并对一些内容进行了修改和强调,以及我遇到的一些问题的解决方法。
= = = = = = = = = = = = = = = = = = = = = =
1.安装Keil (Keil uVersion4)
这些资源网上很多,百度和谷歌都可以搜到(注:一定要下载keil uVersion4,不可以下载4以下的版本,因为要运行的是cc2530,4以下的版本会找不到相关的编译平台环境)
2.安装java 1.5 JDK
我开始用1.6了的,反正一直没成功,不知道是不是这个原因。最好就用1.5这个版本吧。安装完了在命令行中:java –verson ,出现“java version “1.5.0”表示是1.5版本了。
3.安装Cygwin
(1)下载Cygwin,我是在这里下载的:/index.php/Installing_TinyOS_2.0.2#Manual_installation_on_your_host_OS_with_RPMs,在Setp 2: Install Cygwin中第一步有个cygwin-files.zip,点击即可下载。
Lesson1---TinyOS入门
7
二、组件和接口
• 接口是双向的:提供或使用。 • 接口指定了一组命令(command),其职能由接口 的提供者实现。还指定了一组事件( event),其 职能由该接口的使用者实现。 • 也就是说,提供了接口的组件必须实现该接口的命 令函数;而使用了某接口的组件必须实现该接口的 事件函数。
• 如果一个组件调用了( call)的一个接口命令 ,必 须实现该接口的事件。 • 一个组件可以使用( use)或提供( provide)多个 接口或者同一接口的多个实例。 8
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
TinyOS 2.x 入门教程
TinyOS 2.x 编程入门教程
Version 1.0
2010/12/17
目录
前言 (1)
第1章编程环境的建立 (2)
1.1安装J AVA 1.6JDK (2)
1.2安装CWGWIN(WINDOW ONLY) (2)
1.3安装编译器 (3)
1.4安装T INY OS工具 (3)
1.5设置环境变量 (4)
1.6安装G RAPHVIZ (4)
1.7检测软件安装情况 (4)
1.8USB串口驱动下载及安装 (5)
第2章TINYOS简介 (7)
2.1NES C语言简介 (7)
2.1.1组件(components) (7)
2.1.2并发模型 (11)
2.2常用MAKE命令简介 (12)
2.3应用举例:B LINK ---T INY OS编程的“H ELLO W ORLD”程序 (12)
2.3.1Blink配件 (13)
2.3.2BlinkC模块 (14)
2.3.3事件evenst和命令commands (16)
2.3.4编译Blink应用程序 (17)
2.3.5安装Blink程序到Telosb节点并运行 (17)
2.4下载程序出错故障排除 (18)
2.5小结 (20)
第3章TELOSB硬件平台常用可编程器件和对应的TINYOS组件介绍 (21)
3.1L ED (22)
3.1.1Telosb硬件平台上的Led器件展示 (22)
3.1.2TinyOS中Led编程组件介绍 (22)
3.2传感器 (23)
3.2.1Telosb硬件平台上的传感器展示 (23)
3.2.2TinyOS中传感器编程组件介绍 (24)
TinyOS在windows中安装步骤
1.TinyOS
1.1概要
TinyOS应用程序都是有一个或多个组件链接起来,从而形成一个完整的可执行程序.组件中实现了功能接口,同时也能使用其它组件提供的接口。
在接口定义中可以申明命令函数和事件函数,命令函数由接口提供者实现,事件函数由接口使用者实现。对于一个组件而言,如果它要使用某个组件接口中的命令,它必须实现这个接口的事件。一个组件可以使用或提供多个接口以及同一个接口的多个实例。
组件有两种类型:模块(module)和配置(configuration)。模块提供应用程序代码,实现一个或多个接口;配置则是用来将其它组件装配起来,将各个组件所使用的接口与其它组件提供的接口连接在一起,进行导通。每个应用程序都由一个顶级配置所描述,其内容就是将该应用程序所用到的所有组件导通起来,形成一个有机整体.
TinyOS应用程序必须包含Main 组件,Main组件是首先被执行的一个组件。确切的说,在TinyOS 中执行的第一个命令是Main。StdControl.init(),接下来是Main.StdControl。start()。
Main组件完成以下功能:芯片初始化,外围电路初始化,操作系统调度数据结构初始化,子组件初始化,启动子组件件,进入调度死循环从而将控制权交给操作系统,一旦没有任务可以调度就进入休眠状态以降低系统功耗。
TinyOS的调度系统是TinyOS系统的核心部分。它采用先进先出的排队策略,任务之间不可以抢占,但是中断可以抢占任务,中断是否可以抢占中断则是应用程序自己控制的.即如果中断处理程序进入中断以后执行了关中断的操作,那么这个中断将是不可抢占的,否则在服务的过程中就有可能被抢占掉.另外还要注意,在中断服务程序里面是可以创建任务的。
TinyOS学习笔记讲解
第一篇基础知识
TinyOS体系结构
(1) 组件模型module & configuration
TinyOS 是基于构件的微操作系统,采用事件驱动模型,有效的提高了系统的运行效率以及能源合理利用。TinyOS 采用nesC 语言编写,其应用程序由一个或多个组件连接而成,而组件可以提供和使用接口,组件必须实现其所提供的command 接口,并且必须实现其连接组件中申明的事件event 接口。接口是程序的实体,实现程序的各功能模块,分为command 和event ,command 接口由组件本身实现,而event 接口则由调用者实现,值得注意的是,接口是双向的,调用command 接口时必须实现其event 接口。
组件又可以细分为模块module 和配件。模块亦可分为2个部分,其一,首先申明提供以及使用的接口,如
module BlinkC { } 其二,在implementation 中模块包含各接口所提供的行为(方法),也包含仅供本模块内部使用的函数,以及申明本模块所具有的事件signal ,以及实现其连接或使用的event 。
implementation
{
uint8_t counter = 0;
void ledctl() {
call Leds.set(counter);
}
event void Boot.booted() {
} event void Timer0.fired()
{
ledctl();
}
}
配件configuration 也可以分为两个部分,和module 一样,第一部分是申明可以提供以及使用的接口。第二部分implementation 中首先列出与其相连接模块的名称,使用components 标注连接的模块,然后对本配件提供的以及与其相对应模块使用以及提供的接口进行配线,如下例:
第3章4无线传感器网络操作系统TinyOS
√
√ √ 静态 √ √ 静态
√
√ 动态
系统执行模型
组件
线程
模块
17
TinyOS 2.0的安装与调试
TinyOS系统的一些工具命令都是需要Java支持 的,因此先要为操作系统搭建Java开发环境。 1.安装JDK1.5 从http://java.sum.com上下载jdk1.5(若计算机 上己安装过jdk1.6建议先将其卸解)。 JDK的安装目录并不作要求,并且如果只是单纯 安装TinyOS2.0.2可以不用去环境变量中配置JDK。
TinyOS操作系统概述
1
内容提要
1. 2. 3. 4. 5. WSN操作系统 TinyOS简介 主要技术 编程规范 体系结构
2
无线传感器网络及其操作系统
• 无线传感器网络(Wireless Sensor Network,WSN)是由部署 在监测区域内大量的廉价微型传感器节点组成,通过无线 通信方式形成的一个多跳的自组织网络系统,其目的是协 作地感知、采集和处理网络覆盖区域中感知对象的信息, 并发送给观察者。 • 有人认为没有必要设计一个专门的操作系统,可以直接在 硬件上设计应用程序,但在实际过程中会碰到许多问题: – 面向传感器网络的应用开发难度会加大,应用开发人员 不得不直接面对硬件进行编程,无法得到像操作系统那 样提供的丰富的服务。 – 软件的重用性差,程序员无法继承已有的软件成果,降 低了开发效率。
tinyos资料
TinyOS是一个开源的嵌入式操作系统,它是由加州大学的伯利克分校开发出来的,主要应用于无线传感器网络方面。它是基于一种组件(Component-Based)的架构方式,使得能够快速实现各种应用。TinyOS的程序采用的是模块化设计,所以它的程序核心往往都很小(一般来说核心代码和数据大概在400 Bytes左右),能够突破传感器存储资源少的限制,这能够让TinyOS很有效的运行在无线传感器网络上并去执行相应的管理工作等。TinyOS 本身提供了一系列的组件,可以很简单方便的编制程序,用来获取和处理传感器的数据并通过无线电来传输信息。TinyOS是一个开源的嵌入式操作系统,它是由加州大学的伯利克分校开发出来的,主要应用于无线传感器网络方面。它是基于一种组件(Component-Based)的架构方式,使得能够快速实现各种应用。TinyOS的程序采用的是模块化设计,所以它的程序核心往往都很小(一般来说核心代码和数据大概在400 Bytes左右),能够突破传感器存储资源少的限制,这能够让TinyOS很有效的运行在无线传感器网络上并去执行相应的管理工作等。TinyOS本身提供了一系列的组件,可以很简单方便的编制程序,用来获取和处理传感器的数据并通过无线电来传输信息。TinyOS在构建无线传感器网络时,它会有一个基地控制台,主要是用来控制各个传感器子节点,并聚集和处理它们所采集到的信息。TinyOS 只要在控制台发出管理信息,然后由各个节点通过无线网络互相传递,最后达到协同一致的目的,比较方便。
TinyOS教程——1.5-传感
1.5传感
感应程序实例
/* Sense Application */
Sense是一个简单的感应实例程序。她定期(periodically)采样传感器的数据,然后显示读取数据的低位,显示在节点的leds灯上。查看tinyos-2.x/doc/html/tutorial/lesson5.html作为一个在TinyOS系统上传感器的普通教程。
tinyos-2.x/doc/html/tutorial/lesson5.html
Sensing详细说明文档
这节课程将介绍TinyOS中的传感器数据采集(acquisition)。我们将展示(demonstrate)两个传感器程序:一个简单的Sense应用程序用来定期(periodically)的采集传感器数据,然后显示将数据显示在LEDs灯上。而一个更复杂(sophisticated)的应用Oscilloscope,这个节点定期(periodically)广播他们读取的传感器数据到基站节点。就像过先前的课程中所描述,用Mote-PC进行串行通信,基站将读取的传感器数据转发到PC上,然后在专用的(dedicated)用户图形界面中进行可视化(visualized)。
目录
TinyOS官方教程翻译............................................................................. 错误!未定义书签。目录 . (1)
介绍 (2)
Sense应用程序 (2)
1.DemoSensorC组件 (5)
tinyos 程序的运行过程
Tinyos 2.x 的启动顺序
•、main()函数在哪里?
•从前面几节课可以知道,应用程序处理Boot.booted事件,然后从此处开始运行。下面将介绍这个事件的前后过程,如何适宜地初始化组件。
系统运用了3个接口
(1)init:初始化逐渐和硬件状态
(2)scheduler:初始化和运行任务
(3)boot:通知系统已成功地启动
在tinyos中,应用系统的启动顺序可以分成5步:
(1)调度器的初始化
(2)逐渐初始化
(3)中断使能
(4)触发启动完成的信号
(5)循环运行任务调度
implementation {
int main() __attribute__ ((C, spontaneous)) {
atomic {
platform_bootstrap(); //启动硬件平台
call Scheduler.init(); //调度器初始化
call PlatformInit.init(); //平台初始化
while (call Scheduler.runNextTask());
call SoftwareInit.init(); //软件初始化
while (call Scheduler.runNextTask());
}
__nesc_enable_interrupt(); //使能中断
signal Boot.booted(); //触发启动完成的事件
call Scheduler.taskLoop(); //开启调度循环
return -1;
}
default command error_tPlatformInit.init() { return SUCCESS; }
无线传感器网络节点操作系统TinyOS综述
通信机制方面,TinyOS支持多种无线通信协议,如ZΒιβλιοθήκη BaidugBee、IEEE 802.15.4 等。它采用了轻量级的通信协议栈,实现了高效、可靠的无线通信,并降低了功 耗。
TinyOS应用程序开发
使用TinyOS开发应用程序需要对TinyOS的编程模型有一定的了解。TinyOS 应用程序的基本结构包括硬件配置、任务定义、事件处理和通信协议等几个部分。
5、可扩展性:TinyOS支持基于Nios II和MSP430等不同的硬件平台,可扩 展性强,适用于各种类型的传感器节点。
三、TinyOS的应用场景
TinyOS因其轻量级、可扩展性和低功耗等特点,被广泛应用于环境监测、智 能交通、智能家居、农业等领域。例如,在环境监测中,通过部署搭载TinyOS的 传感器节点,可以实时监测空气质量、温湿度、光照等参数;在智能交通中, TinyOS可以用于车辆监测、交通信号控制、智能停车等领域;在智能家居中, TinyOS可以与各种智能设备配合,
TinyOS操作系统的实现机制
TinyOS操作系统的实现机制包括内核、文件系统、设备驱动和任务调度等方 面。它的内核采用事件驱动机制,能够快速响应外部事件,同时提供丰富的API 接口,方便开发者进行应用程序的开发。文件系统则采用了轻量级的数据存储和 访问机制,以降低能耗和提高性能。
设备驱动方面,TinyOS为各种传感器和执行器提供了驱动程序接口,例如温 度传感器、光感传感器、GPS等,使得节点可以方便地采集环境和自身状态信息。 任务调度方面,TinyOS采用了基于优先级调度和轮询调度的混合调度策略,以满 足不同应用程序的性能需求。
TinyOS学习笔记1
TinyOS学习笔记1-TinyOS安装
1、Ubuntu系统的安装
安装TinyOS可以在Windows中利用Cygwin进行安装,经过测试在XP中可以正确安装,但是安装的步骤过于麻烦,可以参考官方网站的安装步骤。在Win7中安装后有问题,不能正确编译。因此最好使用Linux系统来安装TinyOS,安装过程简单。
安装Ubuntu系统
1.Ubuntu的官方网站下载iso镜像,我安装的是10.04版本
2.可以有两种方式进行Ubuntu安装。
(1)传统方式安装:在系统中划分出空闲分区,利用U盘制作启动盘,官网有,可下载。重启系统选择U盘启动。进行安装。
(2)wubi方式进行安装:以文件形式进行安装,下载wubi,将镜像与wubi放于同一文件夹。点击wubi进行安装。
3.更新Ubuntu
更行Ubuntu时需要注意,更新时grub不更新。利用wubi安装,我选择了更新grub,重新启动系统出现错误。解决方法如下:
1.另一台电脑,到Ubuntu网站下载镜像,安装到U盘中,制作启动盘。
2.开机,选择从U盘启动,在Boot里设置不好使,像我的ASUS A8,开机按ESC,选择U盘启动。
3.看到Ubuntu的欢迎界面,选择第一项,进入U盘中的Ubuntu系统。
4.在终端中,输入
sudo apt-get install lilo
sudo lilo -M /dev/SD a mbr
5.重启系统,问题解决
4.使用root登录系统
2、在Ubuntu系统下安装TinyOS
我安装的时TinyOS2.1.1,安装过程参考TinOS官网的安装指导,但有问题,具体步骤如下:1)在系统的“/etc/apt/sources.list”中,添加如下代码:
Lesson2---模块和tinyos执行模型 TinyOS系统经典PPT教程 教学课件
三、任务
event void Timer0.fired() { uint32_t i;
uint32_t i;
task void computeTask() {
• 一个任务可以安全地调用命令和触发事件。
三、任务
• 提交操作(post)将任务放入内部的先进先出 (FIFO)的任务队列 ,当一个任务被执行时,它 必须一直运行到结束,才能让下一个任务运行。
• 一个任务的运行周期不该太长久。一系列长作业 应分成几个独立的小任务。
• 任务之间不能相互抢占顺序。
• 硬件中断可以抢断任务(但至今还没见过这种情 况)。
• 内部函数可以调用命令或触发事件。
五、分阶段作业
• 在一个阻塞系统(blocking)中,当程序调 用一个长作业,这个调用直到作业完成后 才会返回:即该程序阻塞了。
• 在一个分阶段(split- phase) 系统里,当程 序调用一个长作业时,调用立即返回,并 要求其完成时触发一个回调。 即分阶段作 业。
post computeTask();
}
}
四、内部函数
• 一个组件调用另一个组件里的函数的唯一方 式是通过接口的命令和事件。
TinyOS学习笔记作者:幽暗天琴
TinyOS学习笔记1---入门
当我们uses某接口时,那么该接口下的所有command和event都可以调用。
在一些情况下,组件也可以provides和uses
Command。同样的provides的组件要实现command的函数内容。
配置文件
现在,我们已经知道某些组件提供的接口,但,仅仅通过这还不足以访问这个组件。
如果a,b同时都提供了一个接口c,那么,当组件d访问c接口时访问的到底是a还是b呢?
所以配置文件就产生了,它的目的就是声明你要访问的组件名称,并且将它所提供的接口与你想要使用的接口相连接。
配置文件的构成
配置文件configuration首先声明了其应用程序下的组件,关键字:components.
声明了组件之后,通过->可以将两个组件的接口连接起来。
Main.StdControl -> BlinkM.StdControl;
这段代码就是把组件main和blinkm的stdcontrol连接起来,这样,就建立了两个组件之间的联系。当调用main.stdcontrol的时候就相当于调用了blinkm.stdcontrol。
关键字-> 永远是将一个使用(uses)的接口(左边)于一个提供(provides)的接口(右边)相连接。
也就是说只有左边的组件能够调用右边的组件的接口。反之则不可以。并且该关键是一个多对多的关系,即一个组件可以连接到很多接口,反之一样配置文件还可以通过=关键字来进行接口之间的连接,=号表示两个接口之间的关系是等同的,类似于c语言中的指针。=号两边可以是uses=pro 也可以是u=u ,p=p.
tinyos中文手册
目 录
第一章前言 (3)
1T INY OS的安装 (3)
2T INY OS支持多种不同设备 (6)
3系统及硬件验证 (7)
4定制开发环境 (10)
附录:M AKE 及M AKEFILE (11)
1Makefile文件 (11)
2Make命令 (13)
3隐含规则 (14)
第二章 TINYOS简介 (17)
1简介 (17)
2应用程序举例:B LINK (18)
2.1Blink.nc配置 (18)
2.2BlinkM.nc模块 (20)
2.3编译Blink应用程序 (24)
2.4加载并运行Blink (25)
第三章用事件驱动方式从传感器读取数据 (27)
1S ENSE M.NC模块 (27)
2S ENSE.NC配置 (30)
3定时器与参数化接口 (31)
4运行S ENSE应用程序 (31)
5练习 (32)
第四章用于处理应用数据的任务 (34)
1任务的创建和调度 (34)
2S ENSE T ASK应用程序 (34)
3练习 (35)
第五章组件组合与无线通信 (36)
1C NT T O R FM A ND L EDS应用程序 (36)
2I NT T O R FM:发送信息 (39)
3I NT T O R FM M:实现网络通信 (41)
4G ENERIC C OMM网络堆栈 (42)
5使用R FM T O L EDS接收消息 (42)
6一些细节问题 (42)
7练习 (43)
第六章使用TOSSIM模拟TINYOS应用程序 (44)
1TOSSIM简介 (44)
2建立和运行应用程序 (44)
3增加调试语句 (45)
tinyos使用PPT课件
==错误提示:
The toscomm JNI library was not found.
Check that your tinyos-tools package is installed and try
rerunning tos-install-jni.
Aborting.
解决: copy getenv.dll and toscomm.dll from C:\cygwin\lib\tinyos to your
• $make reinstall,0 telosb //reinstall表示不用编译,0是节 点的ip地址
• $make telosb install,0 //向0号节点中烧入程序
• $cd /opt/tinyos-2.x/tos/platforms/telosb
• $make telosb docs
-
4
• 侦听数据包命令
• $cd /opt/tinyos-2.x/apps/Oscilloscope
• $ java net.tinyos.tools.Listen -comm serial@COM6:telosb
Fra Baidu bibliotek
• 出波形
• 对基站节点
• $cd /opt/tinyos-2.x/apps/Oscilloscope
• $ncc --version或 • $which ncc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2
一、编译和安装
• 接下来要检查TinyOS系统是否正常启用。 • $ printenv MAKERULES • Make命令编译TinyOS应用程序的方法是: 在应用程序的文件夹下运行: • make [platform] 。如 make micaz。 • TOSSIM仿真编译则为: • make [platform] sim 。如 make micaz sim。
• 规范
– nesC应用程序由一个或多个组件连接而成。 – 一个组件可以提供或使用接口:
» 组件中command接口由组件本身实现; » 组件中event接口由调用者实现; » 接口是双向的,调用command接口必须实现其event接口。
9
2.1 配件和模块
• 组件有两种:配件和模块。 • 模块(module):提供一个或多个接口的实现。 • 配件(configuration):把其他的组件装配起来, 连接组件使用的接口到其提供者。 • 每个nesC应用程序都必须有且只有一个顶层配件 (top-level configuration)连接内部组件。 • 之所以区别设计模块与配件,是为了让系统设计 者在构建应用程序的时候可以脱离现有的实现。 例如:设计者可以提供配件,只是简单地把一个 或多个模块连接起来,而不涉及其中具体的工作。 同样地,另一个开发者负责提供一组模块库,这 些模块可以普遍使用到众多应用中。
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接口 }
7
二、组件和接口
• 接口是双向的:提供或使用。 • 接口指定了一组命令(command),其职能由接口 的提供者实现。还指定了一组事件( event),其 职能由该接口的使用者实现。 • 也就是说,提供了接口的组件必须实现该接口的命 令函数;而使用了某接口的组件必须实现该接口的 事件函数。
• 如果一个组件调用了( call)的一个接口命令 ,必 须实现该接口的事件。 • 一个组件可以使用( use)或提供( provide)多个 接口或者同一接口的多个实例。 8
二、组件和接口
• 概述
– TinyOS操作系统、库和程序服务程序是用nesC写的。 – nesC是一种用于开发组件式结构程序的语言。 – nesC是一种C语法风格的语言,但是支持TinyOS的并发 模型,以及组织、命名和连接组件成为嵌入式网络系统 的机制。
» nesC应用程序由有良好定义的双向接口的组件构建; » nesC把组件化/模块化的思想和TinyOS基于事件驱动的执行模 型结合起来。
3Biblioteka Baidu
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
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
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
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()事件函数同上 14 }
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
Lesson1 TinyOS入门
• 介绍TinyOS系统的一些基本概念:组件 (components),模块(modules),配件 (configurations)和接口( interfaces)。 • 如何编译和安装一个TinyOS程序在一个mote (尘埃)节点上。 • 以Blink为例介绍一个简单的应用程序是如何组 建起来的。
5
• 如果程序下载成功将会如下图所示,如果没 有请重新编译下载。
6
二、组件和接口
• TinyOS程序代码是用nesC语言编写的,这是C语 言扩展了一些组件和并发特征后的语言。 • 一个nesC语言编写的程序由一个或多个组件构成 或连接而成。 • 一个组件(conponent)由两部分组成:一个是规 范说明,包含要用接口的名字;另一部分是它们 的实现。 • 一个组件可以提供接口(interface),也可以使用 接口。提供的接口描述了该组件提供给上一层调 用者的功能,而使用的接口则表示了该组件本身 工作时需要的功能。
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所需的其他功能组件。
3.4 接口连接
• nesC使用 箭头 –> 来绑定一个接口到另一个接口, 但一定要是同一类接口。 • 例如 A -> B 意为 A连接到B。 • A 是接口的使用者( user) ,而 B是接口的提供 者( provider)。完整的 表达式应该为: A. a -> B. b 这意味着, 组件A的接口a 连接到 组件B的接 口 b。 • 当一个组件使用或者提供同一个接口的多个不同 实例时,设置别名就非常有必要了。如 BlinkC 中 的 timer0, timer1, timer2。
11
3.1 源文件命名的一些注意
文件名 文件类型
Foo.nc
Foo.h FooC.nc FooP.nc
接口文件
头文件 公共组件(配件或模块) 私有组件(配件或模块)
虽然可以给应用程序中的模块和配件取任意的名称, 但为了简便,建议在编写代码时使用如上表所示的统一的 命名格式。
12
3.2 BlinkAppC.nc