




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
tinyos 2 x 编程入门教程编程入门教程 version 1 0 2010 12 17 目录目录 前言前言 1 第第 1 1 章章编程环境的建立编程环境的建立 2 1 1安装安装 j javaava 1 61 6 jdkjdk 2 1 2安装安装cwgwincwgwin windowwindow onlyonly 2 1 3安装安装编译器编译器 2 1 4安装安装 t tinyinyosos 工具工具 3 1 5设置环境变量设置环境变量 4 1 6安装安装 g graphvizraphviz 4 1 7检测软件安装情况检测软件安装情况 4 1 8usbusb 串口驱动下载及安装串口驱动下载及安装 5 第第 2 2 章章tinyostinyos 简介简介 7 2 1nesnesc c 语言简介语言简介 7 2 1 1组件 components 7 2 1 2并发模型 11 2 2常用常用makemake命令简介命令简介 12 2 3应用举例 应用举例 b blinklink t tinyinyosos 编程的编程的 h helloello w worldorld 程序程序 12 2 3 1blink 配件 13 2 3 2blinkc 模块 14 2 3 3事件 evenst 和命令 commands 16 2 3 4编译 blink 应用程序 17 2 3 5安装 blink 程序到 telosb 节点并运行 17 2 4下载程序出错故障排除下载程序出错故障排除 18 2 5小结小结 20 第第 3 3 章章telosbtelosb 硬件平台常用可编程器件和对应的硬件平台常用可编程器件和对应的 tinyostinyos 组件介绍组件介绍 21 3 1l leded 22 3 1 1telosb 硬件平台上的 led 器件展示 22 3 1 2tinyos 中 led 编程组件介绍 22 3 2传感器传感器 23 3 2 1telosb 硬件平台上的传感器展示 23 3 2 2tinyos 中传感器编程组件介绍 24 3 3串口串口 25 3 3 1telosb 硬件平台上的串口展示 25 3 3 2tinyos 中串口编程组件介绍 26 3 4r radioadio 27 3 4 1telosb 硬件平台上的 radio 相关器件展示 27 3 4 2tinyos 中 radio 编程组件介绍 27 3 5小结小结 27 第第 4 4 章章用事件驱动方式从传感器获取数据用事件驱动方式从传感器获取数据 28 4 1模块实现模块实现 28 4 2adcadc 30 第第 5 5 章章tinyostinyos 任务及应用举例任务及应用举例 33 5 1任务的创建和调度任务的创建和调度 33 5 2举例 举例 s senseenset taskask应用程序应用程序 33 5 3小结小结 34 第第 6 6 章章tinyostinyos 串口编程串口编程 35 6 1t testests serialerial应用程序应用程序 35 6 2串口助手 串口助手 pcpc 上显示从串口读取的数据上显示从串口读取的数据 38 6 3t telosbelosb从串口读取数据从串口读取数据 40 6 4o oscilloscopescilloscope应用程序应用程序 数据感知数据感知 42 6 5b baseases stationtation应用程序应用程序 46 6 6小结小结 51 附录附录 1 1 tinyostinyos 命名约定命名约定 53 附录附录 2 2 nescnesc 语言特有关键字语言特有关键字 54 tinyos programming page 1 of 94 前言前言 随着传感器技术 微机电系统 现代网络 无线通信 低功耗等技术的飞速发展 推动了无 线传感器网络 wsn wireless sensor network 的产生和发展 无线传感器网络涉及 it 领域的 多种技术 成为目前 it 领域的研究热点之一 无线传感器网络就是由部署在监测区域内大量的廉 价微型传感器节点组成 通过无线通信方式形成一个多跳的自组织网络 无线传感器网络所具有的众多类型的传感器 可探测包括地震 电磁 温度 湿度 噪声 光强度 压力 土壤成分 移动物体的大小 速度和方向等各种各样的现象 具有广阔应用前景 潜在的应用领域可归纳为 军事 航空 反恐 防暴 救灾 环境 医疗 保健 家居 城市管 理等诸多领域 传感器节点是一个微型的嵌入式系统 具有非常有限的硬件资源 需要操作系统能够高效地 使用其仅有的内存 处理器和通信模块 且能够对各种特定应用提供最大的支持 传感器节点有两个突出的特点 一是并发性密集 即可能存在多个需要同时执行的逻辑控制 这需要操作系统能够有效地满足这种发生频繁 并发程度高 执行过程比较短的控制逻辑流程 另一个特点是传感器节点模块化程度很高 要求操作系统能够很方便让应用程序方便地对硬件进 行控制 且保证在不影响整体开销的情况下 应用程序中的各个部分能够比较方便地进行重新组 合 美国加州大学伯克利分校针对无线传感器网络的特点研发了 tinyos 操作系统 在科研机构的 研究中应用比较广泛 tinyos 是无线传感器网络中较为流行的操作系统 所用编程语言为 nesc network embedded system c nesc 语言由 c 语言扩展而来 意在把组件化 模块化思想和 tinyos 基于事件驱动的 执行模型结合起来 目前在国内 关于 tinyos 的资料并不多 而且很散 给各个方面的人员在使用 tinyos 时造 成了诸多不便 我们在使用 tinyos 时积累了一些经验 在此希望能对大家有一定的帮助 本教程所用硬件平台为 telosb 操作系统版本为 tinyos 2 x nesc 语言版本为 1 3 主要内 容的几乎覆盖 telosb 硬件平台的所有常用可编程器件及 tinyos 一些重要概念 内容不是很深入 适合没有接触过 tinyos 的初学者 但就其对于 telosb 硬件平台而言 是使用 telosb 硬件平台的 工作人员或爱好者不可多得的参考文档 并且在熟悉了此教程之后 读者朋友们可以很容易地转 到其它硬件平台上去 在范例的选择方面 本教程尽量选择了 tinyos 自带的例子 方便读者测试 只有少数例子在 tinyos 中没有 已编写了尽量简短的程序并在教程中展示了这些例子的完整代码 在讲解某些内 容方面 特别是概念性的内容 我们借鉴了 tinyos 官方公布的一些讲解方式 引用了部分内容及 例子 以便尽可能准确传达 tinyos 研发者的初衷 最后 本教程要求读者均具有 c 语言编程的基础 因为 nesc 是 c 语言的扩展 在此教程不会 讲解任何 c 编程方面的内容 如有读者未有 c 语言基础 请先学习 c 方面内容 以便可以进一步 学习此教程涉及的内容 更加深入的内容及本教程使用到的工具会在 相关资源 列出 以方便 大家进一步学习 tinyos programming page 2 of 94 第第 1 1 章章编程环境的建立编程环境的建立 目前 tinyos 支持两种平台 cygwin windows 和 linux 下面介绍在这两种操作系统下 tinyos 的安装步骤 1 1安装安装 javajava 1 61 6 jdkjdk 1 下载 java jdk se 6 或 windows i586 p 12 sep 2008 exe 2 安装路径 c ucb java jdk1 6 0 10 c ucb java jre6 3 设置环境变量 a classpath 我的电脑 属性 高级 环境变量 系统变量 新建 变量名 classpath 变量值 c ucb java jdk1 6 0 10 bin c ucb java jdk1 6 0 10 lib tools jar b path 我的电脑 属性 高级 环境变量 系统变量 编辑 变量名 path 变量值 c ucb java jdk1 6 0 10 bin c ucb java jdk1 6 0 10 jre bin c java home 我的电脑 属性 高级 环境变量 系统变量 新建 变量名 java home 变量值 c ucb java jdk1 6 0 10 1 2安装安装 cwgwincwgwin windowwindow onlyonly 1 从 tinyos 上下载 cygwin 的兼容包 http cone informatik uni freiburg de people aslam cygwin files zip 2 解压到 c cygwin installationfiles 3 运行 c cygwin installationfiles setup exe 下一步 install from local directory 下一步 root directory 输入 c ucb cygwin 下一步 local package directory 输入 c cygwin installationfiles 下一步 下一步 安装 完成 4 运行 c cygwin cygwin bat 1 3安装安装编译器编译器 1 安装 atmel avr tools tinyos programming page 3 of 94 toolwindows cygwinlinux avr binutilsavr binutils 2 17tinyos 3 cygwin i386 rpmavr binutils 2 17tinyos 3 i386 rpm avr gccavr gcc 4 1 2 1 cygwin i386 rpmavr gcc 4 1 2 1 i386 rpm avr libcavr libc 1 4 7 1 cygwin i386 rpmavr libc 1 4 7 1 i386 rpm avariceavarice 2 4 1 cygwin i386 rpmavarice 2 4 1 i386 rpm insightavr insight 6 3 1 cygwin i386 rpmavr insight 6 3 1 i386 rpm avrdudeavrdude tinyos 5 6cvs 1 cygwin i386 rpmavrdude tinyos 5 6cvs1 i386 rpm 如果在安装时提示错误 有一个更新版本的 rpm 包已经安装 尝试使用命令 rpm uvh force 如果在安装时提示错误 找不到 bin sh 尝试使用命令 rpm uvh force nodeps 2 安装 ti msp430 tools toolwindows cygwinlinux base msp430tools base 0 1 20050607 cygwin i386 rpm msp430tools base 0 1 20050607 i386 rpm python tools msp430tools python tools 1 0 1 cygwin noarch rpm msp430tools python tools 1 0 1 noarch rpm binutils msp430tools binutils 2 16 20050607 cygwin i386 rpm msp430tools binutils 2 16 20050607 i386 rpm gcc msp430tools gcc 3 2 3 20050607 cygwin i386 rpm msp430tools gcc 3 2 3 20050607 i386 rpm libcmsp430tools libc 20080808 1 cygwin i386 rpmmsp430tools libc 20080808 1 i386 rpm jtagnot yet available msp430tools jtag lib 20031101cvs 20050610 i386 rpm gdbnot yet available msp430tools gdb 6 0 20050609 i386 rpm 1 4安装安装 tinyostinyos 工具工具 toolwindows cygwinlinuxcommand nesc nesc 1 3 1 1 cygwin i386 rpm not available yet nesc 1 3 1 1 fc9 i386 rpm rpm uvh rpm uvh ignoreos if cygwin complains toolwindows cygwinlinuxcommand deputytinyos deputy 1 1 1 cygwin i386 rpm tinyos deputy 1 1 1 fc9 i386 rpm rpm i rpm i ignoreos if cygwin complains toolwindows cygwinlinuxcommand tinyos toolstinyos tools 1 4 0 3 cygwin i386 rpm tinyos tools 1 4 0 3 ubuntu i386 rpm rpm ivh force 2 x tree rpm uvh no 2 x tree tinyos programming page 4 of 94 1 5设置环境变量设置环境变量 需要在 tinyos 的配置文件中对环境变量进行设置 environment variablewindowslinux tosroot opt tinyos 2 xsame as in cygwin tosdir tosroot tossame as in cygwin classpathc cygwin opt tinyos 2 x support sdk java tinyos jar tosroot makerules tosroot support make makerulessame as in cygwin path opt msp430 bin opt jflashmm pathsame as in cygwin 只有在使用 msp430 或者是 imote2 的硬件平台的时候 才需要对环境变量 path 进行设置 在理想情况下 可以通过将这些环境变量写入 shell 脚本文件中 它会在每次 shell 启动的时候自动 运行 可以使用命令 bash profile 打开配置文件进行添加 1 6安装安装 graphvizgraphviz 对于 windows 操作系统 可以到 http webs cs berkeley edu tos dist 1 1 0 tools windows graphviz 1 10 exe 下载所需的安装文件 否则到 http www graphviz org download php 下载所需的 rpm 包进行安装 1 7检测软件安装情况检测软件安装情况 安装完 tinyos 等软件包之后 打开 cygwin shell 输入命令 tos check env 系统将会检测各个程序是否正常 查看安装时是否有错误发生 一般情况下 不会发生什么 严重错误 当全部程序正确安装时 最后一行是 toscheck completed without error 注意 注意 这一行很重要 如果有任何错误 请根据提示信息进行改正 这一行很重要 如果有任何错误 请根据提示信息进行改正 若在检测后出现如下提示 tinyos programming page 5 of 94 toscheck completed with errors warning classpath may not include that is the symbol for the current working directory please add to your classpath or you may experience configuration problems 此信息提示 某环境变量配置有点问题 但是这是关于 tinyos 自带的 java 工具的 这是因 为在配置文件中格式的问题 进行修改后即可 1 8usbusb 串口驱动下载及安装串口驱动下载及安装 telosb 硬件平台使用 ftdi 公司的 usb 转串口芯片 ft232b 该芯片的驱动程序请在 ftdi 公司的网站下载 具体链接为 合您的计算机的驱动 例如 本人所用计算机操作系统为 windows xp 故本人选择 windows xp 版 本的驱动 当您第一次使用 telosb 时 需要安装驱动程序 将 telosb 节点插入 pc 的 usb 接口 如果找 不到驱动程序 windows 会弹出 发现新硬件向导 的对话框 如图 1 11 所示 选择 install from a list or specific location advanced 然后点击 next 图 1 11 弹出的安装向导 接着 选择 include this location in the search 然后点击 browse 如图 1 12 所示 tinyos programming page 6 of 94 图 1 12 选择您的驱动程序 然后 选择驱动程序所在文件 例如 在笔者的电脑中 文件夹如图 1 12 所示 点击 ok 然后点击 next 紧接着 windows 安装该驱动程序 安装完成后就把 telob 变成一 个 usb 串口设备 此时您可以检查设备管理器端口 看是否有 usb serial port 这个设备 如果 没有可以重试几次 tinyos programming page 7 of 94 第第 2 2 章章tinyostinyos 简介简介 tinyos 作为无线传感器网络中比较流行的操作系统 支持目前出现的多种节点 就 2 x 版本 而言 支持 mica 系列 telos 系列等节点 tinyos 作为开源的操作系统 其价值不单为支持多个 系列的节点 对单片机爱好者而言 更是学习多种单片机编程的上佳资料 对操作系统爱好者而 言也有一定参考价值 其简单性让读者更加容易入门 本章简单介绍 tinyos 的基本概念和其编写语言 nesc 包括 nesc 语言的一些概念和语法 让读者能够在这个环境下编写自己的应用程序 最后结合 tinyos 自带的一个例子 blink 让大 家在此例子中熟悉涉及到的概念 在此再次明确指出 为方便读者朋友 本教程尽可能使用 tinyos 自带的例程及源代码 另外 本章在讲解 tinyos nesc 语言相关概念时引用了 tinyos 官 方公布的讲解方式及内容 2 1nescnesc 语言简介语言简介 tinyos 操作系统 库 及其应用程序都是用 nesc 语言编写的 tinyos 是一种面向传感器网 络的新型操作系统 它最初是用汇编和 c 语言编写的 但在应用过程中 发现 c 语言不能有效方 便地支持面向传感器网络的应用和操作系统的开发 相关工作人员为此对 c 语言进行了一定的扩 展 开发出 nesc 语言 nesc 不但支持 tinyos 的并发模型 还同时具有结构化机制 命名机制 能够跟其它软件组件连接成一个健壮的网络嵌入式系统 其主要目标是让应用程序开发人员能够 方便地建立起完整的 并发式系统的组件 并可以在编译时作出全面的检查 tinyos 定义了很多的重要的概念 这些概念都体现在 nesc 语言上了 第一 nesc 应用程序 都是由组件组件组成的 这些组件之间的连接是通过定义良好的 具有双向性质的接口接口 第二 nesc 定义了并发模型 此模型是基于任务任务 task 和硬件事件句柄硬件事件句柄 hadware event handler 并且 在编译期间可以进行数据竞争数据竞争检测 data race nesc 建立在 c 语言的基础上 其显著与 c 语言不同的概念有如下内容 2 1 12 1 1 组件组件 componentscomponents 1 1 基本概念 基本概念 任何一个使用 nesc 编写的应用程序都是由一个或多个组件连接而成 从而成为一个可执行的 完整的程序 在 nesc 中 组件的类型有两种 模块模块 modulemodule 和配件配件 configuration configuration 模块主 要用来提供应用程序的代码 以实现一个或多个接口 而配件则是用来汇聚其它组件 连接接口 的使用者和提供者 nesc 设计者称这种关系为连接连接 wiringwiring 每个 nesc 应用程序均是由一个顶顶 层的配件层的配件 top level top level configuration configuration 所描述 其内容就是把应用程序用到的所有组件都连接起来 从而形成一个整体 nesc 的源文件 接口 模块 和配件的扩展名是 nc 关于命名约定的更多的信息请查 看 tinyos 命名约定 组件的定义格式如图 2 1 所示 tinyos programming page 8 of 94 图 2 1 组件的原型 一个组件提供提供 providesprovides 和使用使用 uses uses 接口 接口是访问组件的唯一途径 并且接口是具 有双向性的 一个接口声明了一系列称之为命令命令 commandcommand 的函数 及一系列称之为事件事件 eventevent 的函数 接口的提供者必须实现该接口声明的所有的命令 而接口的使用者则必须实现 该接口声明的所有的事件 一个组件可以提供或使用多个接口 并且可以提供或使用同一个接口 的多个实例 2 2 基于组件的模型 基于组件的模型 一个简单的基于组件的调用模型如图 2 2 所示 tinyos programming page 9 of 94 图 2 2 基于组件的模型 上层的应用调用 tinyos 所提供的不同组件 而每个组件都会相应的提供自身的应用接口 实 际上各个组件的实现还需要调用其下层的图中所示的模型类似于一个库 library 不同的组件 components 相当于库中的元素 objects 而接口 interfaces 相当于 apis 3 3 简单示例 简单示例 blinkblink blink 示例的主要现象为通过对 timer 的调用触发红 绿 黄三种颜色的灯的闪烁事件 toggle red led 0 25 hz toggle green led 0 25 hz toggle yellow led 0 25 hz 如右图所示 在 blink 示例中只需要用 到以下三个组件 leds timer main 1 1 接口接口 不同的组件提供自身相应的接口接口 应用程序则通过调用这些接口来实现对于更低层的组件和 硬件的调用 例如在本例中的如下代码 uses interface timer as timer0 uses interface timer as timer1 uses interface timer as timer2 uses interface leds uses interface boot and you implement what you want to do in your program 当 timer 被触发的时候 所对应的灯闪烁 tinyos programming page 10 of 94 其中接口 timer 是一个带参数的接口 它使用类型作为参数 接口中的类型参数被放在一对 尖括号中 当串连提供者和使用者的接口带有类型参数时 它们的类型必须相互匹配 有时类型参 数只是用来做类型匹配检测的 而并没有用到命令和事件中去 本例中的 timer 接口就是如此 虽然它带有一个类型参数 但它里面没有一个函数用到了这个类型参数 blink 示例是一个 leds 的闪烁示例 其中 led0 的开关频率为 4hz led1 的开关频率为 2hz led2 的开关频率为 1hz 模块 blinkc 使用了三个 timer接口示例 同时也使用了 leds 和 boot 接口 也就是说 blinkc 在调用这些接口所定义的命令的同时必须实现接口所定义的 事件的处理函数 如图 2 3 所示 图 2 3 blink 接口 其中各个组件和接口的作用为 main boot 初始化并启动程序 leds leds 控制 led 的动作 亮 灭 闪烁 timer timer 计时器 之前提到过 timer 是一个带类型参数的接口 它的 3 个标注的类型是 tmilli t32khz 和 tmicro 分别表示毫秒级 32khz 和微妙级的计时器 这些类型都各自的定义为 c 的结构体 2 2 组成和编译组成和编译 接口可以由组件提供或使用 被提供的接口表现它为使用者提供的功能 被使用者表现使用 者完成它的作业所需要的功能 例如在 blink 示例中 组件 leds 和 timer 提供了使用的接口 实 际上它们也需要再调用下层的组件 如 msp430gpio 和 msp430timerb7 等 考虑到较好的代码重用性 nesc 是基于由编译器生成完整程序代码的需求设计的 作为一个 必要的组成部分 nesc 的编译器会根据用户所指定的平台编译生成一个对应于特定平台的 c 源文 件 对于其产生的 c 源文件 nesc 依据不同的微控制器使用一个对应的本地 gnu 的 c 编译器将产 生的 c 源文件编译成可执行文件并将其下载到对应硬件平台上 如图 2 4 所示 nesc 就根据不同 的环境使用不同的编译器 atmel128 c 源文件对应的是 avrgcc 编译器 mps430 c 源文件对应的 是 mspgcc 编译器 其他的 c 源文件对应的是另外的编译组件 它们对应的下载到的硬件平台分 别为 micaz 和 mica2 telosb 和 taroko 其他硬件平台 tinyos programming page 11 of 94 图 2 4 组成和编译方式 3 3 开发环境开发环境 开发环境是一个命令行界面 下图是在 windows 操作系统上 cygwin tinyos 的一个开发环 境界面 图 2 5 开发环境 2 1 22 1 2 并发模型并发模型 tinyos 一次只执行一个应用程序 而一个应用程序由一些必要的组件和一些可选的组件一些必要的组件和一些可选的组件组合 而成 tinyos 程序有两个执行线程 任务和硬件事件句柄 任务是一种被延迟执行的函数 一旦 任务被执行 它们就一直运行直至结束 中间不会被其它任务中断 硬件事件句柄是对硬件中断 的处理 同样会一直运行到结束 但是可能会抢占一个任务或其它硬件事件句柄的运行 命令和 事件要作为硬件事件句柄来执行 则必须用关键字 asyncasync 来声明 tinyos programming page 12 of 94 因为任务和硬件事件句柄是可以被其它异步代码抢占的 所以在一定竞争情况下 nesc 程序 是很容易受到影响 从而导致数据的不一致或错误 为避免竞争而带来的错误产生 可以在任务 内排外地访问数据 或者每次访问都采用原子原子 atomic atomic 语句 nesc 编译器在编译期间给程序员 报告潜在的数据竞争 编译器也可能会产生错误的报告 例如 该变量需要随时变化 这种情 况下 变量可以用关键字 noracenorace 声明 注意 关键字 norace 必须极其小心地使用 要了解用 nesc 编程的更多信息 请参看 2 2常用常用 makemake 命令简介命令简介 tinyos 编程中 有一些 make 命令是经常用到的 下面对其一一进行介绍 1 1 makemake platform platform 此命令是将 nesc 代码编译成可在某平台运行的代码 在执行前要切换到代码所在的目录 例 如 blink 程序的代码在 c ucb cygwin opt tinyos 2 x apps blink 目录下 打开 cygwin shell 后用 cd 命令转到该目录下 然后输入 make telosb make mica 命令就可以让编译器将其 编译成可以在 telosb mica 平台运行的代码了 当然首先得保证没有任何语法错误 2 2 makemake platform platform reinstallreinstall 使用 make platform 命令后 就可以将在某平台的可执行代码下载到对应的平台上了 例 如 make telosb reinstall make mica reinstall 就可以将编译好的可在 telosb mica 平 台上运行的代码下载到 telosb mica 硬件平台 3 3 makemake platform platform installinstall 此命令的功能相当于先执行命令 make platform 再执行命令 make platform reinstall 当然 如果执行 make platform 命令时 发现程序有错误 则不会执行下载动作 即不会执行 make platform reinstall 命令 4 4 makemake cleanclean 此命令删除上述编译命令产生的文件及文件夹 5 5 makemake platform platform docsdocs 此命令生成程序使用的所有组件 接口的关系的文件 生成的文件在 tinyos 2 x doc nesdoc 目录下 其中索引文件为 index html 2 3应用举例 应用举例 blinkblink tinyos tinyos 编程的编程的 hello hello world world 程序程序 上面的 nesc 语言简介中 简略介绍了组件 接口 模块 连接 命令 事件等基本概念 对 于初学者来说相当抽象 下面结合一个例子来看看各个概念在 nesc tinyos 编程中的用法 这个 例子是 tinyos 自带的程序 位于 tinyos 2 x apps blink 其功能是让一个 led 以 1hz 的频率闪 烁 blink 应用程序由两个组件组成 一个模块定义文件 blinkc nc 和一个配置文件 blinkappc nc blinkappc nc 也就是顶层配置 它连接 blinkc nc 和其他必要组件 请记住 任何一个应用程序都有一个用应用程序名命名的顶层配件 在此处 配件 blinkappc nc 就是 blink 应用程序的顶层配件 nesc 编译器根据该文件的内容产生可执行文件 另一方面 模 块 blinkc nc 提供 blink 应用程序的实现代码 正如你所想的 blinkappc 配件是用来连接组件 blinkc 模块和 blink 应用程序用到的其它组件的 tinyos programming page 13 of 94 让配件和模块之间有所区别的理由是 配件允许系统设计人员快速建立程序 例如 设计者 设计一个应用程序可以只提供一个配件 这个配件只是简单地将一个或多个模块连接起来 而此 时设计者实际上并没有实现任何东西 同样地 另一个开发人员会提供可以在广泛范围应用程序 中使用的 库 模块 当然 有时您需要同时拥有配件和模块 在此处是 blinkappc 和 blinkc tinyos 中的其 他命名规则请参看 tinyos 命名约定 2 3 12 3 1 blinkblink 配件配件 nesc 的编译器为 ncc 它可以将包含顶层配件的文件编译成可执行的应用程序 一般而言 tinyos 应用程序还拥有一个标准的 makefile 文件 允许进行平台选择以及在调用 ncc 时使用某 些适当的选项 blink 程序由两个组件构成 blinkc nc 为模块 blinkappc nc 为配件 让我们先看看 blink 程序的配件 blinkappc nc blinkblinkappcappc nc nc configuration blinkappc implementation components mainc 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 blinkc timer2 timer2 blinkc leds ledsc tinyos 应用程序中 configuration 可以提供和使用接口 但并不是所有的配置都是应用程 序顶层的配置 implementation 是配置的内容 它将一系列的组件建立起引用关系 首先 需要注意的是关键字 configuration 此词声明这是一个配件文件 头两行 configuration blinkappc 由于这个组件本身并不使用或者提供任何接口 所以在其声明部分为空 首先简单地说明这个配件名为 blinkappc 跟模块一样 在声明后的这个花括号内可以指定 uses 语句和 provides 语句 有一点非常重要 必须记住 配件可以提供和使用接口 配件实际 的实现代码是在紧接着的 implementation 后面的一对大括号里面 components 那行列出了此配件 用到的一组组件 分别是 mainc blinkc 和 ledsc 剩下的语句是连接使用到的接口到该接口的提 供者 因为 blinkc 模块使用了 boot leds 和 timer 接口 所以必须指明这些接口都是由其他哪 些组件提供的 tinyos programming page 14 of 94 先使用 component 关键字标明 这个程序当中 总共要用到哪几个组件 其中包括我们自己 编写的 blinkc 模块 还有负责提供 boot 接口的 mainc 组件 负责提供 leds 接口的 ledsc 组件 还有提供 timer 接口的 timermillic 其属于泛型 generic 配置 支持被实例化 这里先不细 说 因为我们需要用到三个计时器 所以需要使用 new 关键字创建三个计时器的实例 然后分别 用 as 被重命名为 timer0 timer1 和 timer2 components new timermillic as timer0 components new timermillic as timer1 components new timermillic as timer2 再往下就是组件之间的连接了 blinkc 使用了 boot 接口 而 mainc 正好提供了 blinkc 所需 的 boot 接口 所以我们将他们进行连接 nesc 使用箭头来指示接口之间的关系 你可以把向右箭 头 当作 绑定到 binds to 箭头左边的接口绑定一个接口到右边的 接口的 实现上 换句话说 组件使用的接口在左边 而右边组件提供的接口在右边 blinkc mainc boot 或者像下面这样也是可以的 mainc bootmainc boot 接着是控制发光二极管的 leds 接口 由 ledsc 组件提供 这里也进行了简写 完整的书写格 式为 blinkc leds ledsc leds 计数器的连接同理 2 3 22 3 2 blinkblinkc c 模块模块 blinkc 模块的代码如下 include timer h module blinkc uses interface timer as timer0 uses interface timer as timer1 uses interface timer as timer2 uses interface leds uses interface boot implementation event void boot booted call timer0 startperiodic 250 call timer1 startperiodic 500 call timer2 startperiodic 1000 event void timer0 fired tinyos programming page 15 of 94 dbg blinkc timer 0 fired s n sim time string call leds led0toggle event void timer1 fired dbg blinkc timer 1 fired s n sim time string call leds led1toggle event void timer2 fired dbg blinkc timer 2 fired s n sim time string call leds led2toggle 在模块 blinkc 的声明内 module blinkc 表明了该程序需要用到的全部接口 因为 blink 程序主要是将 telosb 节点上的三个 led 发光二极管以不同的频率闪烁 所以我们需要三个 精度为毫秒 tmilli 的计时器接口 timer 分别使用关键字 as 重命名为 timer0 timer1 和 timer2 既然需要点亮发光二极管 自然需要一个操控发光二极管的接口 也就是 leds 最后就 是程序启动负责初始化的接口 boot 接着在实现部分 implementation 在实现部分需要 实现所有我们用到的接口的事件 以为在这个程序里面 我们只是使用了接口 而作为这些接口 的用户 我们只需要负责去实现他们的事件 这些接口内的命令 则由接口的提供者负责实现 这里主要是两个事件 一个是 boot 接口的 booted 事件 另一个是计时器被触发的 fired 事 件 在 booted 事件中 也就是程序启动以后 我们的主要任务就一个 启动三个计时器 event void boot booted call timer0 startperiodic 250 call timer1 startperiodic 500 call timer2 startperiodic 1000 timer 0 的频率为 4hz timer 1 的频率为 2hz timer 2 的频率为 1hz 这里 startperiodic 是一个启动计时器的命令 呼叫命令需要使用 call 关键字 同样 因为是命令 所以它们由接口 的提供者负责实现 我们只负责使用就可以了 另一个需要我们处理的事件就是计时器的触发 因为有三个计时器 所以需要书写三个触发事件 event void timer0 fired dbg blinkc timer 0 fired s n sim time string call leds led0toggle event void timer1 fired dbg blinkc timer 1 fired s n sim time string call leds led1toggle event void timer2 fired dbg blinkc timer 2 fired s n sim time string call leds led2toggle tinyos programming page 16 of 94 我们可以看到 timer0 被触发的时候 我们切换 0 号发光二极管的状态 如果是亮的则熄灭 如果是灭的则点亮 同理 timer1 被触发的时候切换 1 号发光二极管的状态 timer2 被触发的时 候切换 2 号发光二极管的状态 led0toggle led1toggle 和 led2toggle 属于 leds 接口的三个命 令用 call 的方式调用即可 2 3 32 3 3 事件事件 evenstevenst 和命令和命令 commandscommands 在 blink 示例中用到的接口文件为 opt tinyos 2 x tos lib timer timer nc opt tinyos 2 x tos interfaces leds nc opt tinyos 2 x tos interfaces boot nc 以 leds 接口为例 它定义了多个命令 如 redon redoff 等等 其作用是将 led 灯 红 绿 黄 灯打开或关闭 由于由于 blinkcblinkc 模块使用了模块使用了 ledsleds 接口 因此它可以调用其中的任意接口 因此它可以调用其中的任意 一条命令 一条命令 但请注意 leds 仅仅只是一个接口 其实现由使用它的组件对应的配置文件指定 在 本例中 是在 blinkappc nc 中指定为 ledsc 即是要由 ledsc 来实现 leds 接口 简单的调用实现过程如下图所示 tinyos programming page 17 of 94 2 3 42 3 4 编译编译 blinkblink 应用程序应用程序 tinyos 支持多种平台 每个平台在 tos platform 目录下有自己的目录 在本教程中 我们将 适用 telosb 平台作为例子 要为 telosb 节点编译 blink 应用程序 只需在 cygwin shell 中转到 apps blink 目录下 输入 make telosb 即可 如果没有任何语法错误 您将看到以下图 2 1 编译信息 图 2 6 成功为 telosb 节点编译程序 关于编译方面的更多信息不在本教程之内 目前也只需知道这些 有兴趣的读者可以自己翻 阅相关资料 2 3 52 3 5 安装安装 blinkblink 程序到程序到 telosbtelosb 节点并运行节点并运行 要安装 blink 程序到 telosb 节点 先将 telosb 节点插入 pc 的 usb 接口中 在之前已编译的 基础上 您只需要在 apps blink 目录下输入 make telosb reinstall make install bsl 即可 如果成功的话可以看到以下图 2 2 安装信息 tinyos programming page 18 of 94 图 2 7 成功安装程序至 telosb 节点 如果是因为 telosb 节点没有插好 则会提示如下图 2 3 错误信息 提示找不到任何 telosb 节点 图 2 8 检测节点时的错误信息 2 4下载程序出错故障排除下载程序出错故障排除 许多 tinyos 相关工作人员曾经跟笔者提出过这样的问题 程序编译好 没有任何语法错误 但是下载不到节点去 或者有时可以下载 有时又不能下载 不知原因何在 下面试列出可能的 原因及提出相关的解决方法 1 1 tinyostinyos 安装没有成功
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【2025年】山西省临汾市【辅警协警】笔试测试卷(含答案)
- 绿色制造2025年环保型表面处理技术解决方案报告
- 银发消费市场2025年养老服务行业政策分析与应对策略报告
- 工业互联网平台IPv6技术升级下的工业设备远程维护与优化报告
- 银行零售业务数字化营销与客户生命周期管理策略研究
- 2025年环境监测物联网技术在城市绿化中的应用与效果评估报告
- 中医临床药师试题及答案
- 2025年公路货运行业数字化转型成功案例集锦与效率提升启示
- 中医人员面试题及答案大全
- 中医肾病科考试题及答案
- 2025年中国建设银行信用贷款协议
- 不锈钢栏杆、扶手合同范本
- 《常见精神障碍诊断与治疗》课件
- DB37-T 4522-2022平原河网区夏玉米清洁生产技术规程
- 污水处理厂运营与管理经验分享
- 2025年上半年国航股份广东分公司航空医师岗位招聘2人易考易错模拟试题(共500题)试卷后附参考答案
- 2023《广东省建设工程消防设计审查疑难问题解析》
- 2025年咖啡粉末香精项目可行性研究报告
- 消化道出血介入术后护理
- 第四章 第3节 平面镜成像2024-2025学年新教材八年级上册物理新说课稿(人教版2024)
- 体重管理指导原则(2024年版)图表完整版解读
评论
0/150
提交评论