TinyOS入门
- 格式:ppt
- 大小:786.00 KB
- 文档页数:22
入门-tinyos编程思想除非特别说明,所有的程序都是基于tinyos-1.3的,并在VM 模拟Win xp 32位下用cygwin调试运行。
思想:Tinyos使用的是一种特殊的,面向组件的编程思想,这种思想和用惯了面向对象的编程思想的我来说,非常不习惯。
Tinyos和nesC为什么难学?因为他没有正常的教科书,不像C, C++,Java 一样有专门的书或者资料,告诉你需要实现什么功能,要去用到什么类(这里是组件),要去用什么接口,要去用什么函数。
Tinyos完全没有这些东西,什么都是让你自己去摸索和实践。
所以你有太多的不习惯:1. 你不习惯NesC程序的基本组成是Component,每个Component是一个*.nc文件。
这里不像Java,大家都知道java当中的类是有继承关系,有子类超类等等。
你只需要知道一些简单的类,就可以自己扩展学习,即使有没见过的类,也可以找到很详细的介绍和使用方法。
NesC中没有类的概念,自然也就没有子类超类,没有继承,也就是说,如果你知道有这么一个Component,你就可以用这个Component 可以完成一定的工作。
但是如果你不知道这个Component呢,尤其是某些底层的Component 那么嘿嘿~~!!要么你像我一样,去逼自己看懂系统提供那些的Component,要么自己写一个。
可问题你现在连最简单的blink 程序都看不懂,更何况自己写了。
所以每个用NesC的初学者都和瞎子差不多,说白了,你就是什么都不会的。
你的C还有java经验都根本没用。
当然,你会if 还有for语句,这是你在学习tinyos中唯一比买菜大妈强的地方。
2. 你不习惯NesC程序的中Component的使用方法。
NesC程序中采用了一种所谓的wiring的机制来指明component与component之间的关系。
3. 你不习惯NesC程序的中组件的层次结构,也就是接口,方法,属性,函数的关系。
TinyOS 2.x 编程入门教程Version 1.02010/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)3.3串口 (25)3.3.1Telosb硬件平台上的串口展示 (25)3.3.2TinyOS中串口编程组件介绍 (26)3.4R ADIO (26)3.4.1Telosb硬件平台上的Radio相关器件展示 (26)3.4.2TinyOS中Radio编程组件介绍 (27)3.5小结 (27)第4章用事件驱动方式从传感器获取数据 (27)4.1模块实现 (28)4.2ADC (30)第5章TINYOS任务及应用举例 (32)5.1任务的创建和调度 (32)5.2举例:S ENSE T ASK应用程序 (33)5.3小结 (33)第6章TINYOS串口编程 (34)6.1T EST S ERIAL应用程序 (34)6.2串口助手:PC上显示从串口读取的数据 (38)6.3T ELOSB从串口读取数据 (39)6.4O SCILLOSCOPE应用程序——数据感知 (41)6.5B ASE S TATION应用程序 (45)6.6小结 (51)附录1 TINYOS命名约定 (52)附录2 NESC语言特有关键字 (54)前言随着传感器技术、微机电系统、现代网络、无线通信、低功耗等技术的飞速发展,推动了无线传感器网络 (WSN:wireless sensor network) 的产生和发展。
第一篇基础知识TinyOS体系结构(1) 组件模型module & configurationTinyOS 是基于构件的微操作系统,采用事件驱动模型,有效的提高了系统的运行效率以及能源合理利用。
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 标注连接的模块,然后对本配件提供的以及与其相对应模块使用以及提供的接口进行配线,如下例:{}implementation{BlinkC -> MainC.Boot; /////或者写作BlinkC.Boot -> MainC.Boot;BlinkC.Timer<TMilli> ->TimerMilliC;BlinkC.Leds -> LedsC;}在TinyOS 中存在很多中间配件,这些配件的特点是没有与之相对应的模块,其作用就是根据不同的条件将上层的连接转接到不同的模块上,如下例所示generic configuration AMSenderC(am_id_t AMId) { provides {interface AMSend; interface Packet;interface AMPacket;interface PacketAcknowledgements as Acks;}}implementation {#if defined(LOW_POWER_LISTENING)#else #endifAMSend = SenderC;Packet = SenderC;AMPacket = SenderC;Acks = SenderC;}接口文件相当于C 程序中头文件对函数的声明,接口文件一般放置于提供该接口的模块的同一目录下的interface 文件夹中,也可以放在TinyOS 根目录下的interface 目录中,其命名必须与模块中所提供接口名字相同,注意不是接口的实例化名称或nickname 。
TinyOS/NesC程序的基本结构和入手写法(教程lesson 1 blink)和大家一样,我是按照 ../tinyos/cygwin/opt/tinyos-1.x/doc/tutorial 中的8个lesson进行操作和学习的。
虽然很痛苦,可是还真没有什么别的更好的方法来学习这门奇怪的嵌入式语言。
相信绝大多数同学在面对NesC的时候,最大的问题就是不知道从哪里下手,和自己到底要写些什么。
以下的步骤,至少可以让你知道,你要使用NesC去做什么。
第一步,我们要根据实际情况去选择使用什么组件。
以编写blink为例:首先我们需要main, main是程序开始的组件,是每个的TinyOS 程序(application)都必须的组件。
或者可以说是NesC程序的入口,类似于C语言的main(),“Main”调用其他的 component以实现程序的功能。
第二,需要一个来控制程序逻辑的组件,或者说具体实现程序逻辑功能的组件。
一般表达程序的逻辑思路,用和配置文件一样的名字,但是多了一个M,表示是module文件,本例中就是BlinkM,也就是我们上一篇当中提到的module文件所对应的组件。
第三,因为程序中用到了LED,所以需要系统提供的ledc。
没办法,这个是只有多看系统lib才行。
第四,因为程序需要时间控制,所以用到系统提供的timer(或者是用户定义的singletimer,其实用户定义的singletimer依然是调用了系统的timer. 后面会附上修改好去掉simpletimer的blink代码,需要的同学自己看)总结,没有任何好方法,只有对系统熟悉,才能完成对底层的控制,必须去了解和学习那些底层的interface,不然是没有办法学习nesC的。
第二步,选择合适的组件之后就需要编写顶层配置文件(configuration)从逻辑上来说,当你选定了组件之后,就需要顶层配置文件来wiring组件们,让他们协同工作,以完成你需要的程序功能。
1.5传感感应程序实例/* Sense Application */Sense是一个简单的感应实例程序。
她定期(periodically)采样传感器的数据,然后显示读取数据的低位,显示在节点的leds灯上。
查看tinyos-2.x/doc/html/tutorial/lesson5.html作为一个在TinyOS系统上传感器的普通教程。
tinyos-2.x/doc/html/tutorial/lesson5.htmlSensing详细说明文档这节课程将介绍TinyOS中的传感器数据采集(acquisition)。
我们将展示(demonstrate)两个传感器程序:一个简单的Sense应用程序用来定期(periodically)的采集传感器数据,然后显示将数据显示在LEDs灯上。
而一个更复杂(sophisticated)的应用Oscilloscope,这个节点定期(periodically)广播他们读取的传感器数据到基站节点。
就像过先前的课程中所描述,用Mote-PC进行串行通信,基站将读取的传感器数据转发到PC上,然后在专用的(dedicated)用户图形界面中进行可视化(visualized)。
目录TinyOS官方教程翻译............................................................................. 错误!未定义书签。
目录 . (1)介绍 (2)Sense应用程序 (2)1.DemoSensorC组件 (5)2.运行Sense应用程序 (5)Oscilloscope应用程序 (6)1.运行Oscilloscope应用程序 (7)运行Java 图形用户界面(Graphical User Interface) (7)相关文档资料 (8)介绍传感是传感器网络不可分割的一部分。
TinyOS中传感是在语法连接模数转换器(analog-to-digital converters【ADCs】):TinyOS应用,例如Oscilloscope或者Sense都是用模数转换器和模数控制器接口来收集传感器数据。
TinyOS启动顺序介绍1、概述在tinyos启动顺序中,有一系列调用语句规定。
Tinyos早些版本使用接口“StdControl”来进行系统初始化并启动所需的软件系统。
在多个硬件平台上实践发现“StdControl”接口不能满足要求,因为其只能提供同步接口。
另外,“StdControl”只在启动时绑定初始化概念,同时包括能源管理和服务控制。
TinyOS 2.x可解决这些问题,通过将StdControl分成三个独立的接口:初始化、启动和停止组件、通知mote已经启动。
本文记录了tinyos启动顺序和其语义原由。
2、TinyOS 1.x Boot Sequence大多mote平台中,TinyOS 1.x启动顺序是一样的(TOSSIM启动顺序完全不同,因为是PC中的项目)。
RealMain模块实现main()。
module RealMain{uses{command result_t hardwareInit();interface StdControl;interface Pot;}}Main()函数是nesC和C混合。
int main()__attribute__((C,spontaneous)){call hardwareInit();call Pot.init(10);TOSH_sched_init();call StdControl.init();call StdControl.start();__nesc_enable_interrupt();while(1){TOSH_run_task();}}存在好几个问题。
这些调用只是用于旧平台上:Pot组件涉及到mica可变电位器计,用于控制转发能量,在其他平台是stub component调用--TOSH sched init and TOSH run task–都是C函数,可在其他组件中实现,通过include命令自动包括其所在文件。
从nesC组件模型分离依赖这些函数比平常的tinyos更困难。
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 lilosudo lilo -M /dev/SD a mbr5.重启系统,问题解决4.使用root登录系统2、在Ubuntu系统下安装TinyOS我安装的时TinyOS2.1.1,安装过程参考TinOS官网的安装指导,但有问题,具体步骤如下:1)在系统的“/etc/apt/sources.list”中,添加如下代码:deb /tinyo ... lt;distribution> main<distribution>可以为(edgy,feisty,gutsy,hardy,jaunty,k ARM ic,lucid)例如 deb /tinyos/dists/ubuntu hardy main以上的源可能有问题,在安装是提示tinyos-2.1.1依赖的包找不到或无法安装,更新源如下解决此问题:deb /tinyos/dists/ubuntu hardy maindeb /tinyos oneiric main2)更新知识库,打开终端,输入sudo apt-get update3)安装TinyOSsudo apt-get install tinyos提示可选的tinyos的版本,选择最新的版本2.1.1sudo apt-get install tinyos-2.1.14)设置环境变量在~/.bashrc或者~/.profile中加入如下代码#Sourcing the tinyos environment variable setup scriptsource /opt/tinyos-2.1.1/tinyos.sh可用如下方法打开~/.bashrc或者~/.profilegedit ~/.bashrc添加成功后需要重新启动终端5)测试是否安装成功cd /opt/tinyos-2.1.1/apps/Blink/(若当前文件夹没有权限创建文件,将Blink复制到当前用户的目录进行运行)make telosb显示如下则安装成功:mkdir -p build/telosbcompiling BlinkAppC to a telosb binaryncc -obuild/telosb/main.exe -Os-O -mdisable-hwmul -fnesc-separator=__ -Wall -Wshadow -Wnesc-all-target=telosb -fnesc-cfile=build/telosb/app.c -board=-DDEFINED_TOS_AM_GROUP=0x22-DIDENT_APPNAME=/"BlinkAppC/"-DIDENT_USERNAME=/"root/"-DIDENT_HOSTNAME=/"ubuntu/"-DIDENT_USERHASH=0xa3473ba6L-DIDENT_TIMESTAMP=0x4c566efbL-DIDENT_UIDHASH=0xd972ea96L BlinkAppC.nc -lmcompiled BlinkAppC to build/telosb/main.exe2648 bytes in ROM54 bytes in RAMMSP430-objcopy --output-target=ihexbuild/telosb/main.exe build/telosb/main.ihexwriting TOS imageTinyOS学习笔记2-TinyOS的IDE-Yeti23.测试TinyOS中的Toosim∙make micaz sim∙提示找不到python2.5∙查看本机python的版本,我的版本为2.6∙进入/opt/tinyos-2.1.1/support/make/sim.extra∙修改python的版本PYTHON_VERSION=2.6∙重新make micazsim∙提示*** Successfullybuilt micaz TOSSIM library.则可运行tossim。
TinyOS/nesC编程参考手册第一部分序言阅读本书的前提:1.你对于C/C++/JAVA有一定的了解,并且理解指针。
2.你已经学过本科级别的操作系统课程,并且理解并发、中断和抢占。
第一章链接与命名空间在TinyOS上编程可能是比较具有挑战的,因为它需要使用一种新的语言,nesC。
但是,nesC 与 C非常相似。
这种实现新系统或协议的学习曲线并不陡峭。
相反,把新的代码与现有的相合并才是困难的开始。
nesC与C最大的不同之处在于其链接模型。
这种挑战和复杂性体现在将一组构件在使用的应用程序中组合起来,而非软件构件的书写上。
为了理解为什么这往往是困难的,接下来我们将重温链接是如何在C/C++/JAVA中工作的,以及这些语言中它是如何影响的代码的良好结构。
然后,我们会测试在nesC中链接是如何工作的,这样,区别就是显而易见的了。
我们的目的并非从系统的角度去看符号表和虚拟函数的链接而是从一个程序员的角度来看。
1.1CC语言有一个独立的全局命名空间给函数和变量使用(为了方便,以下我们把两者都称之为变量)。
一个C的源文件可以声明一个变量以以下的三种方式:声明、定义以及引用。
声明语句表示变量存在,并给出他的属性信息。
一个变量可以被多次声明,举个例子,以下是一份POSIX系统的基础声明:int read(intfd, void* buf, size_t count);声明与实现不同,它只是陈述变量在哪里存在,以及其他代码可以引用它。
调用函数,分配地址,或者载入全部的引用。
比如,以下代码表示变量result为val的引用:result = read(fd, &val, 1);C的编译器一般认为变量在引用前被声明。
当然也有一些例外(一些编译器发出警告,如果你引用一个未声明的函数,并希望他们在稍后声明),但引用的未声明的变量是通常是糟糕的C程序。
定义是最后一种声明的方式。
声明表示变量存在,引用使用变量,而定义实际创建它。
Tinyos操作系统简介Tinyos简介最近看了篇关于TinyOS简介的文章,摘录出来保存下,介绍tinyos编程入门的资料不少,但从操作系统的角度分析tinyos是有必要的,毕竟TinyOS做为无线传感网络操作系统中最重要的一种,也是最常用的一种,分析它的实现机制有助于以后改进针对无线传感网络的操作系统,也是嵌入式操作系统的一类。
An open-source operating system designed for wireless embedded sensor network. More specifically, it is designed to support the concurrency intensive operations required by networked sensors with minimal hardware requirements.TinyOS Features• No Kernel: Direct hardware manipulation.• No Process Management: Only one process on the fly.• No Virtual Memory: Single linear physical address space.• No S/w Signal or Exception: Function call instead.• No User Interface, power constrained.• Unusually application specific H/w and S/w.• Multiple flows, concurrency intensive bursts.• Extremely passive vigilance (power saving).• Tightly coupled with the application.• Simulator: TOSSIM, PowerTOSSIM• Written in “nesC” Language, a dialect of the …C? language.TinyOS uses multi-hop routing instead of point-to-point connections to savetransmission power. Route discovery is done by 2-hop broadcast and topologydiscovery is based on shortest path from each node to the base station.• The paradigm for network transmissions in TinyOS is active messaging. Messages contain a handler address and on arrival this handler is called.• TinyOS Architecture• Component Based Architecture: enables rapid innovation and implementation while minimizing code size as required by the severe memory constraints inherent in sensor networks.• Small footprint: fits in 178 Bytes of memory.• Event based instead of threaded architecture.start and stop are commands.fired is a event invoked by Timer.The interface specifies: Timer must implement startand stop, Application must implement fired.o Propagates events in time it takes to copy 1.25 Bytes.o Switches context in the time to copy 6 Bytes ofMemory.• Radio and Clock have interrupts.• Non-blocking/Non-preemptive Scheduling: Tasks will not preempts other tasks and run in FIFO order but only interrupts and associated events can preempt tasks.Toavoid blocking scenarios, events and commands are expected to do only state transmissions and leave complex computations to tasks thatcan be preempted if necessary. This simple concurrency model istypically sufficient for I/O centric applications, but its difficulty with CPU-heavy applications has led to severalproposals for incorporating threads into the OS.• TinyOS has a Single Stack: TinyOS uses a simple queue with length7 and a two level scheduling. Therefore, all I/O operations that last longer than a few hundredmicroseconds are asynchronous and have a callback. A TinyOS component can post a task, which the OS will schedule to run later.• To support larger computations, TinyOS provides t asks, which are similar to a Deferred Procedure Call and interrupt handler bottom halves. Latest version of TinyOS has numerous improvements such as: Safe TinyOS , a compile-time optionthat lets us incorporate run-time memory safety checks into oour application, TOSThreads , a threading library that runs on top of a standard TinyOS core etc.。
面向 TelosB: : TinyOS 编程快速上手信息技术研究所老段总结、整理面向 TelosB:TinyOS 编程快速上手(by: 老段) Ver: 1.0第一章 简介及环境安装1.1 TinyOS 简介TinyOS 是 UC Berkeley(加州大学伯克利分校)开发的开放源代码操作系统,专为嵌入式无 线传感网络设计,操作系统基于构件(component-based)的架构使得快速的更新成为可能,而这 又减小了受传感网络存储器限制的代码长度。
1.2 TelosB 简介TelosB 全称是 CrossBow(柯思博)公司 Telos 系列节点的 Rev. B。
在无线传感器网络中,每 一个实体元素叫做传感器节点。
TelosB 就是其中一种节点。
如右图所示, 节点大小约有 U 盘尺寸, 上面是电路板,下面是电池槽。
具体的参数如下: 技术起源 CPU 通信芯片 通信电波 MAC 协议 外部闪存 天线 操作系统 写入程序 供电 温湿度感知部件 光感知部件 LED 加州大学伯克利分校 8MHz TI MSP430, 10KB RAM CC2420 2.4GHz,250Kbps 高速数据传输 IEEE 802.15.4 / ZigBee 1M Flash 内置,集成在电路板内 TinyOS 1.1 或更高 通过 USB 端口写入 两节 AAA 电池(5 号电池) Sensirion Sht11 Hamamatsu S1087(S1087-1) 3 个,分别为 0(Red), 1(Green), 2(Blue)1.3 Windows 下 TinyOS2.x 的安装1.3.1 安装 JDKjdk-1_5_0_04-windows-i586-p.exe面向 TelosB:TinyOS 编程快速上手(by: 老段) Ver: 1.0面向 TelosB:TinyOS 编程快速上手(by: 老段) Ver: 1.0设置 windows 中 3 个环境变量(JAVA_HOME、CLASSPATH、PATH) JAVA_HOME 设置成 C:\Program Files\Java\jdk1.5.0_04,注意和上图中安装的目录有所差异。