Tinyos相关资料

来源:互联网 发布:把excel数据分级 编辑:程序博客网 时间:2024/06/01 17:11

1. tinyos和普通的os的不同点

它们的应用场景不一样,tinyos是一个开源的构件化操作系统,它采用构件化描述语言nesC进行开发,主要针对资源非常有限的无线传感器网络节点而设计。

    与一般的嵌入式操作系统相比,TinyOS有其自身的特点:采用模块化设计,所以核心尺寸小(一般来说核心代码和数据大概在400Bytes左右),可突破无线传感器网络存储资源少的限制;基于可重用组件的体系结构;使用事件驱动模型,通过事件触发来唤醒CPU工作;单一任务栈;内核非常简单,甚至在严格意义上说,称不上内核;没有进程管理和虚拟存储。这些特点使得TinyOS非常适合无线传感器网络的需求,所以它得到了广泛应用。

TinyOS采用基于组件的编程模型,应用程序由一个或多个组件构成。组件包括两类:模块(module)和配置(configuration),组件间通过配置文件连接在一起,形成一个可执行程序。组件提供或使用接口,这些接口是双向的并且是访问组件的唯一途径。每个接口都定义了一系列函数,包括命令(command)和事件(event)两类。对于命令,接口的提供者必须实现它;而对于事件,接口的使用者必须提供实现。组件的功能模块如图1所示,它包括一组命令处理函数、一组事件处理函数、一组任务集合和一个描述状态信息和固定数据结构的框架。除了WSNOS提供的处理器初始化、系统调度和C运行时库(C Run-Time3个组件是必需的以外,每个应用程序可以非常灵活地选择和使用WSNOS组件。

TinyOS 简介

TinyOS 系统、库及应用程序都是用nesC 语言写的语言写的,这时一种新的用于编写结构化的基于组件的应用程序的语言。nesC 语言主要用于诸如传感器网络等嵌入式系统。nesC具有类似于C 语言的语法,但支持TinyOS 的并发模型,同时具有机构化机制、命名机制,能够与其他软组件链接在一起从而形成一个鲁棒的网络嵌入式系统。其主要目标是帮助应用程序设计者建立可易于组合成完整、并发式系统的组件,并能够在编译时执行广泛的检查。TinyOS 定义了许多在nesC 中所表达的重要概念。首先,nesC 应用程序要建立在定义良好、具有双向接口的组件之上。其次,nesC 定义了并发模型,该模型是基于任务(task)及硬件事件句柄(hardware event handler)的,在编译时会检测数据争用(data race)。

1、组件

1)说明

任何一个nesC 应用程序都是有一个或多个组件链接起来,从而形成一个完整的可执行程序的。组件提供(provide)并使用(use)接口。这些接口是组件的唯一访问点并且它们是双向的。接口声明了一组函数,称为命令(command),接口的提供者必须实现它们;还声明了另外一组函数,称为事件(event),接口的使用者必须实现它们。对于一个组件而言,如果它要使用某个接口中的命令,它必须实现这个接口的事件。一个组件可以使用或提供多个接口以及同一个接口的多个实例。

2)实现

nesC 中有两种类型的组件,分别称为模块(module)和配置(configuration)。模块提供应用程序代码,实现一个或多个接口;配置则是用来将其它组件装配起来的组件,将各个组件所使用的接口与其它组件提供的接口连接在一起。这种行为称为导通(wiring)。每个nesC 应用程序都由一个顶级配置所描述,其内容就是将该应用程序所用到的所有组件导通起来,形成一个有机整体。

nesC 的所有源文件,包括interfacemodule 和配置,其文件后缀(扩展名)都是“.nc”。

2、并发模型(Concurrency Model

TinyOS 一次仅执行一个程序。组成程序的组件来自于两个方面,一部分是系统提供的组件,另一部分是为特定应用用户自定义的组件。程序运行时,有两个执行线程:一个称为任务(task),另一个称为硬件事件句柄(hardware event handler)。任务是被延期执行的函数,它们一旦被调度,就会运行直至结束,并且在运行过程中不准相互抢占。硬件事件句柄是用来相应和处理硬件中断的,虽然也要运行完毕,但它们可能会抢占任务或其他硬件事件句柄的执行。命令和事件要作为硬件事件句柄的一部分而执行必须使用关键字async 来声明。因为任务和硬件事件句柄可能被其他异步代码所抢占,所以nesC 程序易于受到特定竞争条件的影响,导致产生不一致或不正确的数据。避免竞争的办法通常是在任务内排他地访问共享数据,或访问所有数据都使用原子语句。nesC 编译器会在编译时向程序员报告潜在的数据争用,这里面可能包含事实上并不可能发生的冲突。 如果程序员确实可以担保对某个数据的访问不会导致麻烦,可以将该变量使用关键字norace 来声明。但使用这个关键字一定要格外小心。

 

2.  cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购)。它对于学习unix/linux操作环境,或者从unixwindows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,非常有用。随着嵌入式系统开发在国内日渐流行,越来越多的开发者对cygwin产生了兴趣。

  cygnus当初首先把gccgdbgas等开发工具进行了改进,使他们能够生成并解释win32的目标文件。然后,他们要把这些工具移植到windows平台上去。一种方案是基于win32 api对这些工具的源代码进行大幅修改,这样做显然需要大量工作。因此,他们采取了一种不同的方法——他们写了一个共享库(就是cygwin dll),把win32 api中没有的unix风格的调用(如fork,spawn,signals,select,sockets等)封装在里面,也就是说,他们基于win32 api写了一个unix系统库的模拟层。这样,只要把这些工具的源代码和这个共享库连接到一起,就可以使用unix主机上的交叉编译器来生成可以在windows平台上运行的工具集。以这些移植到windows平台上的开发工具为基础,cygnus又逐步把其他的工具(几乎不需要对源代码进行修改,只需要修改他们的配置脚本)软件移植到windows上来。这样,在windows平台上运行bash和开发工具、用户工具,感觉好像在unix上工作。

