TinyOs NesC
安装TinyOS需要六个步骤
安装TinyOS需要六个步骤。
1.Installing a Java 1.5 JDK.安装java jdk 1.5需要配置环境变量2.Install Cygwin.安装Windows下的Linux模拟器,cygwin3.Installing native compilers.安装单片机工具,AVR或MSP430,根据自己需要。
4.Installing the nesC compiler.安装nesC和TinyOS_tool5.Installing the TinyOS source tree.安装TinyOS2.0.2主文件。
6.Installing the Graphviz visualization tool安装Graphviz并配置环境变量一.安装JDK 1.5下载JDK 2.5 在SUN的官方网站/. 安装并配置JDK的环境变量。
二.安装Cygwin下装Cygwin-1.2a于/dist-1.2.0/tools/windows/cygwin-1.2a.tgz这个版本TinyOS官方测试过,和TinyOS兼容度高。
三.安装单片机工具下载以下五个rpm包1.avr-binutils-2.15tinyos-3.cygwin.i386.rpm(/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(/dist-2.0.0/t ools/windows/avr-gcc-3.4.3-1.cygwin.i386.rpm)3.avr-libcavr-libc-1.2.3-1.cygwin.i386.rpm(/dist-2.0.0/too ls/windows/avr-libc-1.2.3-1.cygwin.i386.rpm)4.avariceavarice-2.4-1.cygwin.i386.rpm(/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(/dist-1.2.0/to ols/windows/avr-insight-6.3-1.cygwin.i386.rpm)下载完成之后把五个包都拷贝到Cygwin的tmp文件夹(在Windows操作即可) 依次安装(要按照顺序安装,它们之间有依赖关系),安装命令如下。
nesC编程迷你教程
nesC编程迷你教程寿颜波@Universitéde Franche-Comté,France内容目录1引子 (1)2基础概念 (1)2.1接口(interface) (1)2.2命令与事件(Command and Event) (2)2.3模块与配置(Model and Configuration) (3)2.3.1模块 (3)2.3.2配置 (5)2.3.3可以提供接口的配置组件 (6)2.3.4任务和事件 (9)3工作环境 (11)4编程开发 (12)4.1Blink (12)4.2 TempRadio (14)4.2.1数据的采集与发送 (15)4.2.2数据的接收 (23)5 TOSSIM仿真 (30)5.1使用TOSSIM编译nesC程序 (31)5.2捕捉、生成运行记录 (31)5.3仿真 (32)5.4运行中的变量值 (35)6结束语 (36)1引子目前在研究领域有多款针对无线传感器网络开发的操作系统,其中最为著名的项目之一便是TinyOS。
它最早由美国Berkeley大学负责开发和维护,并且支持多种传感器平台,例如在研究领域广泛使用的mica系列传感器节点和telos 系列。
在本教程的编写过程当中,我们统一使用Crossbow公司开发的telosb节点。
TinyOS完全由nesC编写,nesC全名Network Embedded System C,它可以被看作是C语言的近亲,在语法上和C语言有非常多的相似之处,如果你有C语言的编写基础,那么针对nesC的学习就会变得轻松很多。
nesC主要是为事件驱动编程而设计的,它也是我们开发TinyOS应用程序的主要编程语言。
本文档的目的在于向读者展示TinyOS的基本运作模式,并且让读者可以在最短的时间掌握TinyOS下程序开发的要领。
而且在编写过程当中,作者假设读者已经具备了基本的编程经验。
如果你需要更为详细的nesC参考资料,可以查阅TinyOS官方网站上面的教程,或者阅读Philip Levis编写的TinyOS Programming Manual。
第11章 nesC语言与TinyOS操作系统
规范元素
(specification of elements)
范围(extent)
命令(command) 事件(event)
组件(component) 绑定/连接(wiring)
模块(module)
具体描述实现逻辑功能的组件
11.1.1 nesC语言规范——nesC语言术语
术 语
终点/端点(endpoint) 内部的(internal)规范 元素
端点 连接
组 件 ( 配 件 )
接口提供者
模块中的概念
module SingleC { provides{ interface StdControl; } 接口 uses{ interface Timer; } } implementation{ command error_t StdControl.start(){ } event void MilliTimer , fired(){ } }
在一个配件C中,描述在配件C的定义中的一个规范元素。参见内部的规范 元素
描述由组件提供的命令/事件,此命令/事件可在多个地方被调用/触发 描述被组件使用的命令/事件,此命令/事件被调用时,会进一步调用其他 相关组件中接口的相关命令/事件函数,且结果会通过组合函数进行组合 对扇出命令/事件调用的多个结果的组合函数。一个组合函数可以用来组合 (进行某种逻辑操作)对这些被使用命令或事件调用的结果 是一系列有名函数声明的集合。一般使用接口来指向(refer to)一个接 口类型或接口实例 组件定义中一个特定接口类型的实例。接口实例由实例名、角色(提供者 或使用者)和实例类型以及可选的接口参数构成。没有实例参数的接口是 一个简单接口实例;有实例参数的接口是一个参数化接口实例
Tutorial实验手册
TinyOSTinyOS是一种专门为嵌入式无线传感器网络所涉及的开源操作系统,它为用户在无线传感器网络有限的资源中能够进行快速的创新和扩展提供了强大的基于组件的架构。
TinyOS 的组件库包括了网络协议,发送服务、传感器驱动和数据采集工具等组件,这些组件都可以在用户的应用程序中被调用。
在这里,TinyOS并不是一个传统意义上的操作系统,它还是一个专门为嵌入式系统所设计的编程框架和用于传感器网络编程的组件库,能够使得基于TinyOS的应用程序足够的小。
同时,TinyOS不支持文件系统,仅仅支持静态内存分配,扩展了一个简单的任务模型并提供了最小设备和网络的抽象。
TinyOS采用了基于组件的编程模型(nesC语言)。
与其他操作系统一样,TinyOS通过层的方式对它自身的软件组件进行组织和管理,处于较低层的组件就越接近与硬件,处于较高层的组件则较接近于应用程序。
一个完整的TinyOS系统应用程序就是由这些组件搭建而成,每一个组件都是一个独立的实体。
在TinyOS的编程中包含了三个概念:命令、事件和任务。
其中,命令和事件是组件之间交互通信的关键机制,任务则是用于传递组件外的消息。
下面将分别介绍这些概念:命令通常是向另一个组件请求服务时所发送的指令,举一个简单的例子就是要求传感器开始进行数据的采集。
与之相对比的是,事件通常是一个组件在完成自身的服务后向外发送的信号。
在传统的操作系统理论中,命令相当于是自上而下的调用而事件相当于回调。
TinyOS编程概览TinyOS操作系统,组件库和所有的应用程序都使用nesC语言进行编程,nesC是一个新型基于组件的结构化编程语言,主要用于进行传感器网络的嵌入式程序开发。
它采用类似于C语言的语法进行编程,因为TinyOS最初是使用汇编和C语言编写的,但是经过长期的使用,研究人员发现汇编和C语言并不能有效、方便地支持面向传感器网络的应用。
因此他们对C语言进行了一定扩展,提出了支持组件化编程的nesC语言,把组件化/模块化思想和基于事件驱动的模型结合在了一起。
nesC编程语言在无线网络传感器设计中的应用.
nesC编程语言在无线网络传感器设计中的应用新型编程语言——nesC其最大的特点是,将组件化/模块化思想和基于事件驱动的执行模型相结合。
现TinyOS操作系统和基于TinyOS的应用程序都是用nesC语言编写的,大大提高了应用开发的方便性和应用执行的可靠性。
本文以WSN为背景,通过一个基于TinyOS的灯闪烁实例——Blink,详细介绍nesC语言的结构以及用该语言如何实现组件化/模块化的应用程序,为深入研究TinyOS的应用开发提供一种实现方法。
1nosC语言结构nesC是C语言的扩展,精通新型编程语言——nesC其最大的特点是,将组件化/模块化思想和基于事件驱动的执行模型相结合。
现TinyOS操作系统和基于TinyOS的应用程序都是用nesC语言编写的,大大提高了应用开发的方便性和应用执行的可靠性。
本文以WSN为背景,通过一个基于TinyOS的灯闪烁实例——Blink,详细介绍nesC语言的结构以及用该语言如何实现组件化/模块化的应用程序,为深入研究TinyOS的应用开发提供一种实现方法。
1 nosC语言结构nesC是C语言的扩展,精通C语言的程序员掌握这种语言相对比较快。
与C语言的存储格式不同,用nesC语言编写的文件是以“.nc”为后缀。
每个nc文件实现一个组件功能(组件化/模块化)。
在nesC程序中,主要定义两种功能不同的组件——模块(module)和配件(configuration)。
模块主要用于描述组件的接口函数功能以及具体的实现过程,每个模块的具体执行都由4个相关部分组成:命令函数、事件函数、数据帧和一组执行线程。
其中,命令函数是可直接执行,也可调用底层模块的命令,但必须有返回值,来表示命令是否完成。
返回值有3种可能:成功(见BlinkM.nc代码部分)、失败、分步执行。
事件函数是由硬件事件触发执行的,底层模块的事件函数跟硬件中断直接关联,包括外部事件、时钟事件、计数器事件。
一个事件函数将事件信息放置在自己的数据帧中,后通过产生线程、触发上层模块的事件函数、调用底层模块的命令函数等方式进行相应处理,因此节点的硬件事件会触发两条可能的执行方向——模块间向上的事件函数调用和模块间向下的命令函数调用。
Tinyos系统调度器与任务
Tinyos调度器和任务介绍1、介绍TinyOS有二个基本的计算抽象:异步事件和任务。
Tinyos早些版本提供单一的类型任务,没有参数且只能FIFO调度。
将任务调度表现成TINYOS组件更容易制定,将任务表现成TINYOS接口可扩展任务类型。
TINYOS2.0采用这二种方法,这份文本记录了其是如何以简单的机制来提高系统可靠性。
2、TinyOS1.x任务调度TinyOS中的任务是可延迟的调用过程DPC,可以使某程序延迟计算或操作。
TOS任务一次运行完毕,任务间不可抢占。
这二个约束条件意味着任务代码是同步的。
也就是说,任务是原子性的。
在tinyos1.x中,nesC语言通过二种机制支持任务,任务声明和任务发布表达post task void computeTask(){//Code here}result_t rval=post computeTask();TinyOS1.x提供单一的任务类型,无参数函数及单一FIFO的调度策略。
Post语句可返回FAIL,表明TinyOS发布任务失败。
可发布任务多次。
例如,如果某一任务连续发布了二次,第一次成功但第二次失败,此任务将会被运行一次。
因为这样,虽然一次发布失败,但任务仍可能运行。
Tinyos1.x调度器由sched.c文件中的C函数集实现的。
若要修改调度器则需替代或修改此文件。
另外,因为任务仅通过nesC中的task关键字声明和post关键字支持,假设是无参数函数,不能修改语句或任务功能。
Tinyos1.x的任务队列是由固定大小的函数指针类型的循环缓冲实现。
发布任务就是将此任务的函数指针放入下个空缓冲区中。
如果没有空的缓冲区,发布任务将返回失败。
这类模型有几个问题:1)某些组件针对发布任务失败没有合适的响应2)某给出的任务能发布多次,这将占用多个缓冲区3)所有组件的所有任务共享单一资源:某个有问题的组件可能导致其他组件发布任务失败。
从根本上来,为了使组件A在发布任务失败后重新发布任务,另外一个组件B必须调用A的函数(命令或事件)??。
tinyOS
tinyOS
/tinywiki/index.php/Getting_started /TinyOS是UC Berkeley(加州大学伯克利分校)开发的开放源代码操作系统,专为嵌入式无线传感网络设计,操作系统基于构件(component-based)的架构使得快速的更新成为可能,而这又减小了受传感网络存储器限制的代码长度TinyOS的构件包括网络协议、分布式服务器、传感器驱动及数据识别工具。
其良好的电源管理源于事件驱动执行模型,该模型也允许时序安排具有灵活性。
TinyOS已被应用于多个平台和
感应板中。
TinyOS操作系统、库和程序服务程序是用nesC写的
nesC是一种开发组件式结构程序的语言
nesC是一种C语法风格的语言,但是支持TinyOS的并发模型,以及组织、命名和连接组件成为健壮的嵌入式网络系统的机制
◇nesC应用程序是由有良好定义的双向接口的组件构建的
◇nesC定义了一个基于任务和硬件事件处理的并发模型,并能在编译时检测数据流组件TinyOS只能运行单个由所需的系统模块和自定义模块构成的应用程序
两个线程
◇任务
●一次运行完成,非抢占式
◇硬件事件处理
●处理硬件中断
●一次运行完成,抢占式
●用于硬件中断处理的command和event必须用async关键字声明。
第3篇TinyOSNesC程序的基本结构和入手写法(教程lesson 1 blink)
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组件们,让他们协同工作,以完成你需要的程序功能。
TinyOS中unique()和uniqueCount()的应用和区别
TinyOS中unique()和uniqueCount()的应用和区别
nesC 现在有二种常量函数:
unsigned int unique(char *identifier)--如果程序包含n个有相同标示字符串的对unique的调用,每个调用返回一个0~n-1之间的无符号整数。
unsigned int uniqueCount(char *identifier)--如果程
序包含相同标示字符串的对uniqueCount的调用,每个调用都返回nunique()主要用于产生一个不重复的随机数,范围有括号中的参数的位数所决定。
当然括号内的标识符一定要相同,否则不能保证调用多个unique()时得到的数是不重复的。
比如unique(“TIME”)和unique(“TIME”)会得到两个不同的随机数,但如果是unique(“TIME”)和unique (“TIME2”)就不能保证得到独一无二的数了。
uniqueCount ()主要用于得到范围的上界。
比如uniqueCount(CLIENT),如果CLIENT为8位,则该次调用的返回值为255,如果将CLIENT改为16位,则返回65535。
使用该函数的好处,是便于维护和保持一致性。
《实验指导书_TinyOS系统与nesC程序设计》
TinyOS系统与nesC程序设计课内实验指导书一、课内实验项目一览表二、详细实验指导书实验一:编程环境建立一实验目的1、掌握Java基本开发环境(JDK)的安装和配置方法。
2、掌握cygwin程序的安装,在建立windows下类似Unix环境。
3、掌握Linux基本命令及cygwin下安装TinyOS的方法。
二实验原理无三实验环境1、运行Windows的PC机,能够连接Internet2、PC机配置要求:四实验内容和步骤1、java jdk安装首先,我们安装JA V A开发工具JA V A JDK 1.6官方下载地址:/javase/downloads/.安装过程只需下一步……下一步便可,默认安装路径是C:\Program Files\Java上图是TinyOS 2.0.2 安装时截取的JA V A JDK1.5的图,只供参考。
然后,我们需要设置电脑的环境变量,需要新建两个环境变量,以便使用JDK 具体过程如下:右击我的电脑——〉属性——〉高级——〉环境变量先新建或编辑系统变量:变量名(N):JA V A_HOME变量值(V):JDK安装的路径,其默认的路径为:C:\Program Files\Java\jdk1.6.0_10变量名(N):CLASSPATH变量值(V):.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;;%JAVA_HOME%\bin;%JAVA_HOME%\jr e\bin;在系统变量(S)栏选中变量为Path的选项,点编辑在变量值(V)的末尾添加:;%JAVA_HOME%\bin; ;%JAVA_HOME%\jre\bin;然后新建或编辑用户变量:同样再设置一个JAVA_HOME,变量值也一样。
在用户变量的PATH中添加:;%JAVA_HOME%\bin:$PATH;%JAVA_HOME%\jre\bin:$PATH;这样,我们的环境变量已经设置完毕了。
Lesson1---TinyOS入门1
11
一、编译和安装
• 作为一开始的学习,先来编译一个非常简 单的程序 Blink。若没有硬件节点,可以用 TinyOS的TOSSIM仿真平台进行编译运行。 • 编译TinyOS程序使用make命令,TinyOS系 统有一个强大的扩展性很强的make 系统, 位于 tinyos-2.x/support/make目录中。 • 先运行如下命令检查环境是否正确配置。 • $ tos-check-env
8
• 总的来说,TinyOS 调度模型有以下特点:
(1)任务单线程运行到结束,仅分配单个任务栈, 这对内存受限系统很有利。 (2)任务调度算法采用非抢占式的FIFO 算法,任 务之间相互平等,没有优先级之分。 (3)TinyOS 的调度策略具有能量意识,当任务队 列为空时,处理器进入休眠模式,直到外部事件 将它唤醒,能有效的降低系统能耗。 (4)这种基于事件的调度策略,允许独立的组件共 享单个执行的上下文, 只需少量运行空间就能获 得高度的并发性。
• 规范
– nesC应用程序由一个或多个组件连接而成。 – 一个组件可以提供或使用接口:
» 组件中command接口由组件本身实现; » 组件中event接口由调用者实现; » 接口是双向的,调用command接口必须实现其event接口。
26
2.1 配件和模块
• 组件有两种:配件和模块。 • 模块(module):提供一个或多个接口的实现。 • 配件(configuration):把其他的组件装配起来, 连接组件使用的接口到其提供者。 • 每个nesC应用程序都必须有且只有一个顶层配件 (top-level configuration)连接内部组件。 • 之所以区别设计模块与配件,是为了让系统设计 者在构建应用程序的时候可以脱离现有的实现。 例如:设计者可以提供配件,只是简单地把一个 或多个模块连接起来,而不涉及其中具体的工作。 同样地,另一个开发者负责提供一组模块库,这 些模块可以普遍使用到众多应用中。
TinyOS NesC小结
TinyOSTinyOS是一个开源的嵌入式操作系统,它是由加州大学的伯利克分校开发出来的,主要应用于无线传感器网络方面。
它是基于一种组件(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工作;单一任务栈;内核非常简单,甚至在严格意义上说,称不上内核;没有进程管理和虚拟存储。
第三章 nesC编程语言
2.3 模块及其组成
模块是主要用C语言实现的组件和规范
module-implementation: implementation { translation-unit }
编译基本单位是一连串的 C 声明和定义 模块编译基本单位的顶层声明属于模块的组件说明域。这 些声明的范围是模糊的而且可以是: 任意的标准 C声明或 定义,一种作业声明或定义,指令或事件实现.
组件有两种:配件和模块。
模块(module):提供一个或多个接口的实现。 配件(configuration):把其他的组件装配起来,连接组件 使用的接口到其提供者。
每个nesC应用程序都必须有且只有一个顶层配件 (top-level configuration)连接内部组件。 之所以区别设计模块与配件,是为了让系统设计者在 构建应用程序的时候可以脱离现有的实现。例如:设 计者可以提供配件,只是简单地把一个或多个模块连 接起来,而不涉及其中具体的工作。同样地,另一个 开发者负责提供一组模块库,这些模块可以普遍使用 到众多应用中。
一个组件说明中可以有多个使用和提供指令。多个使用 和提供规格元素可以通过包含在{ and}中而组合在一个 指令中。 举例来说,下面两个说明是一样的:
接口实例声明的完整语法是 interface X as Y,明确地指明 Y作为接口的名字。interface X是interface X as X.的一个 速记. 指令或事件能通过包括一个声明了指令或事件及存储类型 的标准的 C函数而作为规格元素直接地被包含:
组件模型
组件标识符(identifier) Component M1{ provides { interface P1; interface P2; …… } uses { interface U1; interface U2; …… } } implementation { ……//实现部分 } P1 :接口标识符(名 字 ) , 模 块 M1 必 须 实现它所提供接口的 命令(command)。 component 代表 module 或configuration
TinyOS-nesC 编程参考手册
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操作系统开发技术及实践(西电版)第4章 平台移植-精品文档
13
第4章 平 台 移 植 4.2.2 系统环境变量
1. MAKERULES变量
根据前述make系统工作流程可知,所有的TinyOS应用程 序目录下都必须有一个Makefile文件。该文件由命令行的 “make 平台名”命令触发make工具解析执行,其内容一般如 代码4-1所示。 【代码4-1】 Makefile
fi
export TOSDIR=$TOSROOT/tos
export MAKERULES=$TOSROOT/support/make/Makerules
echo "TOSDIR=$TOSDIR" echo "MAKERULES=$MAKERULES" echo "TOSMAKE_PATH=$TOSMAKE_PATH" echo "Set cctinyos env SUCCESS!"
18
第4章 平 台 移 植
图4-6 增加命令以自动运行脚本
19
第4章 平 台 移 植 然后,当启动Cygwin时可以看到如图4-7所示信息。
图4-7 cygwin启动时的显示信息
20
第4章 平 台 移 植 4.2.3 启动脚本实例
本小节内容用于实现任务描述4.D.2,在4.D.1的基础上,
建立cctinyos平台的启动脚本文件,并设置为自动启动。 1. 建立启动脚本文件 参考前述mytinyos平台的脚本文件,建立cctinyos平台的 环境变量设置脚本文件,并保存于“opt/cctinyos/”目录下。其 内容如描述4.D.2 cctinyos.env所示。
Makefile文件(以及符合Makefile格式的脚本文件)查找参与编译
的文件并调用nesC编译器,并进一步调用本地编译器和烧写器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任务都很短小
事件一般用在对于时间的要求很严格的应用中,且它可以优 先于任务执行
由硬件中断处理来驱动事件
15
内容提要
1. 2. 3. 4.
WSN操作系统 TinyOS简介 主要技术
TinyOS的编程语言
17
TinyOS的编程语言
TinyOS最初是用汇编和C语言编写的,后来改用支 持组件化编程的nesC语言。
(3) 如果接口和组件相关,除了组件名采用后缀( "C" 或"P" ) 之外, 建议两者 采用相同的命名
(4) 命令、事件、任务和函数都使用小写字母开头的混合形式。
(9) 命令是分阶段作业的起始部分, 而事件是分阶段作业的后续部分,因此事 件的命名应当与命令有关
建议采用命令函数名的过去式, 或者在命令名后面紧跟" Done" 标识。
4
无线传感器网络的特点
传感器网络的特点:
应用多样性、硬件功能有限、资源受限、节点微型化 、分布式任务协作。
单个传感器节点有两个很突出的特点:
并发性密集
传感器节点模块化程度很高
必须针对这些特点来设计WSN操作系统。
5
WSN操作系统的设计目标
要求WSN操作系统能够良好的模块化设计,使应 用服务与硬件资源之间可以随意搭配
命令是要由提供该接口的组件所实现的函数
事件是要在使用该接口的组件中实现
interface SendMsg {
command result_t send(uint16_t address , uint8_t length ,TOS_MsgPtr msg); event result_t sendDone(TOS_MsgPtr msg, result_t success); }
应用程序采用事件触发去唤醒传感器工作。 事件相当于不同组件之间传递状态信息的信号。
13
TinyOS的技术特点
轻量级线程(lightweight thread)
轻量级线程---任务
任务之间是平等的,不能相互抢占,按先入先出队列进行调 度
14
TinyOS的技术特点
两级调度方式
任务一般用在对于时间要求不是很高的应用中
连接的箭头是 可以对称倒反的
“->”和“<-”作用相同 User组件.接口->Provider组件.接口 等同于 Provider组件.接口<- User组件.接口
38
任务
40
任务
到目前为止,所有代码都是同步(sync)的。它以单一 的前后执行顺序运行,没有任何形式的抢占
⑴ 当同步代码开始运行后,直到完成前它不会释放CPU给 其他的同步代码
nesC语言把组件化/模块化思想和基于事件驱动的执行模 型结合起来。
nesC:使用C作为其基础语言,支持所有的C语言 词法和语法,其独有的特色如下:
增加了组件(component)和接口(interface) 定义了接口及如何使用接口表达组件之间关系的方法; 目前只支持组件的静态连接,不能实现动态连接和配置。
30
基于组件的模型
31
基于组件的模型
32
配件和模块
33
配件和模块
组件有两种:配件和模块
模块(module):提供一个或多个接口的实现
配件(configuration):把其他的组件装配起来,即把组件 使用的接口连接到其提供者
任何一个nesC应用程序都是通过把一个或多个组件进 行连接,从而成为一个可执行的、完整的程序
18
任何一个使用nesC编写的应用程序都是由一个或多个 组件连接而成,从而成为一个可执行的、完整的程序 。
19
接口
20
接口
接口:函数原型的集合 接口是连接不同组件的纽带
接口和接口文件是一一对应的
接口名在TinyOS 操作系统中具有唯一性
21
接口示例:
接口中的函数原型分为命令(command)和事件( event)两种
11
内容提要
1. 2. 3. 4.
WSN操作系统 TinyOS简介 技术特点
编程规范
12
TinyOS的技术特点
组件化编程(Componented-Based)
提供一系列可重用的组件;
一个应用程序可以通过连接配置文件将各种组件连接起来,以完 成它所需要的功能。
事件驱动模式(Event-Driven)
9
TinyOS简介
TinyOS的程序采用的是模块化设计
程序核心往往都很小
能够突破传感器存储资源少的限制。
10
TinyOS的设计理念
由于WSN的特殊性,研究人员在设计TinyOS系统 时就提出以下几个原则:
1)能在有限的资源上运行 2)允许高度的并发性 3)适应硬件升级 4)支持多样化的应用程序 5)鲁棒性强: 6)支持一系列平台
TinyOS与NesC
1
TinyOS操作系统概述
2
内容提要
1. 2. 3. 4.
WSN操作系统 TinyOS简介 主要技术
编程规范
3
无线传感器网络及其操作系统
有人认为没有必要设计一个专门的操作系统,可以直接在 硬件上设计应用程序,但在实际过程中会碰到许多问题:
应用开发难度会加大 软件的重用性差,降低了开发效率。
操作系信机制
6
现有的WSN操作系统
代表性的开源 WSN操作系统:
Tiny OS 2.1:美国加州大学伯克利分校
Mantis OS 0.9.5 :美国克罗拉多大学 SOS 1.7:美国加州大学洛杉矶分校
7
内容提要
1. 2. 3. 4.
假设:
上层路由组件RouteEngineP使用 AMSend 接口; 下层组件ActiveMessageC 提供 AMSend 接口 call AMSend.send(msg, len);// 调用命令
⑴组件RouterEngineP :
⑵ 底层组件ActiveMessageC:
signal AMSend.sendDone(msg, SUCCESS);//触发事件
3. 编写配置组件:MyDelayC.nc
配置组件MyDelayC向上层提供了接口MyDelay
44
nesC的命名约定
(1) 所有的nesC 文件的扩展名都是.nc ;并且 nesC 编译器要求文件名与文件内 定义的接口名或组件名相匹配 (2) 接口名或组件名是以大写字母开头的混合形式(指大小写字母混合)
组件装配示意图
34
配件和模块
每个nesC应用程序都必须有且只有一个顶层配件连 接内部组件 组件设计分为 模块与配件 的目的:
为了让系统设计者在构建应用程序的时候可以脱离组件的 具体实现。
35
连接
配件将内部的各组件对应的接口连接在一起,这个操作称为连 接(wiring),它将接口的提供者与接口的使用者关联起来。 要把一个接口连接到另一个接口时,一定要是同一类接口 连接操作使用“->”来表示 格式:User组件.接口 -> Provider组件.接口 例如 A.a -> B.b 意为 组件A的接口a连接到组件B的接口b A 是接口的使用者(user) ,而 B是接口的提供者 (provider) BlinkC.Boot -> MainC.Boot;
示例:TestDelay
1. 编写接口:MyDelay.nc
定义了命令start和事件fired
命令start用于开启延时功能
事件fired用于通知延时结束事件
2. 编写模块组件:MyDelayM.nc
MyDelayM模块提供接口MyDelay
⑴ 需实现MyDelay接口中的start命令函数,启动延时 ⑵ 用关键字signal指明什么时候发送事件fired
36
接口连接
组件及连接举例:
模块组件 (BlinkC.nc)
配置组件(BlinkAppC.nc)
37
接口连接
当一个组件只含有一个接口的时候,可以省略接 口的名字。
LedsC组件只包含一个接口leds BnC.leds -> LedsC.leds
等同于
BnC.leds -> LedsC
在模块中声明任务的语法: task void taskname(){……}
说明:
taskname:任务名称。 void任务必须空返回
不能带有任何参数
派遣一个任务去执行,语法: post taskname();
43
一个组件可以在命令、事件或者任务里派遣一个任务 一个任务可以安全地调用命令和触发事件
47
开发平台
48
整体框架
无线传感网节点 基站板
传感器模块
ARM控制平台 扩展模块 M2M模块
49
传感器模块
传感器是将物理世 界的信息进行量化 的设备,是 ATOS 平台中采集数据的 基本来源。
温度传感器模块
温湿传感器模块
光照传感器模块
流量传感器模块
雨滴传感器模块
血压传感器
气体压力传感器