《tinyosnesc小结》由会员分享,可在线阅读,更多相关《tinyosnesc小结(9页珍藏版)》请在金锄头文库上搜索。
1、TinyOSTinyOS 是一个开源的嵌入式操作系统,它是由加州大学的伯利克分校开发出来的,主要应用于无线 传感器网络方面。它是基于一种组件(ComponentBased)的架构方式,使得能够快速实现各种应用。 TinyOS 的程序采用的是模块化设计,所以它的程序核心往往都很小(一般来说核心代码和数据大概在 400 Bytes 左右) ,能够突破传感器存储资源少的限制,这能够让 TinyOS 很有效的运行在无线传感器网络上并 去执行相应的管理工作等。TinyOS 本身提供了一系列的组件,可以很简单方便的编制程序,用来获取和 处理传感器的数据并通过无线电来传输信息。TinyOS 是一个开源的嵌入
2、式操作系统,它是由加州大学的 伯利克分校开发出来的,主要应用于无线传感器网络方面。它是基于一种组件(ComponentBased)的架 构方式,使得能够快速实现各种应用。TinyOS 的程序采用的是模块化设计,所以它的程序核心往往都很 小(一般来说核心代码和数据大概在 400 Bytes 左右) ,能够突破传感器存储资源少的限制,这能够让 TinyOS 很有效的运行在无线传感器网络上并去执行相应的管理工作等。TinyOS 本身提供了一系列的组件, 可以很简单方便的编制程序,用来获取和处理传感器的数据并通过无线电来传输信息。TinyOS 在构建无 线传感器网络时,它会有一个基地控制台,主要是用来
3、控制各个传感器子节点,并聚集和处理它们所采集 到的信息。TinyOS 只要在控制台发出管理信息,然后由各个节点通过无线网络互相传递,最后达到协同 一致的目的,比较方便。1. tinyos 和普通的 os 的不同点它们的应用场景不一样,tinyos 是一个开源的构件化操作系统,它采用构件化描述语言 nesC 进行开发,主要 针对资源非常有限的无线传感器网络节点而设计。与一般的嵌入式操作系统相比,TinyOS 有其自身的特点:采用模块化设计,所以核心尺寸小(一般来 说核心代码和数据大概在 400Bytes 左右),可突破无线传感器网络存储资源少的限制;基于可重用组件的 体系结构;使用事件驱动模型,
4、通过事件触发来唤醒 CPU 工作;单一任务栈;内核非常简单,甚至在严 格意义上说,称不上内核;没有进程管理和虚拟存储。这些特点使得 TinyOS 非常适合无线传感器网络的 需求,所以它得到了广泛应用。TinyOS 采用基于组件的编程模型,应用程序由一个或多个组件构成。组件包括两类:模块(module)和配置 (configuration),组件间通过配置文件连接在一起,形成一个可执行程序。组件提供或使用接口,这些接口是 双向的并且是访问组件的唯一途径。每个接口都定义了一系列函数,包括命令(command)和事件(event)两 类。对于命令,接口的提供者必须实现它;而对于事件,接口的使用者必须
5、提供实现。组件的功能模块如 图 1 所示,它包括一组命令处理函数、一组事件处理函数、一组任务集合和一个描述状态信息和固定数据 结构的框架。除了 WSNOS 提供的处理器初始化、系统调度和 C 运行时库(C Run-Time)3 个组件是必需 的以外,每个应用程序可以非常灵活地选择和使用 WSNOS 组件。TinyOS 简介TinyOS 系统、库及应用程序都是用 nesC 语言写的语言写的,这时一种新的用于编写结构化的基于组件 的应用程序的语言。nesC 语言主要用于诸如传感器网络等嵌入式系统。nesC 具有类似于 C 语言的语法, 但支持 TinyOS 的并发模型,同时具有机构化机制、命名机制
6、,能够与其他软组件链接在一起从而形成一 个鲁棒的网络嵌入式系统。其主要目标是帮助应用程序设计者建立可易于组合成完整、并发式系统的组件, 并能够在编译时执行广泛的检查。TinyOS 定义了许多在 nesC 中所表达的重要概念。首先,nesC 应用程 序要建立在定义良好、具有双向接口的组件之上。其次,nesC 定义了并发模型,该模型是基于任务(task)及硬件事件句柄(hardware event handler)的,在编译时会检测数据争用(data race) 。1、组件 1)说明 任何一个 nesC 应用程序都是有一个或多个组件链接起来,从而形成一个完整的可执行程序的。组件提供 (provid
7、e)并使用(use)接口。这些接口是组件的唯一访问点并且它们是双向的。接口声明了一组函数, 称为命令(command) ,接口的提供者必须实现它们;还声明了另外一组函数,称为事件(event) ,接口的 使用者必须实现它们。对于一个组件而言,如果它要使用某个接口中的命令,它必须实现这个接口的事件。 一个组件可以使用或提供多个接口以及同一个接口的多个实例。 2)实现 在 nesC 中有两种类型的组件,分别称为模块(module)和配置(configuration) 。模块提供应用程序代码, 实现一个或多个接口;配置则是用来将其它组件装配起来的组件,将各个组件所使用的接口与其它组件提 供的接口连接
8、在一起。这种行为称为导通(wiring) 。每个 nesC 应用程序都由一个顶级配置所描述,其内 容就是将该应用程序所用到的所有组件导通起来,形成一个有机整体。 nesC 的所有源文件,包括 interface、module 和配置,其文件后缀(扩展名)都是“.nc” 。 2、并发模型(Concurrency Model) TinyOS 一次仅执行一个程序。组成程序的组件来自于两个方面,一部分是系统提供的组件,另一部分是 为特定应用用户自定义的组件。程序运行时,有两个执行线程:一个称为任务(task) ,另一个称为硬件事 件句柄(hardware event handler) 。任务是被延期执
9、行的函数,它们一旦被调度,就会运行直至结束,并且 在运行过程中不准相互抢占。硬件事件句柄是用来相应和处理硬件中断的,虽然也要运行完毕,但它们可 能会抢占任务或其他硬件事件句柄的执行。命令和事件要作为硬件事件句柄的一部分而执行必须使用关键 字 async 来声明。因为任务和硬件事件句柄可能被其他异步代码所抢占,所以 nesC 程序易于受到特定竞 争条件的影响,导致产生不一致或不正确的数据。避免竞争的办法通常是在任务内排他地访问共享数据, 或访问所有数据都使用原子语句。nesC 编译器会在编译时向程序员报告潜在的数据争用,这里面可能包 含事实上并不可能发生的冲突。 如果程序员确实可以担保对某个数据
10、的访问不会导致麻烦,可以将该变 量使用关键字 norace 来声明。但使用这个关键字一定要格外小心。 2. cygwin 是一个在 windows 平台上运行的 unix 模拟环境,是 cygnus solutions 公司开发的自由软件(该 公司开发了很多好东西,著名的还有 eCos,不过现已被 Redhat 收购) 。它对于学习 unix/linux 操作环境, 或者从 unix 到 windows 的应用程序移植,或者进行某些特殊的开发工作,尤其是使用 gnu 工具集在 windows 上进行嵌入式系统开发,非常有用。随着嵌入式系统开发在国内日渐流行,越来越多的开发者对 cygwin 产
11、生了兴趣。cygnus 当初首先把 gcc,gdb,gas 等开发工具进行了改进,使他们能够生成并解释 win32 的目标文件。 然后,他们要把这些工具移植到 windows 平台上去。一种方案是基于 win32 api 对这些工具的源代码进行 大幅修改,这样做显然需要大量工作。因此,他们采取了一种不同的方法他们写了一个共享库(就是 cygwin dll),把 win32 api 中没有的 unix 风格的调用(如 fork,spawn,signals,select,sockets 等)封装在里面, 也就是说,他们基于 win32 api 写了一个 unix 系统库的模拟层。这样,只要把这些工
12、具的源代码和这个共 享库连接到一起,就可以使用 unix 主机上的交叉编译器来生成可以在 windows 平台上运行的工具集。以这 些移植到 windows 平台上的开发工具为基础,cygnus 又逐步把其他的工具(几乎不需要对源代码进行修改, 只需要修改他们的配置脚本)软件移植到 windows 上来。这样,在 windows 平台上运行 bash 和开发工具、 用户工具,感觉好像在 unix 上工作。nescnesC 是对 C 的扩展,它基于体现 TinyOS 的结构化概念和执行模型而设计 。 TinyOS 是为传感器网 络节点而设计的一个事件驱动的操作系统,传感器网络节点拥有非常有限的资
13、源 ( 举例来说., 8K 字节的 程序储存器,512 个字节的随机存取储存器) 。TinyOS 用 nesC 重新编写。主要特性描述主要特性描述由于传感器网络的自身特点,面向其的开发语言也有其相应的特点。主动消息是并行计算机中的概念。 在发送消息的同时传送处理这个消息的相应处理函数 ID 和处理数据,接收方得到消息后可立即进行处理, 从而减少通信量。整个系统的运行是因为事件驱动而运行的,没有事件发生时,微处理器进入睡眠状态, 从而可以达到节能的目的。组件就是对软硬件进行功能抽象。整个系统是由组件构成的,通过组件提高软 件重用度和兼容性,程序员只关心组件的功能和自己的业务逻辑,而不必关心组件的
14、具体实现,从而提高 编程效率。语法介绍语法介绍接口接口nesC 的接口有双向性: 它们描述一个多功能的两组件(供给者和使用者)之间的交互渠道.。 接口叙 述一组叫做指令的, 被接口的供给者实现的,被命名的功能和一组叫做事件的, 被接口的使用者实现.的, 被命名的功能。 接口被接口类型指定,如下:nesC-file:includes-listopt interface. . .interface:interface identifier declaration-list storage-class-specifier: also one ofcommand event async这声明接口类型标
15、识符. 这一标识符有全局的作用范围并且属于分开的命名空间,组件和接口类型命名 空间。 如此所有接口类型都有清楚的名字以区别于其它接口和所有组件, 同时能不和一般的 C 的声明发 生任何冲突。声明列表中,每个接口类型都有一个分开的声明范围。声明列表必须由有指令或事件存储类型的功能 描述组成( 否则, 会发生编译-时间错误). 可选的 async 关键字指出指令或事件能在一个中断处理者中被运 行。通过包含列表,一个接口能可选择地包括 C 文件 (见第 9 节)。一个简单的接口如下:interface SendMsg command result_t send(uint16_t address, u
16、int8_t length, TOS_MsgPtr msg);event result_t sendDone(TOS_MsgPtr msg, result_t success);SendMsg 接口类型提供者必须实现发送指令, 而使用者必须实现 sendDone 事件.组件说明组件说明一个 nesC 组件或是一个模块 (第 6 节) 或一个结构 (第 7 节):nesC-file:includes-listopt moduleincludes-listopt configuration. . .module:module identifier specification module-implementationconfiguration:configuration identifier specification configuration-implementation组件的名字由标识符指定. 这一标识符有全局的作用范围并且属于组件和接口类型命名空间. 一个组 件介入两个分组件的作用域::一个规格作用域,属于 C 中全局的作用域,和一个实现作用域属于规格作用 域