关于cygwin实现的更详细描述,请参考http://cygwin.com /cygwin -ug-net/highlights.html. rpm插件在uil文件夹中,安装时可分部安装或卸载。

3. JDK(Java Development Kit)Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDKSoftware development kit)。

  JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握 JDK是学好Java的第一步。最主流的JDKSun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDKBEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBMJDK包含的JVMJava Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。

  

SUNJDK5.0开始,提供了泛型等非常实用的功能,其版本信息也不再延续以前的1.21.31.4,而是变成了5.0,6.0了。从6.0开始,其运行效率得到了非常大的提高,尤其是在桌面应用方面。

  JDK本身使用了Java语言编写,在我们下载的安装包里,有一个src.zip,里面就是JDK的源代码。

[编辑本段]版本

  SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE

  EE(J2EE),enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE

  ME(J2ME),micro edtion,主要用于移动设备、嵌入式设备上的java应用程序,JDK 5.0开始,改名为Java ME

[编辑本段]组成

  JDK包含的基本组件包括:

  ·javac – 编译器,将源程序转成字节码

  ·jar – 打包工具,将相关的类文件打包成一个文件

  ·javadoc – 文档生成器,从源码注释中提取文档

  ·jdb debugger,查错工具

  ·java – 运行编译后的java程序(.class后缀的)

  appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。

  Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。

  JavapJava反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。

  Jconsole: Java进行系统调试和监控的工具

