更新时间:2022-09-17 17:27
Tiny OS是UC Berkeley(加州大学伯克利分校)开发的开放源代码操作系统,专为嵌入式无线传感网络设计,操作系统基于构件(component-based)的架构使得快速的更新成为可能,而这又减小了受传感网络存储器限制的代码长度。Tiny OS是一个具备较高专业性,专门为低功耗无线设备设计的操作系统,主要应用于传感器网络、普适计算、个人局域网、智能家居和智能测量等领域。
Tiny OS的如下特性决定了其在传感器网络中的广泛应用,使其在物联网中占据了举足轻重的地位。
Tiny OS是一个开源的操作系统,所有人都可查看和修改Tiny OS的源代码,参与到Tiny OS及配套软件的开发,并应用到商业和工业领域中。在众多参与者的协作下,Tiny OS于2012年发布了的V2.1.2版本,并在2013年将Tiny OS上线到Github,供全球的参与者下载,平均下载量已经高达3.5万次/年。
Tiny OS已经有很多产品,例如:用于神经信号接收、调解、显示的接收器、用于能源领域中的石油和气体监控、用于传感网络的控制和优化、用于无线传感网络进行健康监测等。
TinyOS的构件包括网络协议、分布式服务器、传感器驱动及数据识别工具。其良好的电源管理源于事件驱动执行模型,该模型也允许时序安排具有灵活性。TinyOS已被应用于多个平台和感应板中。
◆TinyOS操作系统、库和程序服务程序是用nesC写的
◆nesC是一种开发组件式结构程序的语言
◆nesC是一种C语法风格的语言,但是支持TinyOS的并发模型,以及组织、命名和连接组件成为健壮的嵌入式网络系统的机制
◇nesC应用程序是由有良好定义的双向接口的组件构建的
◇nesC定义了一个基于任务和硬件事件处理的并发模型,并能在编译时检测数据流组件
◇nesC应用程序由一个或多个组件连接而成
◇一个组件可以提供或使用接口
●组件中command接口由组件本身实现
●组件中event接口由调用者实现
●接口是双向的,调用command接口必须实现其event接口
◇modules
●包含应用程序代码,实现接口
◇configurations
●装配模块,连接模块使用的接口到其提供者
●每个nesC应用程序都有一个顶级configuration连接内部模块
◆TinyOS只能运行单个由所需的系统模块和自定义模块构成的应用程序
◆两个线程
◇任务
●一次运行完成,非抢占式
◇硬件事件处理
●处理硬件中断
●一次运行完成,抢占式
●用于硬件中断处理的command和event必须用async关键字声明
(race conditions)
◇nesC要避免任务排他性访问共享数据
◇nesC要避免所有共享数据访问都通过原子语句
◇nesC在编译过程中要检测数据流,但可能误报,可用norace关键字声明不检测,但对其使用
应格外小心
Module of Sense Application
SenseM. nc
------------------------------------------------
|module SenseM {
| provides {
| interface StdControl;
| }
| uses {
| interface Timer;
| interface ADC;
| interface StdControl as ADCControl;
| interface Leds;
| }
|}
◆提供StdControl接口
◆使用Timer、ADC、StdControl、Leds接口
◇nesC程序中可以使用同一个接口的多个实例
●interface StdControl as ADCControl
●ADCControl是StdControl的实例
◇不提供实例名,则实例名与接口名相同
●interface ADC相当于interface ADC as ADC
Configuration of Sense Application
Sense. nc
|configuration Sense {
| // this module does not provide any interface
|}
|implementation
|{
| components Main, SenseM, LedsC, TimerC, Photo;
|
| Main.StdControl -> SenseM;
| Main.StdControl -> TimerC;
|
| SenseM.ADC -> Photo;
| SenseM.ADCControl -> Photo;
| SenseM.Leds -> LedsC;
|}
◆不提供任何接口
◆使用Main、SenseM、LedsC、TimerC、Photo模块
◆连接Main.StdControl接口到SenseM.StdControl和TimerC.StdControl
◆连接SenseM.ADC接口到Photo.ADC
◆连接SenseM.ADCControl到Photo.StdControl
◆参数化接口
◇组件可以使用相同接口的不同实例,并分别为其命名
provides {
interface StdControl as fooControl;
interface StdControl as barControl;
}
◇参数化接口允许组件通过运行时或编译时参数值使用多个该接口的实例
provides interface Timer[uint8_t id];
◇每个Timer可以有256实例,每个实例对应一个8位数字
◇unique、uniqueCount函数
●产生一个唯一的8位数字与参数关联。
●uniqueCount返回与参数关联的数的个数
执行应用程序通用后台进程 任务的建立和调度 TinyOS提供任务和硬件事件处理两级调度体系 async关键字声明硬件事件处理的command和event 可以在任意时刻运行 做少量工作,要快速完成 任务用于处理复杂操作,比如后台数据处理,可以被硬件事件处理程序抢占 任务的定义语法 task void taskname() { ... }
taskname是给任务取的符号名字 任务不能有参数,必须返回void 分派任务语法 post taskname();
可以在command中提交任务 可以在event中提交任务 可以在Task中提交任务 post后的任务被放到一个内部FIFO任务队列 TinyOS学习笔记(4)
CntToLedsAndRfm configuration
CntToLedsAndRfm. nc
----------------------------------------------------------
|configuration CntToLedsAndRfm {
|}
|implementation {
| components Main, Counter, IntToLeds, IntToRfm, TimerC;
|
| Main.StdControl -> Counter.StdControl;
| Main.StdControl -> IntToLeds.StdControl;
| Main.StdControl -> IntToRfm.StdControl;
| Main.StdControl -> TimerC.StdControl;
| IntToLeds <- Counter.IntOutput;
| Counter.IntOutput -> IntToRfm;
|}
----------------------------------------------------------
◆使用模块Main、Counter、IntToLeds、IntToRfm和TimerC
◆在Main中初始化Counter、IntToLeds、IntToRfm和TimerC
◆都是标准库
◆Counter处理Timer.fire()事件
◆IntOutput接口
◇output() Command:有一个16位的参数
◇outputComplete() Event:返回一个result_t
◆IntToLeds:在LED上显示值的低三位
◆IntToRrm:通过Radio广播
◆Counter使用IntToLeds和IntToRfm的IntOutput接口
◆箭头总是由使用者指向提供者
发送消息
◆TinyOS中的radio通信采用Active Message(AM)模型,网络中的每个包都有一个handler ID,接收结点 会触发这个ID对应的事件,可以认为这个ID是“端口号”,不同的结点可以把不同的事件关联到相同的handler ID。
◆在消息传递层,成功的通信涉及5个方面
◇标明发送数据
◇标明接收结点
◇回收与发送数据相关联的内存
◇缓存接收数据
◇处理消息
IntToRfm configuration
IntToRfm. nc
----------------------------------------------
|configuration IntToRfm
|{
| provides interface IntOutput;
| provides interface StdControl;
|}
|implementation
|{
| components IntToRfmM, GenericComm as Comm;
|
| IntOutput = IntToRfmM;
| StdControl = IntToRfmM;
|
| IntToRfmM.Send -> Comm.SendMsg[AM_INTMSG];
| IntToRfmM.StdControl -> Comm;
|}
----------------------------------------------
◆IntToRfm configuration提供了两个接口IntOputput和StdControl
◆提供了接口的configuration也成为了组件,可以被其它configuartion使用
◆组件别名
◇使用了GenericComm组件
◇取别名(local name)Comm
◇为了能方便地使用其它通信组件替换GenericComm而不用修改每一处作用该组件的代码
◆=(equal sign)
◇IntOutput = IntToRfmM
◇StdControl = IntToRfmM
◇模块中左面接口的实现等价于右边模块中接口的实现
◆AM_INTMSG是定义在tos/lib/Counters/IntMsg.h中的全局常量
IntToRfm module
IntToRfmM. nc
----------------------------------------------------------------
|bool pending;
|struct TOS_Msg data;
|
|/* ... */
|
|command result_t IntOutput.output(uint16_t value) {
| IntMsg *message = (IntMsg *)data.data;
|
| if (!pending) {
| pending = TRUE;
|
| message->val = value;
| atomic {
| message->src = TOS_LOCAL_ADDRESS;
| }
|
| if (call Send.send(TOS_BCAST_ADDR, sizeof(IntMsg), &data))
| return SUCCESS;
|
| pending = FALSE;
| }
| return FAIL;
|}
----------------------------------------------------------------
◆IntMsg结构(tos/lib/Counters/IntMsg.h)
◇Field: val
◇Field: src
◆TOS_LOCAL_ADDRESS
◇全局常量
◇代表local source address
◆TOS_BCAST_ADDR
◇全局常量
◇代表radio广播地址
◆TOS_Msg(tos/system/AM.h)
◇send函数所使用的消息结构
◇IntMsg是对TOS_Msg的封装
◆调用Send.send()发送数据
◇数据分段
◇数据传完触发SendMsg.sendDone()事件
◇发送成功才接收下一个分段消息队列
◇发送不成功就不接受传输消息
◆TinyOS Active Message缓存管理
◇允许并发操作
◇遵守严格的可选所有者协议,避免太大内存管理开销
◇message layer接受send()后,管理缓存,传输完成前不允许请求者再修改缓存
◆pending flag
◇跟踪缓存状态
◇前面的消息没发完,则放弃output(),返回FAIL
◇缓存可用,则发送消息
◆GenericComm网络栈(tos/system/GenericComm. nc)
◇TinyOS generic网络栈的实现
◇使用低级接口实现通信
◇AMStandard实现Active Message的接收与发送
◇UARTNoCRCPacket实现mote的串口通信
◇RadioCRCPacket实现radio通信
◆RfmToLeds
◇ReceiveMsg接口(tos/interfaces/ReceiveMsg. nc)只定义了一个事件: receive()
◇接收消息的内存管理是动态继承的
◇Active Message层解码handler type并进行分派
◇缓存被传递给程序(通过ReceiveMsg.receive()事件),但关键的是,程序必须在处理完后返回指向缓存的指针
◇若是要保存消息内容以后处理,那么应复制消息内容到新的缓存,或向网络栈返回一个新缓存的指针
◆底层细节
◇消息头中包含group ID,使得多个mote组可以共享同一个radio channel
◇group ID是一个8位数
◇默认group ID是0x7D
◇使用DEFAULT_LOCAL_GROUP改变默认group ID
●DEFAULT_LOCAL_GROUP = 0x42 # for example...
◇使用MakeLocal文件改变所有程序胡group ID
◇消息头带有16位的目的结点地址
◇组中的每个通信结点在编译时都分配有惟一一个16位地址
◇TOS_BCAST_ADDR (0xfff)广播通用地址
◇TOS_UART_ADDR (0x007e)串口通用地址
TOSSIM
◆TOSSIM是直接从TinyOS代码中编译而来的TinyOS模拟器
◆运行于桌面电脑和笔记本上
◆可同时模拟上千个运行相同程序的结点
◆可在运行时配置调试输出信息
Building and Running an Application
◆make pc编译得到TOSSIM
◆TOSSIM可执行文件是build/pc/main.exe
◆control-C停止模拟
◆默认输出所有调试信息
◆TOSSIM的最高频率为40KHZ
增加调试语句
◆Application components和调试的四种保留模式:usr1、usr2、 usr3、和temp
◆调试信息命令
◇语法
●dbg(
◇
◇tos/types/dbg_modes.h包含全部可用模式
◇其它参数与printf()的参数同语义
Componented-Based Architecture
TinyOS提供一系列可重用的组件,一个应用程序可以通过连接配置文件(A Wiring Specification)将各种组件连接起来,以完成它所需要的功能。
Event-Driven Architecture
TinyOS的应用程序都是基于事件驱动模式的,采用事件触发去唤醒传感器工作。
Tasks And Events Concurrency Model
tasks一般用在对于时间要求不是很高的应用中,且tasks之间是平等的,即在执行时是按顺序先后来得,而不能互相占先执行,一般为了减少tasks的运行时间,要求每一个task都很短小,能够使系统的负担较轻;
events一般用在对于时间的要求很严格的应用中,而且它可以占先优于tasks和其他events执行,它可以被一个操作的完成或是来自外部环境的事件触发,在TinyOS中一般由硬件中断处理来驱动事件。
Split-Phase Operations
在TinyOS中由于tasks 之间不能互相占先执行,所以TinyOS没有提供任何阻塞操作,为了让一个耗时较长的操作尽快完成,一般来说都是将对这个操作的需求和这个操作的完成分开来实现,以便获得较高的执行效率。
基本信息
书 名:无线传感器网络操作系统TinyOS
作 者:潘浩、董齐芬、张贵军、俞立等编著
出 版 社: 清华大学出版社
出版时间:2011-8-5
版 次: 1
页 数: 380
I S B N :9787302257271
包 装: 平装
所属分
类: 图书 >> 计算机/网络 >> 网络与数据通信
本书首先介绍TinyOS操作系统的相关概念,然后深入解析该操作系统的内核机制,使得有一定基础的读者也能得到进一步提高。本书的第1章概述了无线传感器网络的特征与现状,并介绍了TinyOS的体系特点及其发展历史;第2章指导读者安装TinyOS系统并编译和下载程序到硬件节点上;第3章介绍了nesC编程语言的语法规范以及系统的运行机制;第4~5章介绍并演示了如何使用TinyOS操作系统的主要功能模块;第6~8章介绍了如何进行应用开发,包括平台的移植、仿真、网络协议以及低功耗实现;第9章通过3个基于TinyOS的应用实例,深入讲解了如何开发类似的应用程序。
本书语言简练、浅显易懂、图文并茂、脉络清晰。以实际操作为主导,围绕TinyOS操作系统的实际应用进行取材谋篇,着重于技术精华的剖析和操作技巧的指点。
本书适用于高等院校信息类专业的本科生、研究生和教师,也可供国内相关研究机构和公司的研发人员参考使用。
目录
第1章 绪论
第2章 开发环境
第3章 nesC编程语言
第4章 基本操作
第5章 系统内核
第6章 平台与仿真
第7章 网络协议
第8章 高级应用技术
第9章 基于TinyOS的应用开发实例
附录A nesC语言基本语法
附录B TinyOS编程技巧
附录C 英汉对照术语表