TinyOS最初是通过汇编语言和C语言编写的。但C语言不能有效、方便地支持面向无线传感器网络的应用程序和操作系统的开发。为此,科研人员经过研究,对C语言进行了一定扩展,提出了支持组件化编程的nesC(Clanguage for network embedded systems)语言,把组件化/模块化思想和基于事件驱动的执行模式结合起来。TinyOS本身和基于TinyOS的应用程序基本上都采用nesC语言编写,这提高了应用开发的便利性和代码的执行效率。即使在只有少量ROM的情况下,TinyOS也能支持高度的并发处理以及复杂的协议和算法,而且能高效地运行在无线传感器网络环境中。
TinyOS采用了组件的结构,它是一个基于事件的系统。系统本身提供了一系列的组件供用户调用,其中包括主组件、应用组件、执行组件、感知组件、通信组件和硬件抽象组件,其层次结构如图4-3所示。组件由下到上通常可以分为3类:硬件抽象组件、综合硬件组件和高层软件组件。硬件抽象组件将物理硬件映射到TinyOS的组件模型;综合硬件组件模拟高级的硬件行为,如感知组件、通信组件等;高层软件组件实现控制、路由以及数据传输等应用层的功能。高层组件向底层组件发出命令,底层组件向高层组件报告事件。TinyOS的层次结构就如同一个网络协议栈,底层的组件负责接收和发送最原始的数据位,而高层的组件对这些数据进行编码、解码,更高层的组件则负责数据打包、路由选择以及数据传输。
图4-3 TinyOS体系结构
调度器具有两层结构,第1层维护着命令和事件,它主要是在硬件中断发生时对组件的状态进行处理;第2层维护着任务(负责各种计算),只有当组件状态维护工作完成后,任务才能被调度。由前所述,TinyOS调度模型主要有以下几个特点:
1)任务单线程运行到结束,只分配单个任务栈,这对内存受限的系统很有利。
2)没有进程管理的概念,对任务按简单的FIFO队列进行调度。
3)FIFO的任务调度策略具有能耗敏感性。当任务队列为空时,处理器进入休眠,随后由外部事件唤醒CPU进行任务调度。
4)两级的调度结构可以实现优先执行少量与事件相关的处理,同时打断长时间运行的任务。
5)基于事件的调度策略,只需少量空间就可获得并发性,并允许独立的组件共享单个执行上下文。与事件相关的任务可以很快被处理,不允许阻塞,具有高度并发性。
6)任务之间互相平等,没有优先级的概念。(www.daowen.com)
在TinyOS程序模型中,处于最上层的是主组件,即Main组件。该组件由操作系统提供,节点上电后会首先执行该组件中的函数,其主要功能是初始化硬件、启动任务调度器以及执行应用组件的初始化函数。每个TinyOS程序应当具有至少一个应用组件,即用户组件。该应用组件通过接口调用下层组件提供的服务,实现程序的逻辑功能,如数据采集、数据处理或数据收发等。因此,应用组件的开发是TinyOS程序设计的重点。
一个完整的应用系统由一个内核调度器(简称调度器)和许多功能独立且相互联系的组件构成,应用程序与组件一起编译成系统。因此,可以把TinyOS和在其上运行的应用程序看成是一个大的“执行程序”。现有的TinyOS提供了大多数传感器网络硬件平台和应用领域里都可用到的组件,如定时器组件、传感器组件、消息收发组件以及电源管理组件等,从而把用户和底层硬件隔离开来。在此基础上,用户只需开发针对特殊硬件和特殊应用需求的少量组件,大大提高了应用的开发效率。
系统的TinyOS 2.0版本是一个重新设计的全新操作系统。TinyOS 1.x系列版本在结构和接口的定义上有一定的局限性,导致组件具有高度耦合性,不利于组件之间的交互,这也使得编程新手很难入门。因此,加州大学的研究人员后来重新设计并编写了TinyOS 2.x版本(2006年)。目前,TinyOS的官方最新版是TinyOS 2.1.1版本。
TinyOS 2.x的内核模型发生了改变,因此不再向下兼容TinyOS1.x的程序,即TinyOS 1.x的代码无法在TinyOS 2.x平台上编译。与早期的TinyOS 1.x相比,TinyOS 2.x提供的TinyOS具有许多优点。它提供完整的电源管理和资源管理,大大提高了系统的鲁棒性,并重新设计了一些内核接口和硬件抽象,简化了编程的复杂度。当然,TinyOS 1.x也有一些TinyOS 2.x版本所没有的特色工具,如TinyViz和TinyDB。下面对两者做简单的介绍。
(1)TinyViz
TinyOS 1.x中的TOSSIM仿真平台提供了用于显示仿真情况的用户界面TinyViz,它是一个基于Java的GUI应用程序,允许用户以可视化方式控制程序的模拟过程。TinyViz提供了图形调试接口,能可视化地与TinyOS应用程序交互。它能使用户方便地跟踪应用的执行情况,可以设置断点,查看变量。还可以模拟多个节点的执行,并能够根据需要的模拟场景来设置网络属性,如节点的分布情况和无线通信环境参数等。图形界面可以自由移动节点在显示区域的位置。用户通过TinyViz可以输入配置信息或者输出调试信息,并可以很直观地看出程序运行的效果。
(2)TinyDB
TinyDB是一种从无线传感器网络中析取信息的查询处理系统。与TinyOS中其他数据处理解决方案不同的是,TinyDB不需要用户编写嵌入式的C语言代码。相反,TinyDB提供了一种简单的类似于SQL的接口来指定需要析取的数据,并为查询提供所需的参数,如数据更新的频率等,与在传统数据库提交查询一样简单方便。对于任意一个查询,只需指定感兴趣的数据,TinyDB就会从传感器节点中收集那些数据,并将之过滤、聚集以及选择路由,最终送到PC。要使用TinyDB,就必须将其TinyOS组件安装到传感器网络中的每个节点上。TinyDB为查询和析取数据的PC应用程序提供了一套简单的JavaAPI,同时还提供了一个使用该API的图形化查询工具和结果显示界面。TinyDB的最主要目标就是简化程序员的工作,使得数据驱动的应用程序开发和部署尽可能地快速。
当前,有些研究人员正在尝试将这两个实用工具移植到TinyOS 2.x中,但仍未有较为成功的移植范例。由于本书主要介绍当前最新的TinyOS 2.x系统,所以对这两块内容都没有做详细的介绍,有兴趣的读者可以自行参考TinyOS 1.x中的相关资料。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。