文档库 最新最全的文档下载
当前位置:文档库 › tinyos资料

tinyos资料

tinyos资料
tinyos资料

TinyOS是一个开源的嵌入式操作系统,它是由加州大学的伯利克分校开发出来的,主要应用于无线传感器网络方面。它是基于一种组件(Component-Based)的架构方式,使得能够快速实现各种应用。TinyOS的程序采用的是模块化设计,所以它的程序核心往往都很小(一般来说核心代码和数据大概在400 Bytes左右),能够突破传感器存储资源少的限制,这能够让TinyOS很有效的运行在无线传感器网络上并去执行相应的管理工作等。TinyOS 本身提供了一系列的组件,可以很简单方便的编制程序,用来获取和处理传感器的数据并通过无线电来传输信息。TinyOS是一个开源的嵌入式操作系统,它是由加州大学的伯利克分校开发出来的,主要应用于无线传感器网络方面。它是基于一种组件(Component-Based)的架构方式,使得能够快速实现各种应用。TinyOS的程序采用的是模块化设计,所以它的程序核心往往都很小(一般来说核心代码和数据大概在400 Bytes左右),能够突破传感器存储资源少的限制,这能够让TinyOS很有效的运行在无线传感器网络上并去执行相应的管理工作等。TinyOS本身提供了一系列的组件,可以很简单方便的编制程序,用来获取和处理传感器的数据并通过无线电来传输信息。TinyOS在构建无线传感器网络时,它会有一个基地控制台,主要是用来控制各个传感器子节点,并聚集和处理它们所采集到的信息。TinyOS 只要在控制台发出管理信息,然后由各个节点通过无线网络互相传递,最后达到协同一致的目的,比较方便。

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

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

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

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

2、并发模型(Concurrency Model)

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

2. cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购)。它对

于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,非常有用。随着嵌入式系统开发在国内日渐流行,越来越多的开发者对cygwin产生了兴趣。

cygnus当初首先把gcc,gdb,gas等开发工具进行了改进,使他们能够生成并解释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实现的更详细描述,请参考https://www.wendangku.net/doc/f59019627.html, /cygwin -ug-net/highlights.html. rpm 插件在uil文件夹中,安装时可分部安装或卸载。

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

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

从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本信息也不再延续以前的1.2,1.3,1.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过程的头文件。

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

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

[编辑本段]常用的package

https://www.wendangku.net/doc/f59019627.html,ng:这个是系统的基础类,比如String等都是这里面的,这个package是唯一一个可以不用import就可以使用的Package

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

https://www.wendangku.net/doc/f59019627.html,: 这里面是与网络有关的类,比如URL,URLConnection等。

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

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

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

JDK的环境配置

在WIN下:

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