[编辑本段]常用的package

  java.lang: 这个是系统的基础类,比如String等都是这里面的,这个package是唯一一个可以不用import就可以使用的Package

  java.io: 这里面是所有输入输出有关的类,比如文件操作等

  java.net: 这里面是与网络有关的类,比如URL,URLConnection等。

  java.util : 这个是系统辅助类,特别是集合类Collection,List,Map等。

  java.sql: 这个是数据库操作的类,Connection, StatememtResultSet

  javax.servlet: 这个是JSP,Servlet等使用到的类

  JDK的环境配置

  在WIN下:

  java运行环境安装与测试及HelloWorld的实现。

  1.下载j2sdk 1.4.1或更高版本 (http://java.sun.com,建议同时下载其Java Documentation,这是Java帮助文档)

  2.运行刚刚下载的j2sdk-1_4_1_02-windows-i586.exe文件进行正式安装(以下假设安装于c:/j2sdk1.4.1,建议安装路径不要有空格,不宜安装在/Program Files目录下!)

  3.设置运行环境参数:a.如果是Win95/98,在/autoexec.bat的最后面添加如下3行语句:

  set JAVA_HOME=c:/j2sdk1.4.1

  set PATH=%JAVA_HOME%/bin;%PATH%

  set CLASSPATH=.;%JAVA_HOME%/lib

  注意:---可用dos命令notepad c:/autoexec.bat打开记事本,加入上面的3行语句。

  b.如果是Win2000xp使用鼠标右击“我的电脑”->属性->高级->环境变量

  系统变量->新建->变量名:JAVA_HOME 变量值:c:/j2sdk1.4.1

  系统变量->新建->变量名:CLASSPATH 变量值:.;%JAVA_HOME%/lib

  系统变量->编辑->变量名:Path 在变量值的最前面加上:%JAVA_HOME%/bin;

  (CLASSPATH中有一英文句号“.”后跟一个分号,表示当前路径的意思)

  4.使用文本编辑器(比如:edit.com/记事本/UltraEdit/EditPlus)编写如下代码,并保存为文件:HelloWorld.java(必须大小写正确!假设为c:/test/HelloWorld.java

  /* HelloWorld.java */

  public class HelloWorld {

  public static void main(String arg[]) {

  System.out.println("Hello, World!");

  }

  }

  5.开启一个DOS窗口,CD(就是跳转/Change Directory)到HelloWorld.java所在的目录中

  c:/>cd /test

  c:/test>_

  6.编译HelloWorld.javaHelloWorld.class

  c:/test>javac HelloWorld.java

  7.运行HelloWorld.class

  c:/test>java HelloWorld

  Hello, World!

  c:/test>_

  注意:--------如果出现的

  Exception in thread "main" java.lang.NoClassDefFoundError:helloworld/javaerror:ccan'n read:HelloWorld.java

  之类的错误,那么是把javac java写反了。

  ---------如果出现Bad command or file name

  说明javac命令没起作用,需要:c:/>set path="c:/jdk/bin"

  用这个命令注册BIN目录里的命令

  ---------还要注意大小写。

  在LINUX下:

  Ubuntu Linuxjdk的安装与配置

  1.安装

  从sun公司网站www.sun.com下载linux版本的jdk,我下载的版本是JDK 6 Update 7

  ,http://java.sun.com/javase/downloads/index.jsp

  jdk-6u7-linux-i586.bin,打开终端,用cd命令进入jdk所在目录,执行复制命令

  sudo cp jdk-6u7-linux-i586.bin /usr

  即将jdk复制到/usr目录下,

  然后进入/usr目录

  cd /usr

  执行权限

  chmod +x jdk-6u7-linux-i586.bin

  执行安装命令

  ./jdk-6u7-linux-i586.bin

  如遇错误,可先切换至root用户下,su root,再执行安装命令

  安装成功会在/usr目录下生成jdk1.6.0_07目录,就是jdk的安装目录

  重启电脑,打开终端,输入java -version

  如若有显示java的版本信息,则表示安装成功,

  2.配置

  安装成功后需要配置jdk环境变量

  用cd命令进入/etc目录

  sudo vi profile

  即执行编辑profile文件命令

  在umas k022前添加如下内容:

  export JAVA_HOME=/usr/jdk1.6.0_07

  export JRE_HOME=/usr/jdk1.6.0_07/jre

  export PATH=$PATH:/usr/jdk1.6.0_07/bin

  export CLASSPATH=./:/usr/jdk1.6.0_07/lib:/usr/jdk1.6.0_07/jre/lib

  保存退出,重启电脑

  3.测试

  新建Test.java

  public class Test{

  public static void main(String[] args){

  System.out.println("Hello,Welcome to Linux World!");

  }

  }

  在终端用cd命令进入Test.java目录,然后输入

  javac Test.java

  java Test

  若输出

  Hello,Welcome to Linux World!

  则表明配置成功!

  如不能通过编译,可通过重新启动系统试试

  4.注意

  在用vi命令编辑profile文件时,Linux初学者可能还不熟用

  sudo vi profile进入编辑文件后如出现

  Press ENTER or type command to continue

  则按回车

  然后按方向键“下”直到umas k022前一行

  按字母o进入编辑状态

  输入环境变量内容

  回车,按几次ESC键,直到听到""声,输入

  :x

  回车

  即保存退出

至此,Linux jdk环境变量配置完成

 

安装在不同的目录。。。喜欢用那个jdk就用那个版本的(修改pathclasspath即可);
----------------------------------
补充问题回答:
假设你jdk 1.5jdk1.6的安装目录分别是D:/java/jdk1.5 D:/java/jdk1.6

当你想用jdk1.5的时候 你的环境变量就这样设:
JAVA_HOME: D:/java/jdk1.5
CLASSPATH: D:/java/jdk1.5/lib
PATH: D:/java/jdk1.5/bin

当你想用jdk1.6的时候 你的环境变量就这样设:
JAVA_HOME: D:/java/jdk1.6
CLASSPATH: D:/java/jdk1.6/lib
PATH: D:/java/jdk1.6/bin

06年)JDK1.6:因为它太危险。我的意思并不是说JDK1.6不可以用,只是想给Sun几个月时间来继续巩固它,以使它更加稳定。还有当我不确定正在使用的操作系统平台是否支持JDK1.6之前,并不打算让其他人升级到JDK1.6。我这并不是守旧,只是JDK1.6对于广泛发售的应用程序来说,并不是一个正确的选择。

JDK1.4Sun很可能在未来两年将继续支持JDK1.4(这只是我的假设)。还有就是Sun也保证JDK1.4可以运行在Windows Vista上,但我必须假设JDK1.4在不久将来不被支持,而不是被支持两年。另外,JDK1.4已经发行很久了,它的有些功能已经过时了。自从我看了Vista的开发日志后,就感觉将程序建立在JDK1.4上有些危险,因为,Vista的开发日志说,Sun的开发人员并不会将精力放到JDK1.4Vista的支持上。如果JDK1.4无法得到足够的重视,那它很可能在JDK1.51.6成为主流时,得不到足够的支持。

    
我们选择了JDK1.5,为什么呢?

JDK1.5 因为它可以在OSX10.4及以上的版本中良好地运行,而且它至少可以在Windows XP及以上版本中运行,JDK1.5是十分成熟和稳定的,其实,真正的原因是我必须使用annotations(注释)和generics(泛型)进行编程。还有就是JDK1.5有我要使用的所有的功能

    
对于我们来说,只有一个地方使用了JDK1.6,那就是在一个支持动态语言的服务器程序中。在这个应用程序中,我并不是使用Java字节码进行操作,而是通过脚本语言对这个服务器程序进行完全的控制。

原创粉丝点击