1.下载j2sdk 1.4.1或更高版本(https://www.wendangku.net/doc/f59019627.html,,建议同时下载其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 JA V A_HOME=c:\j2sdk1.4.1

set PATH=%JA V A_HOME%\bin;%PA TH%

set CLASSPATH=.;%JA V A_HOME%\lib

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

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

系统变量->新建->变量名:JA V A_HOME 变量值:c:\j2sdk1.4.1

系统变量->新建->变量名:CLASSPATH 变量值:.;%JA V A_HOME%\lib

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

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

4.使用文本编辑器(比如:https://www.wendangku.net/doc/f59019627.html,/记事本/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.java为HelloWorld.class

c:\test>javac HelloWorld.java

7.运行HelloWorld.class

c:\test>java HelloWorld

Hello, World!

c:\test>_

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

Exception in thread "main" https://www.wendangku.net/doc/f59019627.html,ng.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 Linux下jdk的安装与配置

1.安装

从sun公司网站https://www.wendangku.net/doc/f59019627.html,下载linux版本的jdk,我下载的版本是JDK 6 Update 7

,https://www.wendangku.net/doc/f59019627.html,/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 JA VA_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 CLASSPA TH=./:/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就用那个版本的(修改path,classpath即可);

----------------------------------

补充问题回答:

假设你jdk 1.5和jdk1.6的安装目录分别是D:\java\jdk1.5 和D:\java\jdk1.6

当你想用jdk1.5的时候你的环境变量就这样设:

JA V A_HOME: D:\java\jdk1.5

CLASSPATH: D:\java\jdk1.5\lib

PATH: D:\java\jdk1.5\bin

当你想用jdk1.6的时候你的环境变量就这样设:

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

重视,那它很可能在JDK1.5和1.6成为主流时,得不到足够的支持。

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

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

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

本文来自CSDN博客,转载请标明出处:https://www.wendangku.net/doc/f59019627.html,/ricks_wu/archive/2009/06/30/4311211.aspx

Tinyos操作系统简介

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

TinyOS在windows中安装步骤

1.TinyOS 1.1概要 TinyOS应用程序都是有一个或多个组件链接起来,从而形成一个完整的可执行程序。组件中实现了功能接口,同时也能使用其它组件提供的接口。 在接口定义中可以申明命令函数和事件函数,命令函数由接口提供者实现,事件函数由接口使用者实现。对于一个组件而言,如果它要使用某个组件接口中的命令,它必须实现这个接口的事件。一个组件可以使用或提供多个接口以及同一个接口的多个实例。 组件有两种类型:模块(module)和配置(configuration)。模块提供应用程序代码,实现一个或多个接口;配置则是用来将其它组件装配起来,将各个组件所使用的接口与其它组件提供的接口连接在一起,进行导通。每个应用程序都由一个顶级配置所描述,其内容就是将该应用程序所用到的所有组件导通起来,形成一个有机整体。 TinyOS应用程序必须包含Main 组件,Main组件是首先被执行的一个组件。确切的说,在TinyOS 中执行的第一个命令是Main.StdControl.init(),接下来是Main.StdControl.start()。 Main组件完成以下功能:芯片初始化,外围电路初始化,操作系统调度数据结构初始化,子组件初始化,启动子组件件,进入调度死循环从而将控制权交给操作系统,一旦没有任务可以调度就进入休眠状态以降低系统功耗。 TinyOS的调度系统是TinyOS系统的核心部分。它采用先进先出的排队策略,任务之间不可以抢占,但是中断可以抢占任务,中断是否可以抢占中断则是应用程序自己控制的。即如果中断处理程序进入中断以后执行了关中断的操作,那么这个中断将是不可抢占的,否则在服务的过程中就有可能被抢占掉。另外还要注意,在中断服务程序里面是可以创建任务的。 1.2在Cygwin下的安装 在/etc/bash.bashrc文件中增加以下内容: export TOSROOT=/opt/tinyos-2.x export TOSDIR=$TOSROOT/tos export CLASSPATH=C:\cygwin\opt\tinyos-2.x\support\sdk\java\tinyos.jar export CLASSPATH="$CLASSPATH;." export MAKERULES=$TOSROOT/support/make/Makerules export PATH=/opt/msp430/bin:/opt/jflashmm:$PATH 安装以下软件包: rpm -ivh --ignoreos c:/downloads/avr-binutils-2.17tinyos-3.cygwin.i386.rpm rpm -ivh --ignoreos c:/downloads/avr-gcc-4.1.2-1.cygwin.i386.rpm rpm -ivh --ignoreos c:/downloads/avr-libc-1.4.7-1.cygwin.i386.rpm rpm -ivh --ignoreos c:/downloads/avarice-2.4-1.cygwin.i386.rpm rpm -ivh --ignoreos c:/downloads/avr-insight-6.3-1.cygwin.i386.rpm

安装TinyOS需要六个步骤

安装TinyOS需要六个步骤。 1.Installing a Java 1.5 JDK. 安装java jdk 1.5需要配置环境变量 2.Install Cygwin. 安装Windows下的Linux模拟器,cygwin 3.Installing native compilers. 安装单片机工具,AVR或MSP430,根据自己需要。 4.Installing the nesC compiler. 安装nesC和TinyOS_tool 5.Installing the TinyOS source tree. 安装TinyOS2.0.2主文件。 6.Installing the Graphviz visualization tool 安装Graphviz并配置环境变量 一.安装JDK 1.5 下载JDK 2.5 在SUN的官方网站https://www.wendangku.net/doc/f59019627.html,/. 安装并配置JDK的环境变量。 二.安装Cygwin 下装Cygwin-1.2a于https://www.wendangku.net/doc/f59019627.html,/dist-1.2.0/tools/windows/cygwin-1.2a.tgz 这个版本TinyOS官方测试过,和TinyOS兼容度高。 三.安装单片机工具 下载以下五个rpm包 1.avr-binutils- 2.15tinyos- 3.cygwin.i386.rpm(https://www.wendangku.net/doc/f59019627.html,/di st-2.0.0/tools/windows/avr-binutils-2.15tinyos- 3.cygwin.i386.rpm) 2.avr-gcc- 3. 4.3-1.cygwin.i386.rpm(https://www.wendangku.net/doc/f59019627.html,/dist-2.0.0/t ools/windows/avr-gcc-3.4.3-1.cygwin.i386.rpm) 3.avr-libc avr-libc-1.2.3-1.cygwin.i386.rpm(https://www.wendangku.net/doc/f59019627.html,/dist-2.0.0/too ls/windows/avr-libc-1.2.3- 1.cygwin.i386.rpm) 4.avarice avarice-2.4-1.cygwin.i386.rpm(https://www.wendangku.net/doc/f59019627.html,/dist-2.0.0/tools/ windows/avarice-2.4-1.cygwin.i386.rpm) 5.insight (avr-gdb) avr-insight- 6.3-1.cygwin.i386.rpm(https://www.wendangku.net/doc/f59019627.html,/dist-1.2.0/to ols/windows/avr-insight-6.3 -1.cygwin.i386.rpm) 下载完成之后把五个包都拷贝到Cygwin的tmp文件夹(在Windows操作即可) 依次安装(要按照顺序安装,它们之间有依赖关系),安装命令如下。 cd /tmp

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,我是在这里下载的:https://www.wendangku.net/doc/f59019627.html,/index.php/Installing_TinyOS_2.0.2#Manual_installation_on_your_host_OS_with_RPMs,在Setp 2: Install Cygwin中第一步有个cygwin-files.zip,点击即可下载。 这个地址好像也可以下载:https://www.wendangku.net/doc/f59019627.html,rmatik.uni-freiburg.de/people/aslam/cygwin-files.zip (2)安装时先解压下载的cygwin,点击setup.exe即可,默认安装在c盘下。选项基本上不用变,都是默认选项:”install from Local Directory”->Root Directory: c:\cygwin, Install for: All Users, Default Text file type: Unix/Binary->当问到”Select local Package directory”时,选择自己解压的cygwin目录即可,如:“D:/cygwin-files”,最后等一会时间即可完成安装。 (3)启动桌面上的Cygwin快捷图标,cygwin第一次运行会设置一些东西,并创建一个home目录,里面创建了一个用户,名为windows系统的用户名。 注意:此时自己在cygwi菜单n根目录下创建一个opt目录,后面会用到。(如果你安装cygwin后有这个目录就不同了,反正我安装后没有这个目录,后面的操作会在这个目录下自动放置一些文件) 4.下载Tinyos开发必备的编译工具的安装包(共4个) NesC编译工具:nesc-1.3.0-1.cygwin.i386.rpm TinyOS相关工具: tinyos-deputy-1.1-1.cygwin.i386.rpm tinyos-tools-1.3.0-1.cygwin.i386.rpm tinyos-2.1.0-2.cygwin.noarch.rpm 这些东西在这里能够找到(呵呵):https://www.wendangku.net/doc/f59019627.html,/dist-2.1.0/tinyos/windows/ 5.安装上面的rpm包 (1)在/home目录下是你的主目录,我的是.Adminstrator将刚才的那4个rpm包拷贝到\home\Adminstrator下(即C:\Cygwin\home\john下),进入到该目录:cd /home/Adminstrator,ls一下可以看见这4个文件。 (2)安装rpm包 rpm -ivh nesc-1.3.0-1.cygwin.i386.rpm rpm -ivh tinyos-tools-1.3.0-1.cygwin.i386.rpm

TinyOS2.x安装

一.TinyOS安装 官方说明: https://www.wendangku.net/doc/f59019627.html,/tinyos-2.x/doc/html/install-tinyos.html https://www.wendangku.net/doc/f59019627.html,/index.php/Installing_TinyOS_2.1#Manual_installation_on_your_host_OS_ with_RPMs 开发基础:熟悉Linux环境及常用Linux命令;熟悉嵌入式系统开发流程;精通模块设计的思想;能深刻理解交叉编译和MAKE等概念;熟悉C,nesC两种编程语言;对C++,JAVA有一定了解;对ZigBee协议熟悉且具有一定的通信基础,能深刻理解地址、通道等概念。 1.JAVE JDK 安装 首先,我们安装JAVE 开发工具JAVE JDK : Java SE Development Kit (JDK) 5/6下载地址:https://www.wendangku.net/doc/f59019627.html,/javase/downloads/index.jsp 下载的默认文件名为:jdk-6u10-windows-i586-p.exe / jdk-1_5_0-windows-i586.exe 安装过程只需下一步……下一步便可…… 然后,我们需要设置电脑的环境变量,需要新建两个环境变量,以便使用JDK 具体过程如下: 右击我的电脑——〉属性——〉高级——〉环境变量——〉 系统变量(S)栏——〉新建(W)——〉新建系统变量对话框 如下图:

变量名(N):JAVA_HOME 变量值(V):JDK安装的路径,默认路径为:C:\Program Files\Java\jdk1.6.0_10 C:\Program Files\Java\jdk1.5.0 变量名(N):CLASSPATH 变量值(V): .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;;%JAVA_HOME%\bin;%JAVA_HOME%\jr e\bin; 在用户变量的PATH中添加:;%JAVA_HOME%\bin:$PATH;%JAVA_HOME%\jer\bin:$PATH; 在系统变量(S)栏选中变量为Path的选项,点编辑 在变量值(V)的末尾添加:;%JAVA_HOME%\bin; ;%JAVA_HOME%\jre\bin; 系统变量里最好也同样再设置一个CLASSPATH。 这样,我们的环境变量已经设置完毕了。 我们可以编个JAVA小程序测试简单的测试一下: 打开记事本,输入下面这个小程序,另存为HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }

TinyOS 实验报告

实验一.Downloading and installing TinyOS 一、安装JDK (在平台ubuntu12.10搭建) 1.编译一个源文件 终端收入命令:sudo gedit/etc/apt/sources.list.d/partner.list 2.在partner.list文件中添加: 终端输入命令:deb https://www.wendangku.net/doc/f59019627.html,/ubuntu/ hardy multiverse 3.保存该文件并退出,执行下列程序: 终端输入命令:sudo apt-get update 4.下载JDK 终端输入命令: sudo apt-get install sun-java6-bin sun-java6-jre sun-java6-jdk 5.配置JDK环境变量 在主文件下的.bashrc 或者.profile中添加下面语句,或者在终端输入。(关于路径参照自己解压路径) export JAVA_HOME=/usr/lib/jvm/java-6-sun export PATH=$JAVA_HOME/bin:$PATH export classPath=/usr/lib/jvm/java-6-sun 6.在终端中输入java,javac看是否配置正确 终端输入命令:java 或者javac

二、安装tinyOS-2.1.1 1.安装python-dev g++ 终端输入命令:sudo apt-get install python-dev g++ 2.查看python的版本 终端输入命令:python –version (本机是Python 2.7.3) 3.安装tinyos ①.在主文件夹/etc/apt/sources.list中添加一下两行: deb https://www.wendangku.net/doc/f59019627.html,/tinyos/dists/ubuntu natty main deb https://www.wendangku.net/doc/f59019627.html,/tinyos oneiric main 终端输入命令:sudo gedit /etc/apt/sources.list (sources.list 是只读文件,所以必须有root 权限) ②.下载安装tinyos-2.1.1 终端输入命令:sudo apt-get install tinyos-2.1.1 安装完成后,打开/opt/tinyos-2.1.1/support/make/sim.extra, 找到 PYTHON_VERSION=2.5(本机),将2.5换成2.7 ③.终端输入命令:sudo gedit /opt/tinyos-2.1.1/tinyos.env ,在tinyos.env中添加

tinyos任务调度机制

TOSH_sched_init();for(;;){TOSH_run_task();} 这两个函数的实现在tinyos-1.x\tos\system目录下的sched.c源文件中。这个文件就实现了tinyos 1.x的调度策略,很简单吧?闲话少说,下面分析它的数据结构。 typedef struct { void (*tp) (); } TOSH_sched_entry_T; 这个结构体就是tinyos任务队列里的东东,里面是个函数指针。 enum { #ifdef TOSH_MAX_TASKS_LOG2 #if TOSH_MAX_TASKS_LOG2 > 8 #error "Maximum of 256 tasks, TOSH_MAX_TASKS_LOG2 must be <= 8" #endif TOSH_MAX_TASKS = 1 << TOSH_MAX_TASKS_LOG2, #else TOSH_MAX_TASKS = 8, #endif TOSH_TASK_BITMASK = (TOSH_MAX_TASKS - 1) }; 上面定义了tinyos任务队列里的最大任务数TOSH_MAX_TASKS,和一个掩码。 //定义tinyos任务队列,这个队列是个循环队列! volatile TOSH_sched_entry_T TOSH_queue[TOSH_MAX_TASKS]; //“头指针”tinyos任务队列里的第一个不为空的任务的下标 uint8_t TOSH_sched_full; //“尾指针”如果tinyos任务队列没有满,则是最后一个不为空的任务 //的下一个元素的下标;如果任务队列满则是最后一个任务的下标。 volatile uint8_t TOSH_sched_free; 好了,数据结构分析完了,咱们看看tinyos是怎样实现这个队列的吧,实现一个队列,无非就是初始化,增加队列元素,删除队列元素,判断队列是否为空……,数据结构里最基本的东东,想必大家比我清楚了!(如果这个不清楚,赶紧回去看看数据结构 ^_^ )。 一初始化 s 初始化函数很简单,大家肯定都会写了。 void TOSH_sched_init(void) { int i; TOSH_sched_free = 0; TOSH_sched_full = 0; for (i = 0; i < TOSH_MAX_TASKS; i++) TOSH_queue[i].tp = NULL;

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 标注连接的模块,然后对本配件提供的以及与其相对应模块使用以及提供的接口进行配线,如下例: {

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 Virtu al 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 save transmission power. Route discovery is done by 2-hop broadcast and topology discovery 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.

CC2530与无线传感器网络操作系统TinyOS应用实践

CC2530与无线传感器网络操作系统TinyOS应用实践(内附光盘1张) 李外云编著的《CC2530与无线传感器网络操作系统TinyOS应用实践(附光盘)》第1章简要地介绍了物联网特点、体系结构以及802.15.4网络通信协议标准。第2、3章分别介绍了TinyOS的安装方法和基于windows操作系统的TinyOS集成开发环境的配置、交叉编译开发工具的使用方法。第4章介绍了本书所有应用程序开发的硬件平台的组成、软件编程和调试方法。第5章简要地介绍了TinyOS操作系统架构、基于TinyOS操作系统平台的搭建以及CC22530移植的过程和方法。第6、7章详细地介绍了CC2530芯片的内部资源和外设接口等硬件功能模块,以及各功能模块在TinyOS操作系统下的驱动组件的编程方法和应用测试程序。第8、9章详细地剖析了CC22530的无线通信功能、基于TinyOS的主动无线通信消息机制组件的构建,并对CC2530无线通信的发送功率、信道选择、RSSI以及点对点和点对多点无线通信组件的测试过程进行了介绍。第10章以光敏传感器、DS18820温度传感器、SHTxx 温湿度传感器和超声波传感器为例,详细地介绍了在基于TinyOS操作系统的物联网系统中不同类型传感器的驱动编程方法以及测试过程。第11章介绍了TinyOS操作系统的小数据分发协议和汇聚协议的基本原理、组件构成以及多跳路由协议的应用开发。 作者:李外云编著出版社:北京航空航天大学出版社 2章TinyOS开发环境的安装与配置 第3章TinyOS在Windows环境下的集成开发工具 第4章enmote物联网开发平台介绍 第5章TinyOS操作系统与nesC语言编程 第6章CC2530基本接口组件设计与应用 第7章CC2530外设组件接口开发 第8章CC2530射频通信组件设计 第9章CC2530射频通信组件应用 第10章TinyOS传感器节点驱动与应用 第11章TinyOS-2.x网络协议与应用 TinyOS实用编程——面向无线传感网节点软件开发 者:李鸥,张效义,王晓梅,等著出版社:机械工业出版社出版时间:2013年7月 介绍了利用TinyOS开发无线传感器网络应用系统应具备的基础知识,包括TinyOS系统的特点、体系结构、安装与常用命令、简单实例等;详细介绍了TinyOS的编程语言nesC(包括组件、接口、模块、配件与连接、参数化接口、通用组件等),TinyOS系统并发执行模型,驱动程序与硬件抽象,系统主要功能模块,TinyOS典型应用;剖析了应用程序运行过程,对应用程序的仿真、调试和编程提示进行了描述;最后结合应用实例进行系统分析以提高读者对于TinyOS的系统认识。 1.2 无线传感网节点软件技术 1.3 TinyOS 1.3.1 TinyOS的特点 1.3.2 TinyOS体系结构 第2章 TinyOS安装与常用命令 2.1 TinyOS安装 2.1.1 在Windows下安装TinyOS 2.1.2 在Linux下安装TinyOS 2.2 目录结构 2.2.1 Cygwin的目录结构

一步步教你搭建TinyOS2.1.2开发环境

note:看了很多的tinyos的安装教程,差别不是很大,无非就是安装编译器配置环境等。虽然简单,但 还是有很多问题在里面。建议大家使用虚拟机安装,因为虚拟机运行在主机上,完全独立,虚拟机里面的所有操作不会影响主机,即使虚拟崩溃了。windows相对对ubuntu来说,windows的硬件驱动由于是商业化的所以做的比较完善,各种优化策略也比较好。虚拟机推荐大家使用VirtualBOX VirtualBOX 短小精悍,功能比较强大,安装文件比较小,只有几十MB,系统资源占用比较少。当然你也可以使用vmware。 安装虚拟机和ubuntu相信大家已经很熟悉了,如果还没有安装请看这个教程: 好,下面我们正式开始搭建tinyos的开发环境! 文章来源:https://www.wendangku.net/doc/f59019627.html,/tianzhihen_wq/article/details/37505697 步骤1: 如果你以前没有安装过tinyos可以跳过这个步骤,如果你以前安装的是老的版本的tinyos(像2.1.1版本)那么你必须卸载掉有关tinyos的文件以及GCC-430的编译器以及工具等。卸载流程如下:打开终端 (ctrl+alt+t)输入以下命令:卸载tinyos老的版本: sudo apt-get remove tinyos-2.1.1 卸载gcc-msp430编译器: sudo apt-get autoremove --purge msp430* 通过这两步就把你以前老版本的tinyos卸载掉了 步骤2: 在ubuntu的package list file添加源。这个命令使用的是gedit编辑器,当然你也可以使用vim等 sudo gedit /etc/apt/sources.list 下面把以下代码添加到sources.list里面,保存,退出 1.# TinyOS Repository 2.deb https://www.wendangku.net/doc/f59019627.html,/tinyos/dists/ubuntu lucid main 参考以下网址,并将其中内容替换源文件: https://www.wendangku.net/doc/f59019627.html,/article/1876c852aa8c8c890b1376aa.html?qq-pf-to=pcqq.discussion#user consent# 现在执行以下命令更新安装新版本的tinyos(确保网络连接正常ping) sudo apt-get update sudo apt-get install tinyos-2.1.2 现在tinyos的基础工作已经做好,接下来就是完成配置以及安装相应的编译器即可。 步骤3: 改变tinyos文件夹的所有权,才能完成后面的配置:

message_t(Tinyos系统知识点介绍)

Message_t介绍(TEP111英文文档翻译参考) 此文档描述了TinyOS2.x消息缓存的抽象类型"message_t",介绍了消息缓存的设计考虑还有"message_t"在哪和怎样定义,以及数据链路层是应该如何使用它的。"message_t"类型的主要目的是允许报文作为内存的一个连续存储区域以零拷贝的方式在不同的链路层传输。 在TinyOS1.x中,消息缓存是"TOS_Msg".这个消息缓存类型包含了AM包和形如时间戳、应答位、信号长度等包的元数据。"TOS_Msg"是一个固定长度的结构,最大长度值默认为29字节。定长的缓存允许TinyOS1.x拥有零拷贝的语义:当一个组件接收到一个buffer后,它能为低层返回一个指向新buffer的指针,以便接受下一个数据包,而非将此buffer的内容拷贝出去来腾出空间。 一个问题出现了:什么定义了“TOS_Msg”结构,不同的链路层可能需要不同的布局。例如:802.15.4射频器可能需要802.15.4.头(好比CC2420,使用在Telos和micaZ平台),字节射频(例如CC1000,使用在mica2平台)需要定义它自己的包格式。这就意味着不同的平台可能有不同的"TOS_Msg"结构。 TinyOS1.x中的解决办法是只有一个标准的"TOS_Msg"定义,特定平台可以将其重新定义成符合它自己需要的结构,例如一个mica2节点使用如下标准定义:The solution to this problem in typedef struct TOS_Msg{ //The following fields are transmitted/received on the radio. uint16_t addr; uint8_t type; uint8_t group; uint8_t length; int8_t data[TOSH_DATA_LENGTH]; uint16_t crc; //The following fields are not actually transmitted or received //on the radio!They are used for internal accounting only. //The reason they are in this structure is that the AM interface //requires them to be part of the TOS_Msg that is passed to //send/receive operations. uint16_t strength; uint8_t ack; uint16_t time; uint8_t sendSecurityMode; uint8_t receiveSecurityMode; }TOS_Msg; 在使用CC2420射频的平台上,“TOS_Msg”定义为:while on a mote with a CC2420radio(e.g., micaZ),``TOS_Msg``is defined as:: typedef struct TOS_Msg{ //The following fields are transmitted/received on the radio.

TinyOS在windows中安装步骤

T i n y O S在w i n d o w s中 安装步骤 This model paper was revised by the Standardization Office on December 10, 2020

1.TinyOS 1.1概要 TinyOS应用程序都是有一个或多个组件链接起来,从而形成一个完整的可执行程序。组件中实现了功能接口,同时也能使用其它组件提供的接口。 在接口定义中可以申明命令函数和事件函数,命令函数由接口提供者实现,事件函数由接口使用者实现。对于一个组件而言,如果它要使用某个组件接口中的命令,它必须实现这个接口的事件。一个组件可以使用或提供多个接口以及同一个接口的多个实例。 组件有两种类型:模块(module)和配置(configuration)。模块提供应用程序代码,实现一个或多个接口;配置则是用来将其它组件装配起来,将各个组件所使用的接口与其它组件提供的接口连接在一起,进行导通。每个应用程序都由一个顶级配置所描述,其内容就是将该应用程序所用到的所有组件导通起来,形成一个有机整体。 TinyOS应用程序必须包含Main 组件,Main组件是首先被执行的一个组件。确切的说,在TinyOS 中执行的第一个命令是,接下来是。 Main组件完成以下功能:芯片初始化,外围电路初始化,操作系统调度数据结构初始化,子组件初始化,启动子组件件,进入调度死循环从而将控制权交给操作系统,一旦没有任务可以调度就进入休眠状态以降低系统功耗。 TinyOS的调度系统是TinyOS系统的核心部分。它采用先进先出的排队策略,任务之间不可以抢占,但是中断可以抢占任务,中断是否可以抢占中断则是应用程序自己控制的。即如果中断处理程序进入中断以后执行了关中断的操作,那么这个中断将是不可抢占的,否

TOSSIM使用说明

Compiling TOSSIM make micaz sim Running TOSSIM with Python tos的模拟器是在python中运行 运行TOSSIM simulation 用到 runNextEvent function。it returns 0. This means that there was no next event to run. returns 1, there was an event to run. Debugging Statements ?dbg: print a debugging statement preceded by the node ID. ?dbg_clear: print a debugging statement which is not preceded by the node ID. This allows you to easily print out complex data types, such as packets, without interspersing node IDs through the output. ?dbgerror: print an error statement preceded by the node ID ?dbgerror_clear: print an error statement which is not preceded by the node ID TOSSIM's debugging output can be configured on a per-channel basis. So, for example, you can tell TOSSIM to send the "Boot" channel to standard output, but another channel, "RadioCountToLedsC", to a file. 这个channel名可以自己定义,dbg可以通过名字选择性的输出想要的信息。比如t.addChannel("Boot", sys.stdout) 输出channel名为Boot的debug信息,也就是执行到dbg("Boot", "Application booted.\n")这个就会输出,而dbg("my", "Application booted.\n")不会输出,因为没有加入my这个channel

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; } default command error_tSoftwareInit.init() { return SUCCESS; } default event void Boot.booted() { } } ?一旦所有的初始化完成了,MainC的Boot.booted()事件就触发了。组件可以自由地调用start()命令以及其他组件使用的其他命令。 在Blink应用程序里,定时器就是在booted()事件里启动的。这个booted事件 就是TinyOS的main函数 event void Boot.booted() { call Timer0.startPeriodic(TIMER_PERIOD_MILLI); } ?T inyOS就会进入核心的调度循环(core scheduling loop)。只要有任务在排队,调度者就会继续运行。 ?一发现任务队伍为空,调度就会把微处理器调节到硬件资源允许的低能耗状态。处理器进入休眠状态直到它碰到中断。当一个中断到达时,MCU退出休眠模式,运行中断程序 booted事件就是TinyOS的main函数 例子:下面以blink的程序为例进行讲解 Blink组件的顶级配置组件 //BlinkAppC.nc configuration BlinkAppC { } implementation { componentsMainC, BlinkC, LedsC; components new TimerMilliC() as Timer0; components new TimerMilliC() as Timer1; components new TimerMilliC() as Timer2; BlinkC ->MainC.Boot; BlinkC.Timer0 -> Timer0; BlinkC.Timer1 -> Timer1;

相关文档