首页资源分类工业控制应用案例 > 基于ARM的嵌入式无线ZigBee网关的设计与实现

基于ARM的嵌入式无线ZigBee网关的设计与实现

已有 456818个资源

下载专区

文档信息举报收藏

标    签: 基于ARM的嵌入式无线ZigBee网关的设计与实现

分    享:

文档简介

ZigBee是近年来出现的一种新型无线通信技术,其具有近距离、低复杂度、低功耗、低数据速率、低成本的特点,在家用系统控制、楼宇自动化、工业监控领域具有广阔的市场空间。ZigBee的物理层和数据链路层由IEEE802.15.4工作组制定,高层(网络层、数据安全性及互边互通应用)由ZigBee联盟负责。 随着ZigBee技术在工业现场应用,越来越多的ZigBee设备终端将出现在工业现场,这就提出了将这些ZigBee设备与传统的以太网连接起来要求,为此需要设计一个无线的ZigBee网关来进行数据转发,因此对ZigBee网关的研究和设计具有重要的意义。 本系统选用基于ARM 920T内核的S3C2410作为ZigBee网关的主处理器,并且选用符合802.15.4标准的CC2420作为ZigBee网关的无线收发器。为了降低开发成本以及方便程序升级,网关选用开源嵌入式Linux操作系统,基于2.6.内核进行开发。本文主要对网关软件部分进行了深入研究。软件部分主要由2个程序组成:无线收发器的驱动程序和网关程序。其中网关程序主要包含Zigbee协议栈模块和网关通信模块。开发和测试主要语言采用标准C语言,驱动部分测试部分采用Bash脚本。 本文首先介绍了无线通信的背景知识和ZigBee协议栈,然后详细阐述了采用Linux来进行无线收发器驱动程序设计的关键点,同时对基于Linux的嵌入式ZigBee网关协议栈进行了移植,并且给出了ZigBee网关通信程序的设计方法以及程序的编译、调试和测试方法,实现了将ZigBee设备的数据及其状态转发给上位数据服务器的过程,最后还提出了作者对未来工作方向的一些改进思路和方法。

文档预览

上海大学 硕士学位论文 基于ARM的嵌入式无线ZigBee网关的设计与实现 姓名:黄河 申请学位级别:硕士 专业:测试计量技术及仪器 指导教师:王舒憬 20071201 上海大学硕士学位论文 摘要 ZigBoe是近年来出现的一种新型无线通信技术,其具有近距离、低复杂度、 低功耗、低数据速率、低成本的特点,在家用系统控制、楼宇自动化、工业监 控领域具有广阔的市场空间。ZigBee的物理层和数据链路层由IEEE802.15.4 工作组制定,高层(网络层、数据安全性及互边互通应用)由ZigBee联盟负 主 _贝。 随着ZigBee技术在工业现场应用,越来越多的ZigBee设备终端将出现在 工业现场,这就提出了将这些ZigBee设备与传统的以太网连接起来要求,为此 需要设计一个无线的ZigBee网关来进行数据转发,因此对ZigBee网关的研究 和设计具有重要的意义。 本系统选用基于ARM 920T内核的¥3C2410作为ZigBee网关的主处理器, 并且选用符合802.15.4标准的CC2420作为ZigBee网关的无线收发器。为了降 低开发成本以及方便程序升级,网关选用开源嵌入式Linux操作系统,基于2.6. 内核进行开发。本文主要对网关软件部分进行了深入研究。软件部分主要由2 个程序组成:无线收发器的驱动程序和网关程序。其中网关程序主要包含Zigbee 协议栈模块和网关通信模块。开发和测试主要语言采用标准C语言,驱动部分 测试部分采用Bash脚本。 本文首先介绍了无线通信的背景知识和ZigBee协议栈,然后详细阐述了采 用Linux来进行无线收发器驱动程序设计的关键点,同时对基于Linux的嵌入 式ZigBee网关协议栈进行了移植,并且给出了ZigBee网关通信程序的设计方 法以及程序的编译、调试和测试方法,实现了将ZigBee设备的数据及其状态转 发给上位数据服务器的过程,最后还提出了作者对未来工作方向的一些改进思 路和方法。 关键词:ZigBee协议栈:嵌入式Linux;AR~t920T;SPI驱动: V 上海大学硕士学位论文 ABSTI认CT ZigBee iS a new technology of wireless telecommunications,focusing on standardizing and enabling interoperability of products,which can be applied to home control,building automation and industrial monitoting.ZigBee is built on the physical layer(PHY)and medium access control(MAC)communication layers defined by the IEEE802.1 5.4 standard.Based on this,ZigBee defines mesh,star and cluster tree networktopologies with data security features and interoperable application profiles. As technology is applied in industrial field,there are more and more ZigBee devices are exit.So we need a ZigBee gateway to connect wireless ZigBee device and traditional Ethemet data server,which provide exchange data between them.So It’S important to research and design on ZigBee gateway. system TIliS chooses Samsung S3C241 0A RISC CPU as ZigBee gateway main processor based on ARM920T,and chooses CC2420 as transceiver,which is compatible wim IEEE 802.1 5.4 standard.For reducing devdop cost and updating program,ZigBee gateway chooses to open source Embedded Linux operation syetem.based on 2.6 kernel.ThiS paper does further research on the gateway software.Gateway’S software is composed of two parts:wireless transceiVet"driver and gateway application which mainly includes protocol stack module and gateway communication module.A11 codes are written by C language.and bash shell script is used to test driver. TlliS paper firstly introduces wireless telecommunications background and ZigBee protocol stack.and thell mainly discusses the design of Linux wireless transceivet driver,port of ZigBee protocol stack,design of ZigBee gateway communication program and method of complieing,debugging and testing,and at last discovers that Zigvee gateway Can exchange data between ZigBee devices and data server and Can inform gateway of running state for data SCl'Ver.The paper iS summed up in the end that the author future efforts are indicated. Keywords:ZigBee protocol stack;Embedded Linux;ARM920T;SPI driver;, VI 上海大学硕士学位论文 原创性声明 本人声明:所呈交的论文是本人在导师指导下进行的研究工作。 除了文中特别加以标注和致谢的地方外,论文中不包含其他人已发 表或撰写过的研究成果。参与同一工作的其他同志对本研究所做的 任何贡献均已在论文中作了明确的说明并表示了谢意。 签名:堇丝 日期:兰!竺星:墨:尘~ 本论文使用授权说明 本人完全了解上海大学有关保留、使用学位论文的规定,即: 学校有权保留论文及送交论文复印件,允许论文被查阅和借阅;学 校可以公布论文的全部或部分内容。 (保密的论文在解密后应遵守此规定) 勃 丕丝丝: 签名: 导师签名: 日期: 刈∥玉,厂 II 上海大学硕士学位论文 第一章 绪论 1.1课题研究的背景和意义 随着半导体技术和无线通信技术的不断发展,陆续出现了多种新的短距离 无线通信技术。对于多数无线网络来说,无线通信技术的应用目标旨在提高传 输数据的速率和传输距离,而在通常采用电池供电的嵌入式设备,如无线传感 网络以及诸如工业控制、环境监测、商业监控、汽车电子和家庭数字控制网络 等方面的应用,由于系统传输的数据量小、传输速率低,因此这些系统必须要 求传输设备具有成本低、功耗小的特点。针对这些特点,ZigBee技术应运而生。 ZigBee是近年来提出的一种近距离、低复杂度、低功耗、低数据速率、低 成本的双向无线通信技术,主要适用于自动控制和远程控制领域,是为了满足 小型廉价设备的无线联网和控制而制定的。ZigBee是IEEE 802.15.4技术的商 业名称,该技术的核心由2000年12月成立的IEEE 802.15.4工作组制定, 高层应用、互联互通测试和市场推广由2002年组建的ZigBee联盟负责。 ZigBee联盟由英国Invensys公司、日本三菱电气公司、美国摩托罗拉公司以 及荷兰飞利浦半导体公司等组成,已经吸引了上百家芯片公司、无线设备开发 商和制造商的加入。目前IEEE802.15.4协议标准化工作正在转向相关的应用和 测试,芯片和产品也已经面市【1 51。 随着ZigBee技术在工业现场应用,越来越多的ZigBee设备终端将出现在 工业现场,为了更好地将这些ZigBee设备与传统的以太网连接起来,就需要设 计一个无线的ZigBee网关进行数据转发。 基于上述考虑,本文旨在选择一种近距离、低复杂度、低功耗、低数据速 率、低成本的无线通信技术,在一个基于低功耗的ARM9系列微处理器的嵌入 式系统中实现这种技术,此系统具有处理速度快、接口简单、扩展性好、稳定 性好等优点,为一些要求硬件处理速度高,存储容量多的应用场合提供了新的 解决方案。 上海大学硕士学位论文 1.2几种短距离无线通信技术概况与比较 1.2.1 IrDA技术 成立于1993年的红外数据协会IrDA(Infrared DataAssociation)是致力于 建立红外线无线连接的非营利性组织。IrDA是一种利用红外线进行点对点通信 的技术,在各种遥控器、PDA、手机等设备上广泛使用。kDA的主要优点是红 外通信成本低廉且无需申请频率的使用权,并且还具有体积小、功耗低、连接 方便、应用简单的特点。此外,红外线发射角度较小,传输上安全性高。kDA 的不足之处在于它是一种视距传输,传输数据时两个设备之间不能有阻挡物, 必须对准。且红外技术只限于两台通讯设备,无法灵活构成网络。IrDA目前的 研究方向是如何解决视距传输问题及提高数据速率。 1.2.2蓝牙技术 蓝牙(Bluetooth)技术,是目前比较流行的一种无线个人区域网技术,具有中 等速率,用无线接口代替有线电缆的连接,有很强的移植性,已广泛用于PC、 打印机、传真机、手机等设备上。蓝牙最早是爱立信在1994年开始研究的一种 能使手机与其附件(如耳机)之间互相通信的无线模块。1998年,爱立信、诺基 亚、IBM等公司共同推出了蓝牙技术,主要用于通信和信息设备的无线连接。 蓝牙技术的标准版本为IEEE802.15.1标准,由蓝牙小组(SIG)负责开发。 蓝牙技术是一种无线数据和语音通信的开放性全球规范,其实质是为固定 设备或移动设备之间的通信环境建立通用的近距离无线接口,将通信技术与计 算机技术进一步结合起来,能在近距离范围内实现相互通信或操作。它的工作 频率为2.4GHz,有效范围大约在10m半径内,能提供1Mbps的传输速率。蓝 牙技术主要面向网络中各类数据及语音设备(如PC、拨号网络、笔记本电脑、 打印机、数码相机、移动电话和高品质耳机等),通过无线方式将它们连成一个 微网(Piconet),多个微网之间也可以互连形成分布式网络(Scatternet),从而方便、 快速地实现各类设备之间的通信。它是实现语音和数据无线传输的开放性规范, 是一种低成本、短距离的无线连接技术。蓝牙技术实现了设备的无连接工作, 2 上海大学硕士学位论文 提供了接入数据网的功能,并且具有外围设备接口,可以组成一个特定的小网。 1.2.3 WiFi技术 Wi.Fi(Wireless Fidelity,无线高保真),正式名称是IEEE802.1 lb。Wi.Fi 速率最高可达11Mb/s。虽然在数据安全性方面比蓝牙技术要差一些,但电波的 覆盖范围却略胜一筹,可达100m左右。 WioFi是以太网的一种无线扩展,理论上只要用户位于一个接入点四周的一 定区域内,就能以最高约11Mb/s的速度接入Web。但实际上,如果有多个用户 同时通过一个点接入,带宽被多个用户分享,Wi.Fi的连接速度一般将只有几百 kb/s的信号。信号不受墙壁阻隔,但在建筑物内的有效传输距离小于户外。 Wi.Fi未来最具潜力的应用将主要在SOHO、家庭无线网络以及不便安装电 缆的建筑物或场所。目前这一技术的用户主要来自机场、酒店、商场等公共热 点场所。Wi.Fi技术可将Wi.Fi与基于XML或Java的Web服务融合起来,可 以大幅度减少企业的成本。例如企业选择在每一层楼或每一个部门配备802.1lb 的接入点,而不是采用电缆线把整幢建筑物连接起来。这样一来,可以节省大 量铺设电缆所需花费的资金。 最初的IEEE802.11规范是在1997年提出的,称为802.11b,主要目的是提 供WLAN接入,也是目前WLAN的主要技术标准,它的工作频率也是2.4GHz, 与无绳电话、蓝牙等许多不需频率使用许可证的无线设备共享同一频段。随着 Wi.Fi协议新版本如802.1la和802.1lg的先后推出,Wi.Fi的应用将越来越广泛。 速度更快的802.1lg使用与802.1lb相同的正交频分多路复用调制技术。它工作 在2.4GHz频段,速率达54Mb/s。根据最近国际消费电子产品的发展趋势判断, 802.1lg将有可能被大多数无线网络产品制造商选择作为产品标准m】。 1.2.4 ZigBee技术 2000年12月IEEE成立了IEEE802.1 5.4工作组,致力于定义一种廉价设备 使用的极低复杂度、成本和功耗的低速率无线连接技术。 ZigBee是一种新兴的短距离、低速率无线网络技术,它是一种介于无线标 3 上海大学硕士学位论文 记技术和蓝牙之间的技术提案。ZigBee协议比蓝牙、高速率个人区域网(PAN) 或802.1lx无线局域网更简单实用。ZigBee技术的主要特点包括以下几个部 分: ◆数据传输速率低只有10kbps"--250kbps,专注于低传输应用。 ◆功耗低在低耗电待机模式下,两节普通5号干电池可使用6个月以 上。 ◆成本低因为ZigBee数据传输速率低,协议简单,所以大大降低了成本。 ◆网络容量大ZigBee设备可以与另外254台设备相连接。 ◆有效范围小有效覆盖范围10一,75m之间,具体依据实际发射功率的大 小和各种不同的应用模式而定。 ◆工作频段灵活使用的频段分别为2.4GHz、868MHz(欧洲)及915MHz(美 国),均为免执照频段。 ZigBee主要应用在短距离范围之内并且数据传输速率不高的各种电子设 备之间。其典型的传输数据类型有周期性数据(如传感器数据)、间歇性数据(如 照明控制)和重复性低反应时间数据(如鼠标)。 1.2.5几种无线通信技术的比较 目前,各种无线传输技术林立,应用广泛。每个技术都有其立足的特点, 或基于传输速度、距离、耗电量的特殊要求;或着眼于功能的扩充性:或符合 某些单一应用的特别要求;各种短距离无线通信技术都在争取成为市场标准。 通过表1.1对几种主要无线通信技术的比较,可以得出:Zig,Bee是目前 最适合用于工业现场网关的短距离无线通信技术。 4 上海大学硕士学位论文 工作频率 有效物理范围 最大传输速率 主机协 议栈容量 网络节点数 最大功耗 参考成本 语音/数据支持 表1.1各种短距离无线通信技术的比较 IrDA 红外线 980nm 蓝牙 射频 2.4GHz 、矾Fi 射频 2.4GHz ZigBee 射频2.4GHz 868/91 5MHz 20era.1.2m 10m一100m 25m.100m 10m.75m 16Mbps 1Mbps I 1 M·300Mbps 250kbps 10.30k 60.280k 1M 4.32k 2 数mw <5美元 数据 8 100row 20美元 语音、数据 128 100mw 100.200美元 数据 255 30row 6美元 数据 1.3 ZigBee技术在国内外研究概况 1999年3月,原由IEEE802.11领导的WPAN小组单独成立了IEEE802.15 工作组,主要是建立个人工作空间无线通讯的国际标准,实现和IEEE802.11协 议族的融合。IEEE802.15委员会制定了三种不同的WPAN标准。802.15.1标准 即蓝牙技术,是目前比较流行的一种无线个人区域网技术。802.15.3主要针对 高速图像和多媒体应用,有较高的速率。 2000年12月IEEE成立了IEEE802.15.4工作组,致力于定义一种廉价设备 使用的极低复杂度、成本和功耗的低速率无线连接技术。2003年5月 IEEE802.15.4标准面世,ZigBee正是这种技术的商业化命名。这个名字来源于 蜂群使用的赖以生存和发展的通信方式,蜜蜂通过跳zigZag形状的舞蹈来分享 新发现的食物源的位置、距离和方向等信息。802.15.4定义了媒介接入控制层 和物理层上的规范。ZigBee联盟在此基础上定义其余的网络层、安全层和应用 层,并负责高层应用、测试和市场推广等方面的工作。ZigBee联盟成立于2002 年8月,由英国Inversys公司,日本三菱电气公司、美国摩托罗拉公司及荷兰 上海大学硕士学位论文 Philips半导体公司组成,至今已吸引了上百家芯片公司。其于2004年12月14 日宣布确定ZigBee的正式版规格。802.15.4还吸引了其它标准化组织的注意, 如IEEEl451工作组正在考虑以此为基础实现传感器网络。 目前已经有标为“遵循ZigBee”的无线收发产品:如NEC电子公司推出有 ZigBee功能无线网络模块,由Chipcon公司的CC2420 RF收发器和NEC电子公 司的78K0/KFl+低功耗闪存微控制器构成,可用在各种范围的工业现场。 CrossbOW Technology公司的遥感模块MICAZ内含一个符合IEEE802.1 5.4规范 和ZigBee规范的RF收发器,其51根引脚扩展连接器支持模拟输入、数字I/O、 12C、SPI以及UART接口,与外围设备连接非常方便,睡眠模式下可使AA电 池的寿命延长至超过一年。该公司还提供一个适用于无线嵌入式传感器网络的 开放源码操作系统,即TinyOS。适用于RF和MEMS(微电机系统)的TinyOS, 除了双向通信之外,还提供实时调度算法和极端节能算法。TinyOS的元件库包 含网络协议、分布式服务、传感器驱动以及数据采集等工具。ZigBee无线网络 开发人员可以根据需要将该免费的网络软件有选择的移植到自己的处理系统 中。随着ZigBee协议的正式公布,今后这些产品之间将进行兼容性测试。 1.4论文的主要研究内容 本论文是以作者攻读硕士学位期间承担课题的工作为基础,主要完成了无 线收发器驱动程序设计、ZigBee协议栈的移植以及ZigBee网关通信程序设计 三部分工作。本论文一共由七章组成:第一章中阐述了课题研究的背景、目的、 意义以及国内外研究的现状:第二章对ZigBee协议栈进行了深入的分析,主要 研究了物理层、MAC层和网络层;第三章首先介绍了ZigBee网关的硬件平台 和软件平台,并且详细阐述了基于嵌入式Linux操作系统设计无线ZigBee收发 器驱动程序的方法;第四章阐述了基于嵌入式Linux操作系统用户层网关协议 栈的移植与实现;第五章阐述了网关与上位数据服务器通信程序的设计与实现; 第六章阐述了驱动、协议栈及通信程序的测试、调试方法;第七章总结了全文 及对未来的展望。 6 上海大学硕士学位论文 第二章ZigBee协议栈的研究 2.1 ZigBee协议栈的介绍 ZigBee协议是整个课题研究的核心,完整的ZigBee协议套件由高层应用 规范、应用汇聚层、网络层、数据链路层和物理层组成,如图2.1所示,符合 国际标准组织(ISO)开放系统互连(OIS)参考模型。 应用1 应用汇聚层 应用n JL 2 1r JL ◆ 网络层 害 。L IEEE 802.2 LLC 2 1r JL 善 SSCS 】 令 、r IEEE802.15.4 MAC . ▲ ▲ 干 了 PHY 2.4GHz,868~I}耐9l 5N舭z 1r .∥b 图2-1 ZigBee协议栈 ZigBee协议栈包括IEEE802.15.4和ZigBee联盟定义的两个部分。 IEEE802.15.4是IEEE确定的低速率无线个人局域网标准。这个标准定义了 物理层(Physical layer)和媒介接入控制层(Medium Access Control layer)。 IEEE802系列标准把数据链路层分成LLC(Logical Link Control,逻辑链路控制) 和MAC(Media Access Control,媒介接入控制)两个子层。LLC子层在802.2 中定义为802标准系列共用;MAC子层协议则依赖于各自的物理层。 ’ZigBee联盟在此基础上定义其余的网络层和应用层,并负责高层应用、测 7 上海大学硕上学位论文 试和市场推广等方面的工作。网络层主要考虑采用基于ad hoe技术【141的网络协 议,包含以下功能:拓扑结构的搭建和维护,命名和关联业务,包含了寻址、 路由和安全;有自组织、自维护功能,以最大程度减少消费者的开支和维护成 本。 2.2物理层 在IEEE802.15.4协议中,物理层定义了物理无线信道和MAC子层之间的 接口,提供物理层数据服务和物理层管理服务。物理层提供以下六个任务: (1)激活和休眠射频收发器: (2)信道能量检测(energy detect): 信道能量检测为网络层提供信道选择依据。它主要测量目标信道中接收信 号的功率强度,由于这个检测本身不进行解码操作,所以检测结果是有效信号 功率和噪声信号功率之和。 (3)检测接收数据包的链路质量指示(1ink quality indication,LQI); 链路质量指示为网络层或应用层提供接收数据帧时无线信号的强度和质量 信息,与信道能量检测不同的是,它要对信号进行解码,生成的是一个信噪比 指标。这个信噪比指标和物理层数据单元一道提交给上层处理。 (4)空闲信道评估(clear channel assessment,CCA); 空闲信道评估判断信道是否空闲。IEEE 802.15.4定义了三种空闲信道评估 模式:第一种简单判断信道的信号能量,当信号能量低于某一门限值就认为信 道空闲;第二种是通过判断无线信号的特征,这个特征主要包括两方面,即扩 频信号特征和载波频率;第三种模式是前两种模式的综合,同时检测信号强度 和信号特征,给出信道空闲判断。 (5)信道频率选择; (6)收发数据。 上海大学硕士学位论文 2.2.1物理层的服务规范 物理层通过射频固件和射频硬件提供了在物理无线信道和MAC子层之间 的接口。物理层提供一个管理实体称为PLME(物理层管理实体)。PLME通过 被调用的协议层管理函数提供协议层服务接口。同时PLME维护一个由物理层 相关数据组成的数据库,该数据库参照物理层个人无线网信息基础(PIB)。 物理层通过2个服务访问接入点(SAP)提供2种服务:通过物理层数据 服务访问接入点(PD.SAP)的物理层数据服务和通过PLME的服务访问接入点 (PLME.SAP)的物理层管理服务。图2.2为物理层参考模型。 图2-2物理层参考模型 2.2.2物理层的工作频段和数据速率 802.15.4定义了物理层标准,分别是2.4GHz物理层和868/915MHz物理层。 这些物理层都基于DSSS(Direct Sequence Spread Spectrum直接序列扩频),使 用相同的物理层数据包格式,区别在于工作频率、调制技术、扩频码片长度和 传输速率。如表2.1所示。 9 上海大学硕士学位论文 表2-1物理层标准 物理层 (MHz) 工作频率 (MHz) 扩频参数 频道数 码片率 (kchip/s) 调制方式 868—.868.6 l 868,915 902-928 10 2450 2400-2483.5 16 300 600 2000 二相的相移键控 (BPSK) 二相的相移键控 (BPSK) 偏移四相移键控 调制(O-QPSK) 数据一 专输参数 传输率 (kⅣs) 数据符号 20 二进制 40 二进制 250 16状态组 2.4GHz频段为全球统一的无需申请的ISM(工业科学医疗)频段,有助于 ZigBee设备的推广和生产成本的降低。而868MHz和915MHz的频段分别只在 欧洲和北美有。这两个频段的引入,避免了在2.4GHz附近各种无线通信设备 的相互干扰。物理层总共分配了27个信道:868MHz频段1个信道,速率为 20kbit/s:915MHz频段10个信道,速率为40kbit/s:2450MHz频段16个信道, 速率为250kbit/s。频率定义如下: FC=868.3 MHz k--0 FC--906+2(k·1)MHz k--1,2,’····’,10 FC=2405+5(k-11)MHz k=11,12,‘····‘,26 k为信道数。 一个802.15.4网可以根据可用性、拥挤状况和数据速率在27个信道中选择 一个工作信道。从能量和成本效率来看,不同的数据速率能为不同的应用提供 较好的选择。例如,对于有些计算机外围设备与互动式玩具,可能需要250kbit/s, 而对于其他许多应用,如各种传感器、智能标记和家用电器等,20kbit/s的低速 率就能满足要求。 2.2.3物理层的帧格式 物理层帧格式如图2.3所示。物理帧第一个字段是四个字节的前导码,收 发器在接收前导码期间,会根据前导码序列的特征完成片同步和符号同步。帧 起始分隔符(start-of-frame delimiter,SFD)字段长度为一个字节,其值固定为 10 上海大学硕士学位论文 0xA7,标识一个物理帧的开始。收发器接收完前导码后只能做到数据的位同步, 通过搜索SFD字段的值0xA7才能同步到字节上。帧长度(frame length)由一 个字节的低7位表示,其值就是物理帧负载的长度,因此物理帧负载的长度不 会超过127个字节。物理帧的负载长度可变,称之为物理服务数据单元(PHY service data unit,PSDU),一般用来承载MAC协议数据单元。 字节:4 前导码 (Preamble) 1 帧起始分隔 符(Sm) l 帧长度 (7瞰) 保留 (1bit) SHR PHR 可变 物理数据服务单元 (PSDU) PHR payload 图2-3物理层数据格式 2.3 MAC层 MAC能够获取所有对物理无线信号的访问,并提供下面六个任务: (1) 协调器产生并发送信标帧; (2) 普通设备根据协调器的信标帧与协调器同步; (3) 支持PAN网络的关联和取消关联操作; (4) 支持无线信道通信安全; (5) 采用CSMA/CA机制访问信道; (6) 采用时槽保障(guaranteed time slot,GTS)机制; (7) 提供不同设备的MAC层实体间可靠传输。 2.3.1 MAC层的服务规范 MAC层提供了在网络层和物理层之间的接口。MAC层提供一个管理实体 称为MLME(MAc层管理实体)。MLME通过被调用的协议层管理函数提供协 上海大学硕士学位论文 议层服务接口。同时MLME维护一个由MAC层相关数据组成的数据库,该数据 库参照MAC层个人无线网信息基础(PIB)。 MAC层通过2个服务访问接入点(SAP)提供2种服务:通过MAC层中 通用部分子层(MCPS)数据访问接入点提供数据服务(MCPS.SAP)和通过 MLME的服务访问接入点(MLME.SAP)的MAC层管理服务。图2.4为MAC 层参考模型。 图24为MAC层参考模型 2.3.2 IkD,C层帧格式 MAC层帧结构的设计目标是用最低复杂度实现在多噪声无线信道环境下 的可靠数据传输。MAC帧是构成MAC协议和保证有效数据通信的基础。MAC 子层数据包包括三部分:MAC子层帧头(MHR:MAC Header)、MAC子层业 务数据单元(MSDU:MAC Service Data Unit)、MAC子层帧尾(MFR:MAC Footer)。帧头由帧控制信息、帧序列号和地址信息组成。MAC子层负载具有 可变长度,具体内容由帧类型决定。帧尾是帧头和负载数据的16位CRC校验 序列。MAC层通用帧格式如图2.5所示。 12 上海大学硕士学位论文 字节数:2 l O/2 Q}2滗 o/2 o|2{8 可变 2 帧控制 信息 帧序 列号 目的设备 PAN 标识符 目标 地址 源设备 PAN 标识符 源设备 地址 地址信息 帧头 图2-5 MAC层帧结构 帧数据 单元 (净荷) MAC 负载 FCS 校验 码 MFR 帧尾 >帧控制域 帧控制域的长度为16个比特位。如图2-6所示。帧控制域各字段的具体含 义如下所示: 位0.2 3 4 帧类型 加密位 后续帧 控制位 5 6 7.9 10.1l 12.13 应答 同一PAN 保留 目的地 保留 请求 指示 址模式 14.15 源地址 模式 图2-6帧控制域结构 (1)帧类型定义了四种类型帧:信标帧,数据帧,确认帧和MAC命令帧。 (2)加密位:设置为l时表示帧用存贮在MAC PIB中的密钥加密。 (3)后续帧控制位:设置为l时表示发出帧的设备有后续数据发送给接收 方,因此接收方应发送额外的数据请求以获得后续的数据。 (4)应答请求位:指示帧的接收方是否需要发出确认。信标帧和确认帧不 需要接收方的确认。数据帧和命令帧的该位设置为1,则接收方的数据通过了 CRC校验后,立即发送确认帧。 (5)同一PAN指示:设置为1时表示目标地址与源地址在同一网络中, 不需要源PAN标识符。 (6)源、目的地址模式:定义了地址类型。如表2.2所示。在MAC子层 中设备地址有两种格式:16位(两个字节)的短地址和64位(8个字节)的扩 展地址。16位短地址是设备与PAN网络协调器关联时,由协调器分配的网内 局部地址;64位扩展地址是全球唯一地址,在设备进入网络之前就分配好了。 13 上海大学硕士学位论文 表2-2地址类型定义 地址模式(blb0) 00 Ol lO 描述 无PAN标识符和地址 保留 地址域包含的是16位短地址 ll 地址域包含的是64位扩展地址 >帧序列号 为帧指定了唯一的序列号,仅当确认帧的序列号与上一次数据传输帧的序 列号一致时,才能判断数据或命令传送成功。 >地址域 一共包含四个地址域:目的PAN标识符(Destination PAN identifier)、目的 地址(Destination address)、源PAN标识符(Source PAN identifier)、源地址 (Source address)。由于不同地址类型的地址信息的长度是不同的,且同一网络 可省略源PAN标识符,故该部分长度是可变的。 >净荷 . . 净荷部分用来承载上层数据,也包含特定类型帧的相关信息。有一些帧的 帧体是空的,例如响应帧,这样可以用比较小的开销达到目的。 >帧校验 MAC帧的尾部,通常被称为帧校验序列(FCS)字段,长度为16个比特 位。 2.3.3_AC层帧类型 (a)信标帧 信标帧的负载数据单元由四部分组成:超帧描述字段、GTS分配字段、待 转发数据目标地址字段和信标帧负载数据。如图2.7所示。 14 上海大学硕上学位论文 字节数: MAC子 层 2 帧控制 字段 l 4或10 2 序列 地址信息 号 字段 超帧描述 字段 k GTS 分配 字段 m 待转发数据 目标地址 n 信标 帧负 载 2 FCS M8叫 L~~-..-罂.........~.......... 字节数: PHY层 4 前导码 序列 SHR 1 帧开始分隔符 1 帧长度 PHR 7+(4或lO卜k+仰+n r。鬈胗拶%"勰绋瓣} ,r哼馋雾ll搿秽lll辫警92缵 # PHY服务数据单元 …~∞2 MPDU 13+(4或10卜k+仰+n PHY协议数据单元 图2.7信标帧结构 信标帧中超帧描述字段规定了这个超帧的持续时间,活跃部分持续时间以 及竞争访问时段持续时间等信息。GTS分配字段将非竞争访问时段划分为若干 个GTS,并把每个GTS具体分配给了某个设备。转发数据目标地址列出了与协 调者保存的数据相对应的设备地址。一个设备如果发现自己的地址出现在待转 发数据目标地址字段里,则意味着协调器存有属于它的数据,所以它就会向协 调器发出请求传送数据的MAC命令帧。信标帧负载数据为上层协议提供数据 传输接口。在信标不使能网络里,协调器在其他设备的请求下也会发送信标帧。 此时信标帧的功能是辅助协调器向设备传输数据。 (b)数据帧 MAC 子层 字节数: 字节数: 4 l I前导码 帧开始 I序列 PHY层 分隔符 l SHR l 2 1 4到20 n 2 帧控制 字段 序列 号 地址信息 字段 数据帧 负载 FCS MHR MSDU MFR l 帧长度 PHR “”獬彬”嗍嬲彻搿锄铲…5+(4到~ 20Hl …9彬彬嬲瑚嬲嬲锄锄缨 MAC协议数据单元 j ,.… ……~。~。 .~,,.。。。?l…,。。?疡 PSDU 11+(4到20m PHY协议数据单元 图2-8数据帧结构 数据帧用来传输上层发到MAC子层的数据。数据负载传送至MAC子层时, 15 上海大学硕上学位论文 它的首尾被分别附加了MHR头信息和MFR尾信息后,就构成了MAC数据帧。 如图2.8所示。 (c)确认帧 如果设备收到目的地址为其自身的数据帧或MAC命令帧,并且帧的控制 信息字段的确认请求位被置1,设备需要回应一个确认帧。确认帧的序列号应 该与被确认帧的序列号相同,并且负载长度应该为零。确认帧紧接着被确认帧 发送,不需要使用CSMA/CA机制竞争信道。确认帧结构如图2-9所示。 MAC子 层 字节数: PHY层 4 I前导码 序列 1 帧开始 分隔符 ; SHR I 字节数: 2 1 2 帧控制 字段 序列号 FCS MHR MFR 1 帧长度 PHR 5 。 p。i““j’|’““。。鹳…÷譬Ⅲ哆4”7; “二9‘ j∞抽峙i?ti竹”嘲。杯+”譬 MAC协议数据单元 . . 诒 PSDU 11 PHY协议数据单元 图2-9确认帧结构 (d)命令帧 MAC命令帧用于组建PAN网络,传输同步数据等,只能在信标网络的CAP 时段和非信标网络的任意时段发送。命令帧在格式上和其他类型的帧没有太多 的区别,只是帧控制字段的帧类型位有所不同。如图2.10所示。帧头的帧控制 字段的帧类型为lIB(B表示二迸制数据)表示这是一个命令帧。命令帧的具 字节数: 2 1 4到20 l n 2 MAC 子层 帧控制 字段 序列 号 地址信息 字段 命令 类型 数据帧 负载 FCS MHR MSDU MFR 字节数: 4 l前导码 PHY层 I序列 l 帧开始 分隔符 SHR l …“。。4。~ Ⅵ…”… 帧长 度 , 7.j 6+(4到2C H1l 4’ 。。’删”"嘴州…?+锡% MAC协议数据单元 ! …………。。…,…,,.二,。二‰ 。.?:? PHR PSDU 12+(4到20m I 。PHY协议数据单元 图2.10命令帧结构 16 上海大学硕士学位论文 体功能由帧的负载数据表示。负载数据是一个变长结构,所有命令帧负载的第 一个字节是命令类型字节,后面的数据针对不同的命令类型有不同的含义。 命令类型有如下几种,如表2.3所示。全功能设备(FFD)能完成以下所 有命令的收发,简单功能设备(I心D)则只能完成部分命令的收或发,表中打 钩的即表示简单功能设备(RFD)可以实现的部分。 表2.3命令帧类型 命令帧 标识 0xol 命令名称 关联请求(Association request) RFD Tx Rx √ Ox02 关联响应(Association response) \/ 0x03 0x04 解除关联(Disassociation notification) 数据请求(Data request) V√ V 0x05 V 局域网身份冲突通知(PAN ID conflict notification) 0x06 0x07 Ox08 0x09 OxOa.0xff 丧失同步性通知(Orphan notification) 信标请求(Beacon request) 协调器重新分配(Coordinatorrealignment) GTS请求(GTS request) 保留(Reserved) V V (1)关联请求帧:如果想连接到网络协调器或其他设备上,发送此帧。 (2)关联响应帧:当网络协调器收到关联请求帧后,发送关联响应帧,告 诉其请求连接的结果。 (3)解除关联帧:当网络协调器或关联设备想终止一个连接时发送此帧。 (4)数据请求帧:向协调器发出数据请求命令。 (5)PAN ID冲突帧:检测到个人局域网身份冲突后,设备向协调器发出 该命令。 (6)丧失同步帧:已关联的设备与协调器丧失同步性后,向协调器发出此 帧。 (7)信标请求帧:设备主动扫描过程中,发出此命令,找到个人工作空间 内所有的协调器。这对RFD是可选的。 (8)协调器重新分配帧:此命令由协调器发出,紧跟在收到设备的丧失同 17 上海大学硕士学位论文 步帧之后,或者个人局域网配置发生变化以后。 (9)GTS请求命令帧:已关联的设备向协调器请求分配一个新的GTS或 者重新分配一个已存在的GTS。只有有效短地址的设备才能发送此 命令。 2.3.4 MC层数据传输模式 LR.WPAN网络中存在着三种数据传输方式:终端设备传送数据到协调器、 协调器传出数据到终端设备、对等设备之间的数据传输。在星型网络中,仅有 前两种方式,而在对等网络中,三种方式均有可能。 1.数据传送到协调器 信标使能方式中,设备必须先接收协调器发出的信标帧达到同步,接着在 竞争访问阶段使用开槽(slotted)CSMA/CA方式发送数据,或者在非竞争阶段 使用有保证时隙(GTS)传输数据。非信标使能方式中,设备直接利用无槽 CSM刖CA来传送数据。流程如图2.11所示。 图2—1 l 数据传送到协调器流程 2.数据从协调器传出 在信标使能方式中,数据帧由协调器保存在事务处理列表中,等待相应的 设备来提取。协调器利用信标帧告诉设备有资料要传送,设备通过检查来自协 调器的信标帧,能发现在事务处理列表中是否挂有一个属于它的数据分组。如 果自己是协调器传送对象,则设备在竞争阶段使用开槽CSMA/CA发送MAC 数据请求命令。或者在非竞争阶段使用有保证时隙(GTS)传输数据。 18 上海大学硕士学位论文 在非信标使能方式中,终端设备采用无槽CSMA/CA传送MAC数据请求 命令。若协调器有数据要传送,则也采用无槽CSMA/CA传送数据。流程图如 图2.12所示。 图2.12数据从协调器传出流程 3.对等设备之间的数据传输 对等网络中,任一设备可同其射频范围内的其他设备通信。准备通信的设 备要么定时接收,要么相互同步。前者简单使用无槽CSMA/CA传输数据,后 者需要采取一定措施确保同步。 2.3.5基于时槽的CSMA/CA算法 协调器(Coordinator)在网路中,会发出beacon给所有的设备节点,而对 于有资料需传送的设备来说,它们会向协调器要求进行传送,由于在一个时间 内只能有一个设备进行传输,因此所有想要传输的设备就会进行基于时槽的 CSM~℃A算法来竞争传输信道的使用权。所有有资料传输的设备,都会去监 测目前的无线传输信道是否有其他设备在使用,如果为空闲(idle),这些设备 会产生一个后退延迟时间(backoff delaytime),来错开这些设备同时送出资料 而造成碰撞的可能。若目前的无线传输信道是处于忙碌中的,则这些设备将会 在监测到媒体为空闲后,再进行基于时槽CSMA/CA的竞争。因此,基于时槽 19 上海大学硕士学位论文 的CSMA/CA算法的使用,主要是在设备有资料要传送。而基于时槽的 CSMA/CA此算法中有三个重要的参数是必须由每个要传送资料的设备去维护 的:NB、CW以及BE。 NB也就是后退次数(number ofbackoff):NB的初使值为0,当设备有资料 要去传送时,经过一段后退延迟时间后,若侦测到信道为忙,则会再一次进去 产生后退时间(backofftime)的步骤,此时NB值则会加1,而NB值最大定 义为4,当信道在经过四次的后退延迟时间的延迟后仍为忙,则放弃此次的传 送,以避免过大的冲突。 CW是指碰撞视窗的长度(content window length),也就是定义后退延迟时 时间的长度,其单位是多少个后退周期(backoffperiod),一个后退周期定义在 参数aUnitBackofff'criod,为20 symbols的时间。CW的初始值为2,最大值可 到31。 BE也就是后退指数(backoffexponent),此值是与CW相关的参数,影响后 退延迟时间的长度;CW=2雎.1,而BE值初始预设值(最小值)为3,最大值为 5,而当BE设为0时,则等同于此基于时槽的CSMA/CA算法被禁止。而 BE最大值只定义到5,主要的考量应是避免过长的后退延迟时间而影响整体的 效能。 后退延迟时间的算法如下: Backoff-time 2 Random()x aUnitBackoffPeriod 其中:Random0=【0,CW】 CW=2髓.1 aUnitBackoffPeriod=20 symbols 1 symbols=16us 当一开始进入基于时槽的CSMA/CA竞争时的CW初始值等于2,等待12 个symbol时间发送前导帧(Preamble and SFD flame)【31。当发生碰撞时,或 DATA、ACK遗失而造成重传时,每重传一次BE值会逐一增加l,minBE=3(初 始值),MaxBE=5。因此,第一次发生碰撞后,BE值为3,CW值则为7(23.1 =7),RandomO函数则会从0到7随机选择一个最小值来产生后退延迟时间; 上海大学硕士学位论文 第二次若仍发生碰撞或发送信道忙,NB会加l,BE值则为4,CW值则为15, 并依这些参数值来产生后退延迟时间。NB值最大为4,也就是说在这个算法 中,最多只能连续发生四次碰撞的机会,在这四次中若无法避开碰撞传送资料, 则该次传送将失败。在IEEE 802.15.4中,最大后退次数由macMaxCSMAbackoff 设定。图2.13就是基于时槽的CSMA/CA的算法流程。 图2.13基于时槽的CSMA/CA 2.4网络层 网络层拥有数据实体和管理实体。网络层数据实体提供下列服务: · 生成网络层协议数据单元(NPDU) ·指定拓扑传输路由 网络层管理实体提供下列服务: 2l 上海大学硕士学位论文 ·配置新设备 ·初始化网络 ·加入和离开网络 ·分配地址 ·邻居设备发现 ·路由发现 ·接收控制 2.4.1网络层的服务规范 ZigBee网络层的主要功能就是提供一些必要的函数,确保ZigBee的MAC 层正常工作,并且为应用层提供合适的服务接口。为了向应用层提供其接口, 网络层提供了两个必须的功能管理服务实体,如图2。14所示。 一,,。’一~,‘秆 “√‘一Next.§oaer蝴r若一n笤桫■:·!,一。√o’o l’’‘’“‘’4’’”11’’‘’“6”…“、’。3 4…’”“。“4’+‘ ”’ 9’”‘…。。““4+‘‘6‘”。‘。。。‘。 ‘‘”。…’。’4’ r::7‘:7√:’’■…:■7一…一……7‘…’7 ■■:‘i 4,’,|~i k,“,oo l ‘ l,t n一 ,’、 一 ,‘ 。 ÷^ 一 ·^‘ t{' 。’ 一 Vj| _… 一q ’’ ’‘ 4{ 一 “ 一 巨:囊:。0::|、。|,≥;,I ij.,.睁椿tl__!、0:≥01≤i 图2-14网络层参考模型 网络层数据实体(NLDE)通过网络层数据实体服务接入点(NLDE.SAP) 提供数据传输服务,网络管理层实体(NLME)通过网络层管理实体服务接入 点(NLME.SAP)提供网络管理服务。网络层管理实体利用网络层数据实体完 成一些网络的管理工作,并且网络层管理实体完成对网络信息库(NIB)的维 护和管理。 网络层通过MCPS.SAP和MLME.SAP接口为MAC层提供接口,通过 上海大学硕士学位论文 NLDE.SAP与NLME.SAP为应用层提供接口服务。 2.4.2网络的建立 ZigBee网络最初是由协调器发动并且建立。协调器首先进行信道扫描 (Scan),采用一个其他网络没有使用的空闲信道,同时规定Cluster-Tree的拓 扑参数,如最大的子节点数(Cm)、最大层数(Lm)、路由算法、路由表生存 期等。 图2.15节点加入及脱离网络握手示意图 图2.15是设计的节点加入及脱离网络时的握手示意图。协调器启动后,其 他普通节点加入网络时,只要将自己的信道设置成与现有的协调器使用的信道 相同,并提供正确的认证信息,即可请求加入网络。一个节点加入网络后,可 以从其协调器得到自己的短MAC地址、ZigBee网络地址以及协调器规定的拓 扑参数。同理,一个节点要离开网络,只需向其协调器提出请求即可。一个节 点若成功地接收一个子节点,或者其子节点成功脱离网络,都必须向协调器汇 报。因此,协调器可以即时掌握网络的所有节点信息,维护网络信息库(PIB, PAN Information Base)。 网络层路由设计分为IⅢ+,RN.和RFD三个模块。IⅢ+表示开启路由功能 的全功能设备(FFD)模式,RN.表示关闭路由功能的全功能设备(FFD)模式, RFD表示简单功能设备模式。在传输数据时,不同类型的节点有不同的处理方 法,协调器的处理机制与l埘+相同。点对点通信是通过MAC地址进行数据传 上海大学硕士学位论文 输的,所以每个节点在接收到信息包时,都要维护邻居表,邻居表主要起地址 解析(Address Resolution)的作用:将邻居节点的网络地址转换成MAC地址。 另外,类型是IⅢ+的节点在接收到信息包或者启动AODVjr查找路由时【26】,还 必须维护路由表。邻居表和路由表的记录都有生存期,超过生存期的记录将被 删除。 2.5本章小结 本章主要介绍了ZigBee协议栈的框架,并且重点分析了物理层,MAC层 及网络层的功能和他们之间的数据接口和管理接口,为后面几章内容做一个铺 垫。 上海大学硕上学位论文 第三章ZigBee无线收发器驱动程序设计 3.1 ZigBee网关平台介绍 嵌入式无线ZigBee网关是对wsN无线传感网络)中的ZigBee设备所发送 的数据进行协议解析,并且利用TCP/IP网络发送给数据服务器。整个系统是以 基于32位ARM微处理器为硬件平台,以CC2420 ZigBee芯片构成嵌入式系统 中的无线发射接收装置,它是满足802.15.4标准的接口芯片,通过SPI总线与 微处理器相连。整个系统的设计主要包括在Linux系统中完成无线ZigBee收发 器的驱动设计、ZigBee协议栈的移植和网络通信程序。 本系统主要由硬件平台和软件平台组成。硬件平台包括一个基于ARM920T 的开发板,一个是无线ZigBee收发器CC2420。软件平台包括嵌入式Linux操 作系统,交叉编译工具链。开发机为一台运行SUSE Linux的host开发主机, 通过NFS网络和串口连接开发板,用于开发和调试程序。 系统架构如图3-1所示: 图3-1 ZigBee网关系统架构 上海大学硕士学位论文 网关软件功能模块框图如3.2所示: 网关程序 网关通信模块 Zigbee协议栈模块 信号处 理器 J 文件访问 用户层 信号 :.....·.:兰墨兰=|二=_:二:....----一---一--- I I 内核层 瞵知模块l闭模l块II l模块l I裹鬟l 驱动程序 图3-2 ZigBee网关软件功能模块框图 如上图所示,本系统软件部分设计主要设计了2个程序:无线收发器的驱动 程序和网关程序。其中无线收发器的驱动程序主要完成操作系统与无线收发器 的之间接口,用户层的网关程序可以通过该接1:3访问设备。网关程序主要有 Zigbee协议栈模块和网关通信模块及其他相关程序组成。Zigbcc协议栈模块完 成协议栈的解析处理工作。网关通信模块主要完成网关与上位数据服务器连接 通知任务。其他相关程序还包括信号处理器,用于截获驱动程序中异步通知模 块发出的实时信号,文件访问用于通过VFS(虚拟文件系统)访问设备驱动程 序。 3.1.1网关硬件平台 网关硬件平台控制器是基于ARM920T核的三星¥3C2410,无线收发器采用 TI公司的CC2420芯片。系统实现了ARM利用SPI总线与CC2410通信,用于 控制和传输数据。本系统还采用ARM芯片上4个GPIO口作为中断口,分别连 接CC2420的4个中断输出脚。两块主要芯片的引脚连接关系如下图3.3: 上海大学硕士学位论文 FIFo FIFOP CCA 8FD CSn Sl S0 8CLK Reset GPG6(EINTl 4 Interrupt) GPGl 1(EINTl 9 interrupt) GPal(ElNT 18 interrupt) GPG7‘EINTl 5 Timer capture) GPG2 SPIM0810 SPlM-S00 SCLKO (≥Pa0 CC2420 S3C2410 图3-3¥3C241与CC2420连接图 其中左边为CC2420芯片,一共有9个引脚与ARM芯片连接。其中FIFO、 FIFOP、CCA、SFD为CC2420中断输出脚,分别连接ARM芯片的GPG6、GPGll、 GPBl和GPG7四个引脚。CC2420的片选脚CS连接GPG2,复位脚Reset连接 GPB0。由于该ARM芯片具有2组SPI,我们选用SPl0输出引脚与CC2420的 SCLK、SI、SO连接。其中GPG6、GPGll、GPBl和GPG7四个引脚通过寄存 器配置为外部中断引脚,GPG2和GPB0配置为输出引脚。 >S3C2410芯片简介 S3C2410是Samsung公司推出的一款基于ARM920T内核的16/32位 RISC嵌入式微处理器,最高工作频率可达203MHz,主要面向手持设备以及高 性价比、低功耗的应用。芯片实现了MMU、AMBA(Advanced Microcontroller BusArchitecture)BUS和哈佛(Harvard)高速缓存体系结构。其中,MMU主 要用于管理虚拟内存;AMBA总线是ARM公司设计的一种用于高性能嵌入 式系统的总线标准;高速缓存由独立的16KB指令Cache和16KB数据 Cache组成。¥3C2410还提供了大量的内部设备和丰富的外部接口,其内部结 构图如图3.4所示: 上海大学硕士学位论文 UART USB Devices SDi/MMC Watchdog Timer BUS Cont. SPI 12C 12S GPlo RTC ADC Power Management Clock Cont. Interrupt Cont ARM920T Cofe 200MHz JTAG 雩 夏 嗡 一80 …8~ 甄 I l LCD DMA 4 Channei DMA ControUer Bus Cont. Arbiter,Decoder USB HostCONT. NandFlash Cont. Memory Cont. 图3_4 S3C2410内部结构图 ¥3C2410可以使用SPI接口用于串行数据传输。¥3C2410芯片包含两个SPI 接口控制器。每个控制器拥有两个8位的串行移位寄存器用于传输和接受数据。 在数据传输期间,发送和接收都是同步进行的。传输的频率是由SPI控制寄存 器设定。如果只用于发送,那么同步接收到的数据就是垃圾数据,相反,如果 只是用于接收数据,那么你需要发送一个垃圾数据如0Xffo · 典型SPI编程步骤: 1. 设置SPI波特率寄存器。 2. 设置SPI格式在SPI控制寄存器中。 3. 利用GPIO去片选SPI从设备。 4. 检查发送数据允许标志位为l时,然后往发送寄存器写入数据。 5. 普通模式下接收数据,需手动发送0xff数据,然后检查标志位,从 接收寄存器中读取数据。 6. 在自动垃圾数据模式下接收数据,直接检查标志位,读取数据。 7. 发送/接受结束后,利用GPIO去掉片选。 上海大学硕士学位论文 SPI特殊寄存器: 1.SPCONO SPI通道0控制寄存器地址0x59000000控制字如表3.1: 表3-1 SPI控制寄存器控制字 SPCONn Bit Description SPl Mode Selec t《SMOD) 16:51 Determine how and by what sP'rDAT is旭曩dfk讹n 00 2 polling mode.01:inlermpt mode SCI(Enable lENSCI(J 10=DMA mode。 11 2 resence(I Determine砌咖you 刚 want SCK鞠abk or not(for∞Iy master). O=disable。 '2enable Master/Slave Select (MSTR) Clock Polarity Select (CPOL) 翻 Determine Ihe desired mode(master饼slave). O 2 slave. 1 2 masl斟 initiate诋. NOTE:In slave mode.1here should be set up鲕e for master to 团 Determine an adive垴gh or a鼬e low clock. O 2 aclJve!h砷, 扣aOJ、ce low Clock Phase Select fCPHA) "I x Auto GaCoage Data mode enable mGD) fIl Select o精of two fundamentally different transfer formats. O=forn胳t A. 1=formatB 嘲 O=n甜maI掰№ rel蝴lg Decide whelher the data onty needs Or not. 1="Ixautogarbagedatamode NOTE:In norm,it mode。if you orIIy want to llecerce d,lta. you should transmit dummy O)cFF data. Initial State ∞ 0 O O 0 O 2.SPSTAO .SPI通道0状态寄存器地址0x59000004控制字如表3.2: SPSTAn R酗删 Dala Collision Error F|a9 (OCOt) Multi Master Error FI叼 《舢LF) 瓢瞒衙Rea电FIa9 (RI=DY) 表3-2 SPI状态寄存器控制字 Bit I)esctiOtJon Initial State 17:31 12l This tla9 is.sel ifthe SPTDAIn is whiten or the SPRDKI'n is O read while a嘶slief is in progress and etear列时reading n艳SPsl碡岍. O=not detect, ':collision error detect nSS蛳l 11】 Ⅲs flag is seI iflhe goes Io active low while the O is∞确g涮弱a SPI mastet",and SPPlNn's ENMUL bit is 咖SP¥1An. 积椭Ill'el errors detect mode.MULl=is dearecl by O:not detecll 1:mulli master error detect 网 This bit indicates lhat SPFDAIn Or SPRD/\Tn is他ady幻 1 嗍clara自o ll'an辄lil or receive.This llag is翎豳删妇ca|Iy cleared by SPlO,Alrt O=not ready, {=dataTx/Rx蒯y 上海大学硕士学位论文 3.SPPREO SPI通道0波特率寄存器地址:0x5900000C控制字如表3-3: 表3.3 SPI波特率寄存器控制字 ¥PPREn Prescaler Value 隙 De硎脚 P:ol Detemme SPI clock rate as alx)ve equation. Baud rate=PCLK 1 2 1(Prescaler value+1) lnitial State 0潮 4.SPTDATO SPI通道0发送寄存器地址:0x59000010 5.SPRDAT0 SPI通道0接收寄存器地址:0x59000014 上述几个寄存器将被驱动程序用到,在后续驱动设计部分将会再次提到。 >CC2420芯片简介 CC2420是Chipcon公司在2003年底推出的一颗兼容2.4GHz IEEE802.15.4 的无线收发芯片。CC2420基于Chipcon公司的SmartRF 03技术,使用0.18 la m CMOS工艺生产,具有很高的集成度,采用尺寸为7*7mm,48针QFN封装。 包含了物理层(PHA)及媒体访问控制器(MAC)层,具备65,000个节点通道并可 随时扩充。该芯片以低耗电、250kbps传输速率、快速唤醒时间(<30ms)、 CSMA/CA通道状态侦测等特性,非常适合于家庭及楼宇自动化、工业监控等 应用系统。 CC2420具有完全集成的压控振荡器,只需要天线、16MHz晶振等非常少 的外围电路就能在2.4GHz频段上工作。CC2420只提供一个SPI接121与微处理 器连接,通过这个接口完成设置和收发数据两方面的任务。许多单片机都集成 了硬件SPI控制器,可以非常方便地与CC2420配合使用。简单的外围电路和 处理器接121,使得CC2420可以运用在非常廉价的设备上。典型电路如图3·5: 上海大学硕士学位论文 图3-5 CC2420典型应用 3.1.2网关软件平台 进行任何一个项目的开发,首先要做的是搭建一套开发环境,这套环境包 括操作系统以及含连接器、编译器、调试器在内的软件开发环境。绝大多数 Linux的软件开发都以native方式进行,即本机开发、调试,本机运行的方式。 这种方式通常不适于嵌入式系统的软件开发,因为对于嵌入式系统的开发,它 没有足够的资源在本机(即嵌入式系统平台)运行开发工具和调试工具。因此 通常的嵌入式系统软件开发采用交叉编译调试的方式。交叉编译调试环境建立 在宿主机Host(即PC机)上,对应的开发板叫做目标板Target(即嵌入式ARM9 --¥3C2410系统),两者通过串口或网线相连,进行跨平台开发。 Linux下开发环境的建立主要就是建立交叉编译环境。步骤如下: 1.宿主机端建立釉.1inux T具链,用于编译嵌入式驱动和应用程序。 2.在宿主机端安装嵌入式目标板中运行的Linux内核源代码。 3.选择串口或者网线连接宿主机和目标板进行通信。 4.在宿主机端建立NFS共享目录,供目标板进行驱动安装和程序运行。 通过以上步骤,就可以建立嵌入式Linux的开发环境,为驱动程序设计提 3l 上海大学硕士学位论文 供了平台。 网关开发宿主机采用SUSE Linux lO.2操作系统,内核版本2.6.18。目标板 运行Linux内核版本2.6.1 l,放置于utu.1inux for s3c2410 V1.3/,交叉工具链 位于/usr/local/arm/3.4.1/,版本3.4.1。 在宿主机的/etc/exports添加/code *(rw,sync,noroot_squash)以支持NFS 文件系统,其中/code目录为NFS共享目录,·表示允许任何口挂载该目录,rw 表示可以进行读写,sync表示同步更新,noroot_squash表示可以目标板root 用户在NFS共享目录中可以有实际的root权限。在目标板/etc/init.d/rcS中添加 一行mount.0 nolock 58.198.102.148:/code/code用于内核启动后自动加载远程 NFS目录,其中.O nolock表示在一个应用程序锁定一个NFS目录文件时候,防 止NFS客户端提醒服务端锁管理器,58.198.102.148:/code表示宿主机的m和 NFS目录,最后一个/code表示客户端一个准备接受NFS映射的目录。 开发和调试过程采用了两种方式访问目标板: 1.以太网 基于目标板提供telnet服务器,从宿主机采用putty登陆目标板。 2.串口 基于目标板提供串口输出,可以采用putty或者minicom登陆目标板。 一般说来采用telnet方式登陆终端能够更好的响应一些信号,适合于输入 命令,采用串口方式一般更适合观察程序输出,比如uboot这样的引导程序。 在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空 间和运算能力,比如常见的ARM平台,其一般的静态存储空间大概是16到 64 MB,而CPU的主频大概在IOOMHz到500MHz之间。这种情况下,在 ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链 (compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。 为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,就可以 在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其 它平台的可执行程序。 要进行交叉编译,需要在主机平台上安装对应的交叉编译工具链(cross 32 上海大学硕士学位论文 compilation tool chain),然后用这个交叉编译工具链编译源代码,最终生成可在 目标平台上运行的代码。常见的交叉编译例子如下: 在Windows PC上,利用ADS(ARM开发环境),使用armcc编译器, 则可编译出针对ARM CPU的可执行代码。 在Linux PC上,利用arm-linux.gee编译器,可编译出针对Linux ARM 平台的可执行代码。 本系统就是采用arm.1inux.gee在一个平台上生成另一个平台上的可执行代 码。 3.2 ZigBee无线收发器驱动程序设计 3.2.1 LiflUX驱动程序框架 Linux内核中的虚拟文件系统(VFS,有时候称为虚拟文件系统交换器) 通过使用一组通用的API函数,使得Linux可以在许多种存储设备上支持许 多种文件系统。Linux文件系统接白实现为分层的体系结构,从而将用户接l=l 层、文件系统实现和操作存储设备的驱动程序分隔开。如图3-6所示: 图3-6 Linux内核体系 33 上海大学硕士学位论文 用户空间包含一些应用程序(例如,文件系统的使用者)和GNU C库 (pJibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接El。系统 调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的 适当端点。 VFS是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽 象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统 对象的缓存,它们分别缓存最近使用过的文件系统对象(inode和dentry)。 每个文件系统实现(比如ext2、JFS、yaffs等等)导出一组通用接口,供 VFS使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底 层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请 求,减少访问物理设备的次数,加快访问速度。VFS以最近使用(LRU)列表 的形式管理缓冲区缓存。 Linux以一组通用对象的角度看待所有文件系统。这些对象是超级块 (superblock)、inode、dentry和文件。超级块在每个文件系统的根上,超级块 描述和维护文件系统的状态。文件系统中管理的每个对象(文件或目录)在 Linux中表示为一个inode。inode包含管理文件系统中的对象所需的所有元数 据(包括可以在对象上执行的操作)。另一组结构称为dentry,它们用来实现名 称和inode之间的映射。dentry还维护目录和文件之间的关系,从而支持在文 件系统中移动。 inode表示文件系统中的一个对象,它具有惟一标识符。各个文件系统提 供将文件名映射为惟一inode标识符和inode引用的方法。图3.7显示inode 结构的一部分以及file_operations结构。inode结构中的inode_opo'ations定义直 接在inode上执行的操作,而file_operations定义与文件和目录相关的方法 (标准系统调用)。后者则是驱动程序与文件系统的关键接口。 上海大学硕士学位论文 st'uct file.opera,s{ stmct inode{ stmct module*owner, st眦t hlist node I hash; Ioff_t(*llseek)(stnctfile‘,Ioff_t int); 蜘JcIlist head .I蹴 slnct list head i sb list 嚣ize-l(‘fead)(蚶1lc}fl|e。,char_.user*,size_tIoff_t slnct list—head i.de哪 unsigned|0fIg ∽ a咖雌 嘞哺 stmct inode_operations*LOP; 髟 / constslluct flle_opeml|ons'i fop:0 sunssiizgen_etd(*iwnrti(t。ep)o(Us)b('sutmccttfiflle‘e‘,c,ons洲tch帅ar一N删嘲。c,I.s毗1哪.): 瓣(‰||)(咖cl inode‘,stmctfile。,unsigned吼unsigned|0ng): int(*open)(sb吣inode。。stnct fte*); int(*release)(stmct inode。。stmct file*); int('fasync)(吼stncttle‘,啡 } X 图3-7 inode结构和fileoperat/on操作 由于Linux操作系统将所有的设备全部都看成文件,所以对设备的操作转 变为对文件的操作。每一个设备都至少由文件系统的一个文件代表,因而都有 一个“文件名”。每个这样的“设备文件”都唯一地确定了系统中的一项设备。应 用程序通过设备文件寻找访问具体的设备,而设备则象普通文件一样受到文件 系统访问权限控制机制地保护。 Linux将设备分成两大类。一类是像磁盘那样以记录块或“扇区”为单位,成 块进行输入/输出设备,称为“块设备”;另一类是像键盘那样以字符(字节)为单 位,逐个进行输入/输出的设备,称为“字符设备”。在Linux操作系统中,驱动 程序是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,驱 动程序是内核的一部分,它完成以下功能: ·初始化设备和释放设备 · 管理设备,包括实时参数设置以及提供对设备的操作接口 ·读取应用程序传送给设备文件的数据并回送应用程序请求的数据 ·检测和处理设备出现的错误 如图3.8所示,应用程序通过Linux的系统调用与内核通信。由于Linux 中将设备当作文件处理,所以对设备进行操作的调用方式和对文件操作的操作 方式类似,主要包括openO、read()、write()、ioctlO、close0等。应用程序发出 系统调用命令后,会从用户态转到内核态,通过内核将op肌()这样的系统调用 35 上海大学硕士学位论文 转换成对物理设备的操作。 图3-8 Linux内核体系 进行嵌入式Linux系统的开发,很大的工作量是为各种设备编写驱动程序。 在ARM平台上开发嵌入式Linux的设备驱动程序与在其他平台上开发是一样 的。总的来说,实现~个嵌入式Linux设备驱动的大致流程如下: (1)查看原理图,理解设备的工作原理 (2)定义主设备号 . (3)在驱动程序中实现驱动的初始化。如果驱动程序采用模块的方式,则 要实现模块初始化 (4)设计所要实现的文件操作,定义file_operations结构 (5)实现中断服务 (6)编译该驱动程序到内核中,或者用insmod命令加载 ZigBee无线驱动程序属于字符类设备驱动程序,主要有以下几个模块组成: (1)设备初始化和退出模块 (2)设备打开和关闭模块 (3)设备读写及I/0控制模块 (4)设备中断模块 (5)设备异步通知模块 上海大学硕士学位论文 3.2.2设备初始化和退出模块 整个驱动程序需要一个初始化函数和一个退出函数。初始化函数负责注册 模块所提供的任何可以被应用程序访问的新功能。它可以是一个完整的驱动程 序或者仅仅是一个软件抽象。通常定义如下: static int......init initialization_funaion(void) { 产初始化代码·/ ) module—init(initialization_fimction); 初始化函数申明为static是因为该函数在特定文件之外没有意义。 init标 记表示该函数在初始化阶段使用,当模块加载后,该函数所占用内存可以被释 放掉,如果设备支持热插拔,则应该使用另外标记。 module init的使用是强制性的,该宏会在模块的目标代码中增加一个特殊 的段,用于说明内核初始化函数所在位置。没有该定义,初始化函数永远不会 被调用。 本驱动在初始化函数中主要完成设备号的动态分配、设备注册到文件系统、 ’ I/o映射和中断申请4个任务。 其中动态分配设备号由alloc_chrdev_regionOi函数完成。原型如下: int alloc_chrdev_region(dev—t·dev,unsigned int fristminor, unsigned int count,char幸name); dev表示此函数输出的设备编号,fristminor是使用的被请求的第一个次设 备号,count表示所请求连续编号的个数,name是设备名称。 分配成功后需要字符型设备的初始化和加载,主要由下列两个函数完成。 void cdev_init(struct cdev幸odev,struct file_operations宰fops); int cdev_add(struct cdev枣cdev,dev—t dev,unsigned count); cdev—init函数将cdev结构与file_operation绑定。cdev—add函数告诉内核该 结构的信息。 最后利用devfs mk cdevOi函数在文件系统/dev目录下创建设备节点,用于 应用程序访问。 I/O映射是将寄存器物理地址(PA)映射为虚拟地址(VA),这样内核就可 37 上海大学硕士学位论文 以通过虚拟地址访问操作寄存器了。I/O映射函数如下定义: void·ioremap(unsigned long physaddr,unsigned long size); physaddr表示寄存器的物理地址。size表示映射到内存空间大小。 中断申请将会在后面的中断模块章节中详细介绍。 设备退出函数是在模块被卸载前注销接口并向系统返回所有资源,定义如 下: static void....—.exit cleanup_function(void) { 严退出代码幸/ } module——exit(cleanup_function); 清除函数没有返回值,因此申明为void。 exit标记表示该函数仅用于模 块卸载。module exit申明对于清除函数是必需的。 3.2.3设备打开和关闭模块 设备打开和关闭对应着系统调用中的open()和close()调用。设备打开函数 主要负责初始化GPIO和SPI寄存器及允许接收中断,关闭函数主要关闭中断。 spi_open(struct inode奉inode,struct file宰filp); { 产初始化GPIO、SPI和允许中断串/ ) 实际代码举例如下: 如根据三星¥3C2410手册设置GPB0端口为输出功能需要把GPB配置寄存 器最低两位设置为01,则 value=_.__raw_readl(SPI_GPBCON); value&=0xfffitffc; value I=Oxl; 善梢,峨tel(value,SPIGPBCON); 要设置砸波特率,就要根据CC2420手册上规定SPI波特率不得超过 lOMbps/s及三星S3C2410手册上SPI波特率的计算公式: Baud Rate=PCLK/2/(Prescaler value+1),其中PCLK=50MHz则 38 上海大学硕士学位论文 spi_preO=Prescaler value: 其中Prescaler value应大于2以保证CC2420手册规定。 要设置中断响应函数判断标志位,就可以用下面命令使中断处理处理中断: interrupt_enable=1; 3.2.4设备读写及I/0控制模块 设备读写函数及I/O控制函数对应着系统调用中的writ<)、read()和ioctlO 调用。设备读函数负责获取用户层指针和利用轮询方式把数据传送给SPI发送 寄存器。函数如下: ssize_t spi write(struct file幸fp,char幸buf,size_t size) (1)获取用户层指针 copy_from_user(writebuf,bur,size); 利用此函数可以安全获取用户空间指针。 (2)利用轮询方式把数据传送给spi发送寄存器 while(endSpiTx=O) { . int i=0; . if((spi_sta0&0x01)=1) { if(i<size) spi_tdatO=writebutti]; else endSpiTx=l; i++; ) ) endSpiTx为标志位,判断发送是否结束。 spi_sta0是¥3C2410的SPIO状态寄存器,最低位置1表示Ready。 该函数通过不断查询SPIO的最低位是否为1来决定是否将数据放入 spi_tdatO发送寄存器。 spiread()i函数负责接收CC2420数据,并且发送到用户空间。 ssize_t spi_read(struct file·fp,char宰buf,size__t size,loff_t·offp) 上海大学硕士学位论文 { for(i=0;i<size;i斗+) { while((spistaO&Ox01)=0); readbuf[i]=spi_rdatO; ) copy_to user(buf,readbuf,size); r眦ll"n O; ) 其中copy...to_..uscr()能安全的把指针传递给用户层应用程序。 设备的I/O控制函数一共提供4组命令,分别是重启CC2420、片选CC2420、 中断允许使能和微妙级延时控制。 int spi_ioctl(struct inode宰inode,struct file幸flip, unsigned int command, unsigned long arg) { switch(command){ case 1: if(argO) {/*Disable CC2420}/) else {/*Reset CC2420·/) break; case 2:{产根据应用层参数片选CC220"/) case 3:{/幸根据应用层参数使能中断宰/) case 4:{严根据应用层参数设定延时时faJ,/) default:ret-uril-EINVAL; ) } return O; 3.2.5设备中断模块 由图3.2所示,CPU一共要处理4个外部中断FIFO、FIFOP、SFD和CCA。 本模块只使用了其中三个中断,CCA并未使用(当处于很多2.4G无线设备须 使用)。Linux内核通过这三个中断来管理CC2420。每一个设备驱动程序处理 上海大学硕士学位论文 中断都需要申请中断、释放中断和编写中断处理函数。 由于中断信号线资源很有限,因此内核维护一个中断信号线注册表,在使 用中断前需要首先申请中断请求(IRQ),然后在使用后释放掉。申请函数接口 如下: int request irq(unsigned int irq, irqreturn_t(幸handler)(int,void宰,struct pt_regs·), unsigned long flags, const char宰dev_name, void·dev_id); 其中irq为中断号,该中断号是根据硬件连接引脚和¥3C2410的板级支持 包中中断号的定义决定,例如FIFOP连接外部中断19(EXTINTl9),根据 /include/asm.arm/arch.s3c2410/irqs.h中IRQ EINTl9为69,故为FIFOP申请中 断号为69。 handlerO为中断处理函数,会在后面详细介绍。 flags为中断管理掩码。有SA—INTERRUPT、SA.SHIRQ、 SA SAMPLE RANDOM三种标志位。分别表示快速中断、中断共享和熵池做 出贡献【171。 dev—name传递给request_irq的字符串,用于在/pro/interrupts中显示中断的 拥有者。 dev id用于共享的中断信号线。 在申请中断之前还需要设置中断类型和是否使用上拉电阻,这是根据使用 芯片类型和其板级支持包决定,例如本模块采用下列2个函数用于设置: s3c2410__gpio_pullup(S3C2410_GPGl 1,0); s3c_irqext_type(FIFOP_IRQ■O,IRQT_BOTHEDGE); 第一个函数用于配置GPGll口上拉无效,后面一个用于设置申请中断的触 发方式,比如沿触发还是电平触发。 释放中断函数接口如下: void free_irq(unsigned int irq,void幸dev_id); 中断处理函数的功能就是将有关中断接收的信息反馈给设备,并根据正在 41 上海大学硕士学位论文 服务的中断的不同含义对数据进行相应的读或写。中断处理程序的典型应用就 是通知进程所等待的事件已经发生,比如新的数据达到,这样就会唤醒在该设 备上的休眠的进程。 在中断处理程序中需要启用和禁止,这是因为中断处理程序在其处理过程 中如果没有被锁机制保护,那么就会产生中断嵌套,一般我们不希望发生,所 以有了中断的启动和禁止。对于启动和禁止单个中断,可以使用如下函数: void enable_irq(int irq); void disable_irq(int irq); 对于禁止和恢复本地中断(本模块采用这种事方式),函数如下: void local_irq_save(unsigned long flags); void local_irq_restore(unsigned long flags); 对于中断程序如何快速完成处理也是一个很重要的问题,Linux把中断处 理很好的分成了2个部分,一部分叫顶半部,一部分叫低半部。顶半部主要是 响应实际中断,即申请注册的中断函数,低半部是在所有中断都打开情况下执 行(即在所谓更安全的时间内运行)【171,Linux操作系统主要由tasklet和工作 队列完成低半部工作,可以简单的认为其是一个内核线程。本模块只处理顶半 部工作。中断处理流程函数处理流程如下图3-9所示: 图3-9中断处理函数处理流程 42 上海大学硕士学位论文 代码框架如下: {return IRQ_HANDLED;} /*lt每时变量定义及异步通知处理幸/ switch(irq){ case FIFOP_IRQNO: { local_irq_save(flags); /*FIFOP中断处理代码·/ local_irq_restore(flags); break; ) case FIFO_IRQNO:{/*FIFO处理奉/) case SFDjRQ』O:{严SDF处理事/) ) return IRQ_HANDLED; 其中interrupt_enable为中断允许标志位,改位由ioctl中的命令3设定,详 细请看设备读写和ioctl模块。FIFOP_IRQN0、FIFOIRQ-N0和SFD—IRQ』O 为申请的中断号,通过switch语句判断中断类型分别处理。由于2.6内核的要 求中断处理函数必需有返回值,瓜Q-HANDLED即是中断返回值。 3.2.6设备异步通知模块 ZigBee网关驱动程序可以通过发送信号的方式通知应用程序接收数据,这 种方式就是异步通知。《Unix Network Programming))中I/0模型有下列5种: ·blocking I/O ·non-blocking I/O ·I/O multiplexing(select和poll) · signal driven I/O(SIGIO) ·asynchronous I/O(POSIX aio函数) 其中signal driven中的signal是指Unix信号,它有两个限制: ·大部分信号有专门用途,用户可定制使用的个数极少,主要是 SIGl01 ·信号没有附加信息,如果一个信号源有多种产生信号的原因,信号 接收者无法确定究竟发生了什么。 43 上海大学硕士学位论文 根据I/O模型,当一个设备的I/O完成,应用进程可以通过RT-Signal获 得异步通知,进行处理。本系统中无线收发器通过3个中断引脚通知处理器, 因此,驱动程序需要处理这三个中断,并且通过异步通知方式把实时信号发送 到应用程序(即网关后台主程序),应用程序截获信号并进行相应的处理。异步 通知的应用框架如图3.10所示: 内核层 应用层 配置file oep憎tion中f.async 工 T ◆ l中断处理函数中发送实时信号 打开设备 工 I初始化学处理器 一 ◆ I设置异步避,相关属性 - ◆ } 截获信号进行处理 ■ ■ ● ●L....--....-----.-.—● 实时信号 图3.10异步通知应用框架 如上图所示,驱动程序在内核层驱动中包含<linux/fcntl.h>头文件,在 file_operations结构中添加.fasync=devfasync,设置设备发送信号给的进程号。 通过下列函数实现: int dev_fasync(int fd,struet file木flip,int mode) { return fasynchelper(fd,filp,mode,&asyne_queue); ) 其中async_queue是一个异步事件通知队列,用于注册发送信号的目标进 程PID。 在中断处理函数中用了一种更加底层的方式发送实时信号。在上一节中, 在中断处理函数handler中: fown=&asyne_queue->fa__file->f_owner; pid=fown·>pid; 上海大学硕士学位论文 p=find_task_by_pid(pid); send_..sig_info(signum,&si,p); 其中async_queue定义为fasyncstruct,它是一个异步队列。fown类型为结 构体fown struct的指针,表示设备文件的拥有权限。pid为进程号。 find task_by_pid()函数表示根据进程号查找进程表示符P,P的类型是 task—struct。send_sig_infoO用于发送指定信号给指定进程,其中si表示信号的 信息,类型为siginfo__t。 应用层中打开设备用open系统调用。初始化信号处理器用下列函数: struct sigaction action; sigset_t blocked_sigs; mcmsct(&action,0,sizeof(action)); action.sahandlet=signal_process; sigemptyset(&action.sa_mask); action.sa_flags=SA-』OMASK; sigaction(signum,&action,NULL); action是信号处理器,signal process是信号处理器的处理函数,负责截获 信号后进行处理,信号处理器的sa flags是信号处理器的标志位,此处设置为 SA NOMASK。sigaction()为信号处理器加载截获的信号值。 早期Unix系统只定义了32种信号,Ret hat7.2支持64种信号,编号 0-63(SIGRTMIN=31,SIGRTMAX=63),将来可能进一步增加,这需要得到内核 的支持。前32种信号已经有了预定义值,每个信号有了确定的用途及含义,并 且每种信号都有各自的缺省动作。如按键盘的CTRL^c时,会产生SIGINT信 号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同于前 面阐述的可靠信号。这保证了发送的多个实时信号都被接收。实时信号是POSIX 标准的一部分,可用于应用进程。非实时信号都不支持排队,都是不可靠信号; 实时信号都支持排队,都是可靠信号。本驱动一共选用了33.39共7个实时信 号,其中33.38这6个实时信号分别对应于外部三个中断的电平高低,最后一 个实时信号39用于微秒级延时。 45 上海大学硕士学位论文 为了启用异步通知机制,应用程序必须执行2个步骤,首先设定进程为 owner:其次通过设置设备的FASYN标志,用fcntl的F—SETFL命令完成。具 体函数实现如下所示: fcntl(fl,F_SETOWN,getpidO); fcntl(fd,F_SETFL,fcntl(fd,F_GETFL)[FASYNC); 最后简单介绍一下信号处理器的处理函数。结构如下: void signal_proeess(int i){ switch(i){ case 33:FLAG_FIFOP=O;break; Case 34:FLAG—FIFOP=1;break; ) ) FLAG FIFOP这些标志位在协议栈处理任务中会通过轮询方式处理。 3.2.7微秒级延时的使用及其他部分 在驱动程序中,无线发送或者超时需要定时器,在arm芯片中由于 /linux/param.h定义的HZ为200,即用TICK方式定时最小分辨率只能为5ms, 不能满足单个symbol的时间。 802.1 5.4中在2.4G频率上bit rate为250kb/s,symbol rate为62.5ksymbols/s, 即每个symbol需要的时间为16us。 最新内核出现了hrtimer高精度定时器定义,不过需要cpu支持,在当前内 核版本2.6.11并未定义此函数。但在所有arm内核中都定义了udelayO用于US 级别延时,因此本驱动就采用此方式来进行延时操作。具体步骤如下: 在驱动程序ioctl中加入US级别延时,并且延时结束发送信号通知上层应 用程序。 参数命令4代表延时标志,arg表示延时的长度参数,不应该超过1000, 如果超过最好使用mdelay()。当定时到期后,发送信号通知上层程序,用于更 上海大学硕士学位论文 新标志位。 ease4: if(arg<1 000) { fown=&async_.queue一>fa_file->f_owner; pid=fown·>pid; p=find_task_by_pid(pid); udelay(arg); send_sig_info(39,&si,p); ) break; 这样应用程序就可以通过这种机制进行精确的延时。 最后这里介绍一下编写驱动所必需的头文件及模块描述性定义。 撕nclude<linux/module.h> #include<linux/init.11> 上述2行代码是所有驱动必须包含的,module.h包含有可以装载模块所需 要的大量符号和函数定义。init.h是指定初始化和清除函数。 模块中包含很多描述性定义,这些都是可选的,常用定义如下如下: MODULE LICENSE(“描述许可证版本”) MODULE AUTHOR(“描述模块作者”) MODULE DESCRIPTION(“模块用途的简单描述”) MODULE VERSION(“模块版本号”) MODULE ALIAS(“模块的别名”) MODULE DEVICE TABLE(“告诉用户空间模块所支持设备’,) 3.2.8驱动程序编译和加载 当软件平台的交叉工具链安装好以后,就可以执行驱动程序编译工作,这 里简单叙述一下编译及加载过程。交叉工具链安装在=/usr/local/arm/3.4.1下面, 利用下面2个语句指定交叉编译器和执行路径。 export CROSSCOMPILER=/usr/local/arm/3.4.1 47 上海大学硕士学位论文 export PATH。¥CROSSCOM呼ILER/bin:¥PATH 目标板运行的Linux内核放置在/utu.1inux for s3e2410 V1.3目录下,在驱 动源文件目录下编写Makefile如下: ifneq(¥(KERNELRELEASE),) obj-m.-cc2420一driver.o else KDIR:=/utu-linux—for—s3c2410J1.3 PWD:=¥(shell pwd) default: S(MAKE)-C¥(KDIR) M=¥(PWD)modules endif nn-f宰.o宰.ko聿.mod.宰 在上述Makefile中obj.m表示编译成模块。¥(MAKE)就会调用交叉编译器, .C表示改变目录到.C选项制定的位置。M=选项让该makefile在构造modules 目标之前返回到模块源代码目录,然后modules目标指向obj.m变量中设定的 模块。最后在源文件目录中生成ec2420 driver.ko目标文件。 把cc2420 diver.ko文件放置在/code(NFS共享目录)下,通过使用telnet 用putty登陆目标板,mount宿主机中的共享目录,然后键入下面命令安装模块: insmod ee2420——dnver.ko 通过上面这个命令就可以安装驱动模块,可以通过串口或者dmesg查看安 装消息,本驱动安装消息如图3.11: 上海大学顿±学怔论文 副e Edit view卫ermtnal Tans Help ellow@Unux—yellow:一,tetnet 58 198.1e2.10l rying 5B.198 182 191... onnected tO 58 198.102.1e1. scape characte r 1s’“1’ usyBox V1.08 l 2007 05.07-1e:27+日000)Built,in sheIl(ash nte F。hetP‘fo F a list of built-in command s 【root@utu-t1NUX/】#cd code/ 【root@utu-linux/codel#insmod usina cC2420 drive r ko cC2420 d rive r ko 【root@utu·linux/code】#l smod Module Size Used by ~0t cc2420 d rlver 5352 e—Live Oxbf日日080e I root@utu-linux/code】#dmesg tail selected clock c02elac4 Ipctk)quot 27.calc selected clock ce2elac4 lpctk)quot 27,calc nfs wa rning:mount Version older than keteeL selected clock c02elac4 Ipclk)quot 2 7.cal c InitlaI Cc242B SPI driver! taInted 113169 113169 113169 /dev/spi has been added to you r system. ret;0 ret=0 ret=o Init spi succes s! [root@utu-linux/codel#_ 图3-i1驱动安装成功打印消息 3.3本章总结 本章首先介绍了无线ZigBee网关系统的硬件平台和软件平台,然后着重介 绍如何根据Linux驱动程序框架设计无线收发器驱动程序.并详细给出无线收 发器CC2420的驱动程序各个模块的主要设计方法和步骤.最后介绍了编译、 安装驱动的过程及方法。 上海大学硕士学位论文 第四章ZigBee协议栈的移植 4.1协议栈移植的简介 本设计采用的无线ZigBee协议栈是以Microchip公司的ZigBee协议栈为基 础,经过作者修改而来。Microchip ZigBee协议栈设计为随着ZigBee无线协议 规范的发展而发展。在发布此文档时,该协议栈的1.0版本具有以下特点: ·基于ZigBee规范的1.0版本 ·使用Chipcon CC2420 RF收发器,支持2.4 GHz频带 ·支持简化功能设备(Reduced Function Device,RFD)和协调器 ·在协调器节点中实现对邻接表和绑定表的非易失性存储 ·支持非时隙的星型网络 ·可以在大多数PICl8系列单片机之间进行移植 ·协同多任务处理架构 ·不依赖于RTOS和应用 ·支持Microchip MPLAB⑩C1 8和Hi.TechPICC.1 8rM C编译器 ·易于添加或删除特定模块的模块化设计 Microchip ZigBee协议栈提供协议栈源文件如表4—1所示。 由于上述协议栈是基于PIC单片机运行,故对于采用了嵌入式Linux操作 系统的无线网关,需要通过修改协议栈来把其移植到网关中运行。由于Linux 分为内核层和用户层模式,无线收发器驱动程序位于内核层,我们可以选择把 协议栈放置在内核层或者用户层。如果协议栈移植入内核层,优点是效率高, 缺点是扩展性(每次升级协议栈都需要编译内核)和调试都不方便(内核调试 难度比用户层大),因此为了方便协议栈升级及系统维护调试,把协议栈放在用 户层,作为网关程序的一部分。 上海大学硕士学位论文 表4-I Microchip协议栈文件列表 藩文镩 目黝称 姆滟臻。c∞z矗A张.m印 De蕾oCoordApp 嚣乞硇珏。c∞rdApp.m诤 De曩。ZC∞za咖。c D蚴oc∞rdA鼯 zj.gb蜓.def De∞C∞rd互∞ DlOnCoord.c S2蚀Coord。c De蕴oCoordApp DemoCoordApp 18f46201.王奴 De,,oCoordApp Co::Jole。c MSPI.C 慕e:g_弛orT豳le.c S蹴too.c Tick.c 龇.C :APs.C Z。o.C 燃.C. Z}嬲.C Z}漱.C z≥腻C2420.c zgrofile。c S:aok S蚀o】【 S蚀ck S乞a01c S钠ok S蚀o】【 SCack S:ack ¥:ack S蚀呔 S乞aek S:ac】c S:ac】【 用途 瓷MPLAB·lDE巾嫠羽豹演繇巍调爨豹境}{|程垮顼疆文捧 协调魏豹主斑溺程穿交箨 哺∞伪和拂议撬缓浮对翔选壤交绛 .ED D1既绥点{}务。;i针毒;协溺嚣转煮 嚣荚S2豹瑶点往务,;{针对协蠲辫翁盎 P|c.攀羚轭黪酗税髑C18递接描述文锌。l-li-Tecll PlCDl8壤i萼 嚣不翥饔谖交终 纹供演琴癌耀税}≯经}{|豹R§232终塌程穿 SPITM‘窆臻U 汝灞瑟r豹够接爱豢l绣定袭踅辑 投供络凌器缝羽豹动客痒辣嚣缪器 袋绣浸技缓嬷豹§按f嚣cI(,蟹熙器。西掰}心掰箨宇 ZigBeeTM嘲I鬈 刁98ee玲;||支持f芸 五gBee设备对象 EEE802.15.4MAC接 非耪炙栋存稚辫存键程窜 乃98ee秘络麓 铮l{CC2420约绕瑷袈狸廖 乃gBee澎霞终穿 协议栈移植最主要是底层接口和一些数据结构的修改,下面将会从物理层 和MAC层两部分进行分析。 4.2物理层移植 网关程序中物理层源文件为ZPhy.c,对应头文件为ZPhy.h。在移植时,首 先把上述文件中所有BYTE类型改为unsigned char,WORD类型改为n类型, 用于匹配Linux标准的C语言编译器GCC。 在.c文件上去掉SPI寄存器访问函数,因为已经编写了无线收发器驱动程 51 上海大学硕士学位论文 序,所以所有访问无线收发器都需要通过驱动程序来完成,即必须通过对设备 进行读写的方式进行(详细参看上一章讨论)。物理层一共定义了7个访问无线 收发器CC2420寄存器、RAM和FIFO的函数,如下: ·uchar Gctstatus(void); 查询并返回CC2420状态值。CC2420状态字如图4.2所示: Bit 7 保留位 Bit 6 0表示晶振未运行,1表示运行 Bit 5 0表示传输过程中FIFO没有溢出,1表示溢出 Bit 4 0表示为加密,1表示加密 Bit 3 0表示发送空闲,1表示发送 Bit 2 0表示PLL失锁,l表示PLL锁住 Bit 1 显示RSSI值是否有效,0无效,1有效 Bit 0 保留位 图4-2CC2420状态字 ·void SpiWriteReg(uchar addr,uchar valuemsb,uchar valuelsb); 往CC2420写入寄存器值,写入寄存器地址为addr,写入值高位放 在valuernsb,低位放在vfludsb中。 ·void SpiReadReg(uchar addr,uchar vfluemsb,uchar vfludsb); 读取CC2420寄存器值,寄存器地址为addr,读取值16bit高位在 valusmsb中,低位放在valuelsb中。 ·void SpiWriteRam(uchar addr,uchar bank,uchar宰data,uchar size); 往CC2420的RAM写入值,写入RAM地址为addr,写入内存组为 bank,写入数组名为data,长度为size。 ·void SpiReadRam(uchar addr,uchar bank,uchar*data,uchar size); 读取CC2420的RAM值,读取RAM为addr,读取内存组为bank, 52 上海大学硕士学位论文 读取数组名为data,长度为size。 ·void SpiWriteFifo(uchar addr,uchar·data,uchar size); 往CC2420的FIFO写入值,写入FIFO地址为addr,写入数组名为 data,长度为size。 ·void SpiReadFifo(uchar addr,uchar幸data,uchar size); 读取CC2420的FIFO值,读取FIFO为addr,读取数组名为data, 长度为size。 物理层还定义了7个宏,用于访问无线收发器驱动程序的I/O控制: ·#define DISABLE_CHIP ioctl(fd,1,0) 通过I/O控制命令1,参数0,关闭无线收发器,其中fd为设备句 柄。 ·#define RESET ioctl(fd,l,1) 。 通过I/O控制命令1,参数1,重启设备,其中fd为设备句柄。 ·#define CS一0 ioctl(fd,2,0) 通过I/O控制命令2,参数0,取消选中,其中fd为设备句柄。 ·#de血e CS-1 ioctl(fd,2,1) 通过I/O控制命令2,参数1,选中无线收发器,其中fd为设备句 柄。 ·#define INTERRPUT—DIS ioetl(fd,3,O) 通过I/O控制命令3,参数0,使中断无效,其中fd为设备句柄。 53 上海大学硕士学位论文 ·#define INTERRPUT—EN ioctl(fd,3,1) 通过I/O控制命令3,参数1,中断使能,其中fd为设备句柄。 ·#define DELAY_US(x)ioctl(fd,4,x) 通过I/0控制命令4,参数X,延时X微妙,其中fd为设备句柄。 最后物理层定了几个全局变量: · int fd 定义设备句柄,用于物理层访问无线收发器。 ·int FLAG—FIFO 网关程序中信号处理函数用于接收中断FIFO信号后修改的标志位。 ·int FLAG—FIFOP 网关程序中信号处理函数用于接收中断FIFOP信号后修改的标志 位。 ·int FLAG—SFD 网关程序中信号处理函数用于接收中断SFD信号后修改的标志位。 ·int FLAG—DELAY 网关程序中信号处理函数用于接收中断DELAY信号后修改的标志 位。 4.3 MAC层移植 网关程序中MAC层源文件为ZMac.c,对应头文件为ZMac.h。Mac层移植 时主要涉及到定时器,内存的分配和回收、访问非易失性内存以及与上位数据 服务器通信四个部分,首先讲一下定时器。 >定时器 在Microchip ZigBee协议栈中,定时器的用途主要是用于通信超时和基于 CSMA/CA算法的传输。由于原始协议栈是基于PIC单片机,它的定时是基于 上海大学硕士学位论文 Timer0定时器实现的,但是在本系统中,定时必须基于ARM的嵌入Linux操 作系统实现。802.15.4协议中规定在2.4G频率上bit rate为250kb/s,symbol rate 为62.5ksymbols/s,即每个symbol需要的时间为16us。而本系统中,由于 /linux/param.h定义的频率为200Hz,即用TICK方式定时最小分辨率只能为5ms, 不能满足单个symbol的时间。因此需要采取其他办法实现更高精度的定时。 一种办法是利用高精度定时-器(High Resolution Tim神,这不仅需要内核支 持,而且需要CPU硬件上支持。由于在内核版本为2.6.11的本系统中并未加入 该支持,所以无法利用这种方法。 第二种方式是利用库函数gettimeof()实现定时。该函数使用需要包含头 文件<sys/time.h>。典型的应用方式如下: struct timeval T1,T2; gettimeof(&T1,NULL); while(1){ gettimeof(&T2,NULL); if(TimeGetDiff(T2,T1)>SYMBOLS_TQTIME(12)) break; ) 其中TimeGetDiff0定义在ZigBeeTask.c文件中,定义如下: ulong TimeGetDiff(struct timeval a,struct timeval b)。 { return((a.w_see-b.tv_see)宰1 000}l 000+(a.tv_usee·b.tv_usec)); ) Timeval结构中有2个成员是tv—see和tv—tlSOc,前者表示秒,后者表示微 秒。TimeGetDiff()函数返回是2个Timeval的时间差,单位为微秒。 SYMBOLS To下IME()是一个宏,定义在ZigBeeTask.h中,定义如下: #define SYMBOLS To TIME(a)(a幸1 6) 表示将symbols转化为时间微秒量度(1ls),一个symbol等于16微秒。 那么程序含义就是当处理时间超过规定时刻(SYMBOLS To TIME(12)), 则判断程序超时,跳出循环。 55 上海大学硕士学位论文 但是这种方式经过测试(在代码中连续运行两条gettimeof函数,比较2个 返回Timeval变量的时刻差别值),精度往往不高,仍然达不到US级别,因此 在定时或者延时要求不高场合可以使用。 第三种方式采用内核中udelay()函数,它可以进行US级延时。 在MAC层中CSMA/CA算法上(参看2.3.5节)就利用了函数udelay0进 行后退延时。在这种算法中还需要产生一个随机数,在原始协议栈中是利用读 PIC单片机TIMER0的低位的随机值决定,在CSMA/CA程序中,采用定时器 返回值作为随机种子方式获取随机值,方式如下: srand((int)time(O))用定时器返回值作为一个随机种子,保证每次rand()都能 获取一个随机值,范围为0一RAND MAX。 i=(int)((CW+1)*rand0/(RAND_MAX+1));RAND—MAX表示随机值出现的 最大值,其为2147483647。i则是[O,cw]区间中的一个随机值,做为基于时槽 的CSMMCA算法中的后退时间。 >内存的分配和回收 在原始协议栈中,对接收的数据需要动态分配内存,发送完成后需要释放 内存,这些都是通过SRAlloc.c(仅供协调器使用的动态存储管理器),本系统 基于Linux操作系统,因此不再需要这个源文件,只需要在网关程序中包含 <stdlib.h>即可调用mallocO和freeoi函数来动态分配内存和释放内存。 >访问非易失性内存 在原始协议栈中访问非易失性内存的目的是因为一些初始化的变量需要从 ROM或者Flash这类存储器中读取,其源文件为zNVM.c(非易失性存储器存 储程序)。但是由于本系统管理着一个文件系统,所有配置参数可以作为程序本 身全局变量放置在运行代码的全局变量区,也可以作为一个配置文件,供网关 程序去读取配置,那么运行过程加载这些变量可放在全局变量区,或者放在bss 区(未初始化变量区)。因此在本系统采用将一些初始化变量放置在ZigBee.h 上海大学硕士学位论文 文件中,供网关程序使用。 >与上位数据服务器通信 这部分主要是用于当MAC层收到数据后,通过通信Socket端口发送给上 位数据服务器。这部分将会在第五章详细介绍。 4.4本章总结 本章主要介绍了移植的协议栈的来源以及协议栈移植的方法,具体叙述在 物理层上如何基于Linux操作系统来访问无线收发器的一些关键方法以及在 MAC层中修改定时器、内存分配和回收以及访问非易性内存方法。 57 上海大学硕士学位论文 第五章ZigBee网关通信程序 因为Linux操作系统内核已经集成了TCP/IP协议,因此Zigaee网关通信 程序利用socket接口把网关收到的zigB∞无线传感器数据上传到远程数据服务 器端。 zigBee网关通信程序主要涉及Linux Socket程序设计、Linux多线程程序 设计和一套网关通信协议封装。 5.1 Linux Socket程序设计 传统的计算机网络OSI模型分为7层模型。ISO的OSI对服务、接口和协 议的概念区别明显,但没有真正用户群。TCP/IP模型对于服务、接口和协议的 概念不像OSI模型那样明晰,但是很实用。TCP/IP模型分为4层,对应于7层 的OSI模型如图5-1所示: . ●’-_________________-___·_-__________-■o‘oooo一 弋刊 !!竺 I 飞飞飞([兰二】型习困飞飞飞[[压二三至蔓巫三堕圈]] 刊物理层I ISo 7层模型 TCP/IP 4层模型 图5-1 OSI和TCP/IP参考模型 从上图可看出,OSI七个网络层被分为两组:高层和低层。Socket接口对 上海大学硕士学位论文 网络的低层提供了统一的API(应用程序接口),并且允许在socket应用程 序内部实现高层协议。 在传输层,socket支持两个特殊协议:TCP(transmission control protocol, 传输控制协议)和UDP(user datagram protocol,用户数据报协议)。Socket不能 用来访问较低(或较高)的网络层。例如,socket应用程序不知道它是运行在 以太网、令牌环网还是拨号连接上。Socket的伪层(pseudo.1ayer)也不知道高 层协议(比如NFS、HTTP、FTP等)的任何情况。 编写socket应用程序的时候,可以在使用TCP还是使用UDP之间做出 选择。它们都有各自的优点和缺点。 TCP是流协议,而UDP是数据报协议。即TCP在客户机和服务器之间建 立持续的开放连接,在该连接的生命期内,字节可以通过该连接写出(并且保 证顺序正确)。然而,通过TCP写出的字节没有内置的结构,所以需要高层协 议在被传输的字节流内部分隔数据记录和字段。 另一方面,UDP不需要在客户机和服务器之间建立连接,它只是在地址之 间传输报文。UDP的一个很好特性在于它的包是自分隔的(self-delimiting), 也就是每一个数据报都准确地指出它的开始和结束位置。然而,UDP的一个可 能的缺点在于,它不保证包将会按顺序到达,甚至根本就不保证。当然,建立 在UDP之上的高层协议可能会提供握手和确认功能。 由于UDP协议会出现丢包现象,所以本设计为了保证数据的安全性,选择 TCP协议进行数据传输。 Socket编写程序主要分服务器端和客户端,服务器端主要是提供连接访问 接口,供客户端访问。Socket编程的基本流程如图5.2所示: 上海大学硕士学位论文 服务器端流程 客户端流程 图5.2 Socket编程流程 从上图可以看到Socket编程中一些必须的函数,使用他们需要把头文件 <sys/socket.h>包含进去。 socket函数原型为: int socket(int domain,int type,int protoc01); domain指明所使用的协议族,通常为PF INET,表示互联网协议族(TCP/IP 协议族);type参数指定socket的类型:SOCK—STREAM或SOCK—DGRAM, Socket接口还定义了原始Socket(SOCK—RAW),允许程序使用低层协议; protocol通常赋值什0”。Socket0调用返回一个整型socket描述符,可以在后面 的调用使用它。 Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调 用socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket” 意味着为一个Socket数据结构分配存储空间。Socket执行体管理描述符表。 两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议端口、 本地主机地址、远端主机地址和远端协议端口。Socket数据结构中包含这五种 上海大学硕士学位论文 信息。 bind函数原型为: int bind(int sockfd,struct sockaddr·my__addr,int addrlen); bind函数将socket与本机上的一个端口相关联,随后就可以在该端口监听 服务请求。sockfd是调用socket函数返回的socket描述符:my_addr是一个指 向包含有本机P地址及端口号等信息的sockaddr类型的指针;addrlen常被设 置为sizeof(struet sockaddr)。struct sockaddr结构类型是用来保存socket信息的: struct sockaddr—in{ short int sin__family;/.地址族·/ unsigned short int sin__port;产端口号·/ struct in addr sin addr;/·IP地址宰/ unsigned char sin_zero[8];产填充0以保持与struet sockaddr同样大小吖 }; Bind()i函数在成功被调用时返回0;出现错误时返回”.1”并将ermo置为相 应的错误号。 listen函数原型为: int listen(int sockfd, int backlog);. 1isten函数使socket处于被动的监听模式,并为该socket建立一个输入数据 队列,将到达的服务请求保存在此队列中,直到程序处理它们。Sockfd是Socket 系统调用返回的socket描述符;backlog指定在请求队列中允许的最大请求数, 进入的连接请求将在队列中等待接收它们。backlog对队列中等待服务请求的数 目进行了限制,大多数系统缺省值为20。如果一个服务请求到来时,输入队列 已满,该socket将拒绝连接请求,客户将收到一个出错信息。当出现错误时listen 函数返回.1,并置相应的ermo错误码。 accept函数原型为: int accept(int sockfd,void宰addr,int·addrlen); accept()函数让服务器接收客户的连接请求。在建立好输入队列后,服务器 就调用accept函数,然后等待客户的读写请求。sockfd是被监听的socket描述 符,addr通常是一个指向sockaddr in变量的指针,该变量用来存放提出连接请 求服务的主机的信息(某台主机从某个端口发出该请求);addrlen通常为一个 61 上海大学硕士学位论文 指向值为sizcof(stmct sockaddrjn)的整型指针变量。出现错误时accept函数返 回.1并置相应的臼'rno值。 send()函数原型为: int send(int sockfd,const void·msg,int len,int flags); sockfd是你想用来传输数据的socket描述符;msg是一个指向要发送数据 的指针;Len是以字节为单位的数据的长度;flags一般情况下置为0。Send() 函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应 该将send()的返回值与欲发送的字节数进行比较。 recvO函数原型为: int rccv(int sockfd,void搴buf,int len,unsigned int flags); sockfd是接受数据的socket描述符;buf是存放接收数据的缓冲区;len是 缓冲的长度,flags也被置为0。recvO返回实际上接收的字节数,当出现错误时, 返回.1并置相应的errno值。 sendtoO和recvfromO用于在无连接的数据报socket方式下进行数据传输。 由于本程序未采用UDP方式,故不再介绍。 当所有的数据操作结束以后,还要调用closc(sockfd)函数来释放该socket, 从而停止在该socket上的任何数据操作。 5.2 Linux多线程编程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统 中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程 的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味 着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT, 当然,也包括Linux。 使用多线程的理由之一是和进程相比,它是一种非常¨节俭”的多任务操作 方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地 址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种” 昂贵”的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用 上海大学硕士学位论文 相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动 一个进程所花费的空间,而且,线程问彼此切换所需的时间也远远小于进程间 切换所需要的时间。 使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们 具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式 不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据 空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。 当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改, 有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这 些正是编写多线程程序时最需要注意的地方。 除了以上所说的优点外,多线程程序作为一种多任务、并发的工作方式, 当然有以下的优点: 11提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时 很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的 操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线 程,可以避免这种尴尬的情况。 。 2)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时, 不同的线程运行于不同的CPU上。 3)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几 个独立或半独立的运行部分,这样的程序会利于理解和修改。 下面介绍一下多线程编程中常用的函数,支持多线程编程需要包含 <pthread.h>有文件。 ·创造线程 int pthread_create(pthread_t+tid,const pthread_attr_t·attr,void·(·func) (void宰),void宰arg); tid是创造的新线程标识符。 attr线程属性包括:优先级、初始栈大小,是否应该成为一个守护线程。 func是线程要执行的函数,arg是线程执行的参数 函数之前调用。属性对象主要包括否绑定、是.crate 上海大学硕士学位论文 函数成功返回O。 ·线程退出 void pthread_exit(void簟retval) 用于清除线程函数,中止当前线程的执行,返回retval,一般设置为NULL。 ·挂起线程,直到制定线程中止运行 int pthread_join(pthread_t tid.void掌幸status); statues返回等待线程的返回值 ·线程属性设置 线程属性结构为pthread_attr_t,它同样在头文件pthread.h中定义,属性值 不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init, 这个函数必须在pthread 否分离、堆栈地址、堆栈大小、优先级。默认的属性为非绑定、非分离、缺省 的堆栈、与父进程同样级别的优先级。 这里主要介绍一下分离状态设置,这个就是网关程序采用的属性,线程的 分离状态决定一个线程以什么样的方式来终止自己。非分离的线程终止时,其 线程ID和退出状态将保留,直到另外一个线程调用pthread_join。分离的线程 在当它终止时,所有的资源将释放,因此主线程需等待它终止。而分离状态属 性意味着一旦一个新的线程(用于建立连接访问数据服务器),主线程不必关心 新线程的运行状态,让其运行结束后自动关闭。 int pthread_attr_init(pthread attr t幸attr); int pthread_attr__destory(pthread_attr__t奉attr); int pthreadattr_setdetachstate(pthread_attr_t·attr,int detachstate); 第一个函数是初始化线程属性对象,必须在创造线程之前完成。 第二个函数是销毁释放掉线程属性对象。 第三个函数是设置线程的分离状态,其中第二个参数可选为 PTHREAD CREATE DETACHED (分离线程) 和PTHREAD CREATE JOINABLE(非分离线程)。如果不是用该函数,默认方式是非分离 线程。 上海大学硕士学位论文 5.3 ZigBee网关通信程序 网关通信程序设计目的是利用socket接口,把网关收到的ZigBee无线传感 器数据上传到远程数据服务器端。通信程序分为服务器端和客户端,网关通信 程序在Socket上建立了一套自定义协议,用于数据的传输和控制。网关通信程 序源文件一共有4个:ZigBee_Socket.C、ZigBce Socket.h、Sgl'vgr.c和client.C。 其中前两个文件定义了服务端和客户端共享的数据结构、函数原型和自定义协 议,s6rv6r.c是服务器端源程序,client.C是客户端源程序,除serva'.c之外三个 程序会集成到最后的网关程序中。 首先阐述一下共用源文件ZigBec_Socket.C中定义的数据结构、函数及协议。 服务器端和客户端通信的数据结构体如下: typedef struct{ u32 length; u8 command; u1 6 char length_address; *address; ul 6 char length_var_ZigBee_device; ·var_ZigBeedevice; u1 6 value_ZigBee; u8 state; }Info; 其中length表示结构体长度,command代表自定义的命令,length_address 代表ZigBee设备逻辑地址长度,address代表ZigBee设备的逻辑地址, length_var_ZigBee_device代表ZigBee无线设备上传的变量名的长度, var_ZigBee_device代表ZigBee无线设备上传的变量名,value_ZigBee代表 ZigBee变量值,state代表服务端响应状态,1表示成功,0表示失败。 其中协议命令command一共定义了10个,放置在Zig,Bee_Socket.h中: #define GW RESET OxOl无线网关复位 #define GW CREAT NETWORK oX02无线网络建立 #define GW NEW DEVICE JOIN Ox03新节点加入网络 #define GW DEVICE LEAVE o)【04节点离开网络 #define GW DEVICE UPLOAD DATA Ox05节点上传数据 #define ACK RESET .0x81 响应复位 #define ACK CREAT NE”ⅣOlⅨ0x82 响应网络建立 上海大学硕士学位论文 #define ACK—NEW—DEVICE~JOIN #defineACK—DEVICE—LEAVE #define ACK—DEVICE—UPLOAD—DATA 0x83响应新节点加入网络 0x84响应节电离开网络 0x85响应节电数据上传 服务器端和客户端共有函数如下: 1)u32 GetU32FromBuffer(char·bu0 2)u16 GetUl6FromBuffer(char簟buf) 3)char*GetStfingFromBuffer(char·bueul 6 p) 4)IIlf0母GetPackageFromBuffer(char幸buf) 函数1—3是从缓冲区中提取相应类型的对象,函数4用于从Socket端口中通 过recevOi函数接收到的数据所放置缓存区中读取一个完整的结构体(具体结构 参看上文)。 GetPackageFromBuffer函数原型如下: h1内幸GetPackageFromBuffer(char宰bur) { char·pos=buE IIlfo奉temp; temp=malloe(300); if(pos—NULL) return-1; else{ temp->length=GetU32FromBuffer(pos); pos+=sizeof(u32); temp->command=·pos; .po酣斗; temp->length_address=GetUl6FromBuffer(pos); pos+=sizeof(ul 6); if(temp一>length address!=O) temp->address=GetStringFromBuffer(pos,ternp->lengthaddress); pos+--temp->length_address; temp->length_var_ZigBee_device=GetU 1 6FromBuffer(pos); pos+=sizeof(ul 6); if(temp->lengthvar_ZigBee device!=0) temp·>var ZigBeedevice= GetStringFromBuffer(pos,temp->length_var_ZigBee device); pos+=temp->length var_ZigBee_device; temp->value_ZigBee=GetU 1 6FromBuffer(pos); pos+=sizeof(ul 6); temp->state=*pos; 上海大学硕士学位论文 ) I'et'UlTI temp; ) pos表示位置,因为Socket传输方式选择TCP方式,所以数据都是按照预先 设定的顺序在Socket端口出现,所以pos目的就是为了按照预先规定的格式去 分解一个数据包。temp是临时创建一个结构体,按照自定义结构体顺序放置接 收到的数据。 5)void SendU32ToBuffer(char宰bur,u32 n) 6)void SendUl6ToBuffer(char·buf,u16 n) 7)void SendStringToBuffer(char幸bur,char幸str) 8)int SendPackageToBuffer(char事bur,Info·p) 函数5.7是将相应类型的对象放入缓冲区,函数8表示把一个结构体放置 在缓冲区中,这个缓冲区内容将被放置在Socket的send()函数中发送。 SendPackageToBufferoi函数原型与GetPackageFromBuffer0作用相反,此处不再 叙述。 9)u1 6 Oett舳gth(hfo掌p) 1 0)void freelnfo(Info}p) 1 1)void fillPackage(Info宰package,u8 eom,char·addr,char·var,u16 value,u8 state) 函数9获取整个结构体长度,函数10释放掉结构体,函数11是用数据去填 充结构体。 Server端需要利用一个单向链表来维护无线设备的状态和其上传数据,链 表结构如下: struct ZigBeenode{ char奉ZigBeeaddress; char幸var; u1 6 upload_data; struct ZigBee_node奉next; ); ZigBee_address为ZigBee设备地址,Var为变量名,upload_data为上传数 据值,next表示下一个设备节点。 ‘涉及维护该链表函数如下: 67 上海大学硕士学位论文 int find(struct ZigBee_node·list,char·address) 用于查找无线节点链表中是否有匹配的无线地址。成功返回1,失败返回0。 struct ZigBeenode·creat() 创建无线节点链表,设置头地址为NULL,返回头地址。 struct ZigBeenode·add(struct ZigBeenode毒list,char·address) 往无线节点链表中添加一个无线节点,返回链表头节点地址。 struct Zig,Bee node宰dd(struct ZigBeenode宰list,char宰address) 删除一个无线节点链表中的节点,返回链表头节点地址。 int update_data(struct ZigBeenode宰list,char奎address,u1 6 value) 接收上传数据,更新对应无线节点数据,返回链表头节点地址。 Server端接收连接后的处理函数: void HandleClient(int sock) ·‘创建缓冲区(buffer[BUFFSIZE])BUFFERSIZE‘设置为1024 ·创建接受和响应包的指针(*info_package,*re_package) ·负责从缓冲区解包(info_package=GetPackageFromBuffer(buffer);) ·根据包命令info_.package->command来处理相应指令,利用switch 语句 ·释放接受包指针(freelnfo(info_package)) ·将响应包放入缓冲区(SendPackageToBuffer(buffer,re__package)) ·发送响应包到网络 ·等待接受下一包,如果没有,关闭socket 服务端处理流程如图5.3所示: 上海大学硕士学位论文 图5.3服务端通信程序处理流程 服务器端在接收到客户连接以后,创建一个接收线程处理,函数如下: pthread_create(&server_thread,&server_thread_attr,&HandleClient,clientsock); 其中server thread是服务器端线程,server thread attr为服务器端线程属性, 设置与客户端一样都为分离线程,HandleClientO为网关自定义协议的处理函数, clientsock为服务器端accept()后返回的sock号,它作为参数传递给HandleClient 函数。 在HandleClientO处理函数中,会处理一个全局变量zigbee_device用于保存 设备节点信息,类型为struct ZigBee node,当客户端向服务器发送信息过快, 那么服务器端产生多个接受线程会对zigbee_device变量产生竞争,因此,对该 变量采用互斥量保护多线程共享数据。实现如下: 在全局申明互斥量,PTHREAD MUTEX INITIALIZER表示创建快速互斥 的宏: 上海大学硕士学位论文 pthread_mutex_t mutex 2 PTHREAD MUTEX_INITIALIZER; 在HandleClientO dO处理zigbee_devive变量时: pthread rnutex__lock(&mutex); 产访问zigbee devive变量}/ pthread_mutex_unlock(&mutex); 客户端处理流程如图5-4所示: 图5-4客户端通信程序处理流程 在客户端中,一共创建了5个线程,分别完成5组命令任务。每个线程都 是分离线程,这个由线程属性设置决定: pthread_attr_init(&gw_thread_attr); pthread attr_setdetachstate(&gw_thread attr, PTHREAD_CREATE DETACHED); 然后在协议栈中对应的原语(Primitive)中插入线程创造函数,完成相应 上海大学硕士学位论文 的任务,如网络建立成功后,创建线程1发送相应命令给数据服务器。 当协议处理过程中,处理原语为NLME_NETWORK_FORMATION_confirm 时,且params.NLME_NETWORK_FORMATION_confirm.Status为O时,表明 无线ZigBee网络已经建立,此时就可以创建分离线程通知数据服务器。代码如 下: while(1){ ZigBeeTasks(&currentPrimitive); switch(currentPrimitive) { case NLME NETWORK FORMATION confirm: if(!params.NLME_NETWORK_FORMATION confirm.Status) { /}调试过程打印消息代码,此处代码省略幸/ res=pthread_create(&gw_thread[1],\ &gw_threadattr,thread_ereatnetwork,NULL); params.NLME_PERMIT_JOININGrequest.PermitDuration 2 0xFF; eurrentPrimitive=NLME PERMIT.JOININGrequest; ) else { currentPrimitive=NO_PRIMITIVE; ) break; case NLME PERMIT JOINING confirm: CaSe…… ) ) 其中ZigBeeTasks(&currentPrimitive)表示处理ZigBeex协议,switch()根据 处理结果进行相应处理。 客户端和服务器端运行截图5.5和5-6所示: 71 上海大学碗±学位论立 Edit∞时Iem El Se T缸s Help IDEBUG real signal Dumber=39 lOEBUG FeaI 5ignat number=39 lOEBUB:ZLgBeeStatus NextZigBeeState NWKTASK BXB 【DEBUG:scanParams numScannedChanneLs=e xBBBO@BOB DEBUO:scanParams Un¥cannedChannel s Va[=exffffefff DEBUG:Drepare return MLME SCAN confi rm JDEBUG:ZigBee5Latu5 nextZJgBeeState MVKTASK ex2e OEBUG:zigBeeStatu5 nextZi§BeeState HACTASK 8x2e n㈨tZi DEBUG:ZigBeeStatu5 nextZigBeestate NWKTASK DEBUG:PAN 6xOO started succ55sfullv DEBUG:ZigBeeStatos BeeState wKTASK 0x37 Bx38 DEBUG JOinlna permitted Received DEBUG length=12 ten v8 r=O va r=【nuUl command=130 value=18 add ress=(null stare=l 图5-5客户端远行截图 Elle Edit皿刊业rmlnal nns t=ceID yello幛Iinux-yellow-,code,50ckeb CLient connected:98 198 152 101 length=13 comm8nd=2 var=I nuLt} vaLue=e Zigbee network is(realed nient connected:58 19B 152 1日1 New Zlgbee device oxffaa is 10zning (1lent connected:98 195 192 1日1 tength=29 commane=g V6 r=temperatu re vaLue=195 ziqbee device exffaa 15 upLoading Now [1ient connected:59 198 152 151 1ennh=18 command=4 va卢(nuUl v6Lue=8 zigbee device exffaa ls Leaving now. "絮 l…va=B addre¥s=sxffaa State=8 address=gxffaa state=e I…a r=11 addce¥s=8xffaa state=o ten vaFe 图5-6服务端运行截图 从上图中可以看到网关启动后发送了4个命令给服务器.一个是网络建立 命令,一个是设备设备加入网络命令,一个是设备上传数据命令,一个是设备 离开网络命令。网关口为58.198102lOl。 上海大学硕士学位论文 5.4本章总结 本章主要介绍了ZigSee网关通信程序,重点阐述了利用LintLx多线程编程 技术和Socket API进行与远程的数据服务器通信的过程,并且介绍了一套基于 Socket上的自定义协议,同时也简单介绍了服务器端的Socket处理流程。 上海大学硕士学位论文 第六章ZigBee网关程序的编译、调试和测试 ZigBee网关程序最终运行需要编译、调试和测试3个阶段,本章分三个部 分介绍以上内容。 6.1 ZigBee网关程序的编译 ZigBee网关程序源文件列表6-1如下: 网关程序源文件 源文件描述 ec2420 driver.c nlaln.C 无线ZigBee收发器驱动程序 网关主程序 ZigBeeTask.C、ZigBeeTask.h 定义ZigBee协议任务处理等函数 ZigBee.h 定义ZigBe圮一些参数 ZPhye、ZPhy.h ZMac.c、ZMac.h ZNwk.c、ZNwk.h ZigBee_Socket.c、ZigBee_Socket.h Makefile ZigBee物理层协议栈 ZigBee MAC层协议栈 ZigBee网络层协议栈 网关通信程序模块 网关程序编译构造脚本 表6-1 ZigBee网络程序源文件列表 在上表中,ec2420 driver.c的编译和安装过程已经在本文第三章详细叙述, 请参看3.2.8节。 网关程序是一个应用程序,运行在用户空间,由于该程序有多个模块部分 组成,所以为了方便管理和编译,本设计采用GNU make管理项目。 Make是一种控制编译或者重复编译软件的工作。Make可以根据Makefile 的规则自动管理软件的内容、方式和时机。Makefile规则如下: target…:prerequisites… command command 【…】 target也就是一个目标文件,可以是Object File,也可以是执行文件。还可 74 上海大学硕士学位论文 以是一个伪目标,对于这种特性,网关程序的Makefile中会叙述。 prerequisites就是要生成那个target所需要的文件或是目标。 command也就是make需要执行的命令。(任意的Shell命令) ‘‘.”这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件 依赖于prerequisites中的文件,其生成规则定义在command中。具体来讲就是 prerequisites中如果有一个以上的文件比target文件要新的话,command所定义 的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。 网关程序的Makefile内容如下: SRC=ZigBeeTask.C ZPhy.c ZMac.C ZNwk.c main.C ZigBee_Socket.C OBJ=ZigBeeTask.O ZPhy.o ZMac.O ZNwk.O main.O ZigBee_Socket.O HEADER=ZigBeeTask.h ZPhy.h ZMac.h ZNwk.h ZigBee.h ZigBee_Socket.h PROG= zgp DEBUG—FLAG = 一DDEBUG THREAD—FLAG= 一lpthread ¥(PROG):¥(OBJ)¥(HEADER) arm·linux-gee¥(THREAD_FLAG)¥(OBJ).0¥(PROG) ¥(OBJ):¥(SRC) am-linux-gee¥(DEBUG_FLAG)-c¥(SRC) clean: . riil●.o 其中SRC表示源文件,OBJ表示目标文件,HEADER表示头文件,PROG 表示生成的可以执行文件名,DEBUG FLAG表示为调试标志,THREAD FLAG 表示支持多线程标志,clean就是一个伪目标,执行make clean即相当于执行rill ·.o命令。 ¥(PROG):¥(oBJ)¥(HEADER) 表示可执行文件依赖于目标文件和头文件。 ¥(OBJ):¥(SRC) 表示目标文件依赖于源文件。 在宿主机中,运行make命令,则最后通过编译生成网关程序zgp(程序名)。 6.2 ZigBee网关程序的调试 ZigB∞网关程序的调试分为内核层调试和用户层调试。内核层调试用于驱 75 上海大学硕士学位论文 动程序调试,用户层调试用于应用程序调试,即网关程序调试。 >内核层调试的方法 首先介绍一下内核层调试,内核层调试可以选择通过打印调试和选择内核 交叉调试器进行调试。最常用的调试技术就是监视,在应用程序编程当中是通 过在合适的地方调用研ntf来实现。 在调试内核代码时,可以通过printk来达 到这个目的。printk允许根据消息的严重程度对其分类,通过附加不同的记录 级别或者优先级在消息上。常常用一个宏定义来指示记录级别,这个级别记录 在头文件<linux/kemel.h>中,主要由8个级别: KERN EMERG 用于紧急消息,常常是那些崩溃前的消息 KERN ALERT KERN CRIT 需要立刻动作的情形 严重情况,常常与严重的硬件或者软件失效有关 KERN ERR 用来报告错误情况; 设备驱动常常使用KERN ERR 来报告硬件故障 KERN WrARNING 有问题的情况的警告, 这些情况自己不会引起系 统的严重问题 KERN NoTICE 正常情况,但是仍然值得注意。在这个级别一些 安全相关的情况会报告 KERN INFO 信息型消息。在这个级别,很多驱动在启动时打 印它们发现的硬件的信息 KERN DEBUG 用作调试消息 一条没有指定优先级的printk 语句缺省是 DEFAULT MESSAGE LOGLEVEL,在kernel/printk.c里指定作为一个整数。 在2.6.11内核中.DEFAULT 是 KERN 。这表明 可以使用超过 INFO .等M级ES的S消AG息E打L印O观GL察EV变E量L。 数中,通过下列语句表明初始化设备.nit0函 INFOKERN 例如在驱动程序spi i printk(KERN ” ”); 76 上海大学硕士学位论文 打印调试非常方便,但是也有一些限制,如果设置不当,可能让研ntk上 千条的消息,从而使消息充满整个监控窗口,不能很好观察需要数据。 内核调试另外一种方式是利用交互式调试器,典型的就是kgdb。kgdb程 序(使用gdb的远程主机Linux内核调试器)提供了一种使用gdb调试(将 会在用户层调试中讲述)Linux内核的机制。kgdb程序是内核的扩展,它能 够在远程主机上运行gdb时连接到运行用kgdb扩展的内核机器。可以接着深 入到内核中、设置断点、检查数据并进行其它操作(类似于在应用程序上使用 gdb的方式)。这个补丁的主要特点之一就是运行gdb的主机在引导过程中连 接到目标机器(运行要被调试的内核)。但是请注意,补丁为Linux内核添加 了功能,所以gdb可以用来调试Linux内核。 使用kgdb需要两台机器:一台是开发机器,另一台是测试机器。一条串 行线(空调制解调器电缆)将通过机器的串口连接它们。调试的内核在测试机 器上运行,同时gdb在开发机器上运行。gdb使用串行线与要调试的内核通信。 内核调试中还用到另外一种方式Oops。Oops(也称panic,慌张)消息包 含系统错误的细节,如CPU寄存器的内容。在Linux中,调试系统崩溃的传 统方法是分析在发生崩溃时发送到系统控制台的Oops消息。一旦掌握了细节, 就可以将消息发送到ksymoops实用程序,它将试图将代码转换为指令并将堆 栈值映射到内核符号。在很多情况下,这些信息就足够确定错误的可能原因是 什么了。Oops消息并不包括核心文件。关于如何使用ksymoops,内核源代码 usr/src/linux/Documentation/oops—tracing.txt中或ksymoops手册页上有完整的 说明可以参考。 ‘下面的图6.2显示了格式化Oops消息的过程。 格式化Oops消息 蝴: G掰黼a自e螬: m鳓蝴, 图6-2格式化Oops消息的过程 上海大学硕士学位论文 >用户层调试的方法 用户层调试主要使用到了2个调试工具,一个是gdb,一个是Vral鲥nd。前 者用于调试应用程序,后者主要用于调试内存。首先介绍一下Nb。 gdb(GNU Debugger)是一个强大的命令行调试工具,其可以实现执行序 列,形成脚本。gdb可以查看程序的内部结构、打印变量值、设置断点,以及 单步调试源代码。由于其功能很强,所以适用于修复程序代码中的问题。一般 gdb调试流程如下: 1)编译 开始调试之前,必须用程序中的调试信息编译要调试的程序。这样, gdb才能够调试所使用的变量、代码行和函数。如果要进行编译, 请在gee下使用额外的’一g’选项来编译程序。 2)运行gdb 在shell中,可以使用’gdb’命令并指定程序名作为参数来运行gdb, 例如’gdb eg;或者在gdb中,可以使用file命令来装入要调试 的程序,例如’file eg’。这两种方式都假设您是在包含程序的目录 中执行命令。 3)设定断点后执行程序 使用’break’(可简写成~b)命令设置断点,使用’clear’(可简写成’c’) 清除断点。使用’list’(可简写成’l,)查看代码。设置好断点后,可 以用gdb命令’nm’来启动程序。 4)程序运行到中断位置处 ·检查程序运行状态,利用’print’(简写成一P)打印变量值 ·单步执行’step’(若下一行调用函数,则进入函数,简写成 t一,S)、,next’(若下一行调用函数,不进入,简写成一n)或全 速执行到下一个断点’continue’(简写成’c’)。 ·检查堆栈情况,使用’backtrace’(简写成’bt’)。 ·多线程调试,使用info threads显示线程,其中包括线程的PID 号和gdb为每个线程设置的线程号。使用thread Threadnum 上海大学硕±学位论文 切换线程.其中,Threadnum为gdb分配给每个线程的线程 号。 51退出gdb程序 使用’exit’退出gdb程序。 下面介绍一下Valgrind内存调试工具,该工具主要是检查在网关通信程序 中分配数据包和释放数据包中是否存在内存泄漏问题。 Valgrind已经在Linux应用程序开发社区中广泛用来调试应用程序。它尤 其擅长发现内存管理的问题。它可以检查未初始化的内存、内存泄漏、非法写/ 读和帮助判断内存误用的问题。网关程序中主要使用其调试内存泄漏, Val鲥nd运行调试如罔6-3所示: ==4j14…t 0x402洲…f I…x/v9pretoaa…(ht( e fin,usr/11b,vaIgrtnd/x86 k 50’ ==4514==bv 一;451{…ddtes0sX4023e0A…f finb,yt洲…rti№nsb/ =;45临 at f…1eak …n BX8Q4842E Ox418025B 1s 9 e c 9' dea bIock Of 19‘ind/×86 5i川12 frec d 1i…/v口preIoad memchec exBe4842¨aln k s01 ,一4514z= by Imemkak c:8) ==4S14== …m SLrHMARY:1……fr……t…t ER#tOR 删====4415s…胆1㈦cFho…州rckheidng fo……po…ta一t …1 一=z4怍5忙mamtaltolcO,(,futrnre…fe…t2de…c rst………h c a110cs ed re…d I supp 3 xlt ,12 bytE5ln 1 b1叱ks 2 frees.I.日24 bytes altocated f—d erro Ot v block5 f…ll 一1…L 10‘……byt …州…4115444一一一dpeofAKs……sUnml、6.Ry, Y1、Y40 0b5yt…es byt……s L、n 1ocb1k.sock¥ =z4514刊ill byt…洲b yelIo呻unux‘yello一’I—— =·2-4455肛141=u…1easkcuepacDchh…eacb5lkeze …fe ¨byIt…eSee ocks of[eaked…a in 0 b Locks detail5 ry 圈6-3 val鲫d调试内存泄漏 源代码分别给两个字符指针分配了两个512字节的内存块,然后将指向第 一个内存块的指针设置为指向第二个内存块。结果是,第二个内存块的地址丢 失了,并导致内存泄漏。在使用VaI鲥nd运行这个程序时,会返回如上图的消 上海大学硕士学位论文 息:Valgrind报告说这个程序中有512字节的内存丢失了。 最后说明一下在用户层中打印调试消息的开启和关闭方法的设置。在程序 中经常会遇到需要观察的变量,一般使用研ntf或者printk打印显示出来。但是 当程序正式发布或者不再需要调试消息后,需要关闭消息,可以使用一个全局 的宏来开启和关闭,如同在网关程序中-DDEBUG FLAG标志就是表明开启调 试,否则关闭。在所有需要调试的源程序中添加如下定义: #ifdefDEBUG—.FLAG #define dpf(…)printff”DEBUG:”.、,A ARGs-j #else #define dpf(…) #endif 在源程序中使用dpfom数就可以打印调试信息了。 6.3 ZigBee网关程序的测试 ZigBee网关程序测试主要是测试网关的驱动程序,因为驱动程序是否能工 作正常决定了网关的性能。因此对网关驱动测试很非常重要。网关驱动安装完 成后,所有的测试工作主要是分寄存器读写测试,RAM读写测试和FIFO读写 测试三部分。本设计采用通过编译开关把一个源程序编译成几组访问读写无线 收发器的命令,然后编写一个shell脚本完成测试功能。 这里主要介绍一下脚本的编写工作,读写寄存器的程序为write_reg和 read_reg,bash脚本中对读写寄存器的部分如下: usageO { echo”CC2420 SPI Driver Test Case” echo"··幸·木宰···幸··}····}·宰宰···奉幸·什 echo”1)Reset CC2420¨ echo”2)write CC2420 register” echo”3)read CC2420 resgister” echo”4)set write address and value” echo”Q)Quit” > resetO { 上海大学硕士学位论文 clear echo¨reset now宰宰宰·幸}掌宰}·宰·····" ./reset ) write0 { clear ./write_reg¥address¥msbvalue¥1sbvalue echo’write register' ) read() { clear ./read_reg¥address echo’read regJ【ster' ) set0 { clear echo”input your register address” read address echo”input your register MSB value” read msbvalue echo”input your register LSB value" read lsbvalue echo¨address=”¥address”msbvalue=”¥msbvalue”lsbvalue=”¥lsbvalue ) clear usage read S while【true】 do case¥s in 1) reset;; 2) write;; 3) read;; 4) set ;; Q) exit O;; eSac usage read s done 8l j海大学坝十学位论文 上述程序通过主循环while[tme]-done,进行读写测试奇存器,这样可以直 接输入数值,不需要每次输入完整命令来测试。对于RAM读写和FIFO读写同 样集成在这个脚本中,因篇幅问题,未列出.区别对RAM和FIFO读写测试输 入输出是一个数组,需要检查越界问题。脚本运行如下: Fj_e Edlt Ⅵew TermlnaI mabs HeID }{…{}}+十4…{}{●}…¥…{ CC242日sPI Driver Test Case 1)Reset cc2420 2)wrlte cC2420 reql5te r 3)read CC2420 re91ste r 4)set write add res s and value O)口ult - 图64测试脚本土界面 EJle Edlt Ylew 卫erminal Ta乜s Help inOut ox28 1“put ox55 inOut you r you r your register rreegg㈣㈣tt r r add re55 MS8 value LSB value Bxaa msbvaI—ox55 address=0x28 D…er CC2420 SpI t 5bvaIue=0xaa Test Ca5e 1 2 3 4 鬟黑擞‰ 篙一 赘" 》… ” e 0■ 鬻譬兰篙≮。~ 图每6设置写入CC2420寄存器的地址和值 6.4本章总结 本章详细介绍了嘲关程序中采用的编译方法、调试手段和驱动测试方法。 上海大学硕士学位论文 第七章结论和展望 7.1结论 随着微电子技术、SOC技术及现代通讯技术的不断进步,各种短距离无线 通信技术得到了广泛的发展,它们在新型的无线传感器网络应用中具有重要作 用。本课题针对一种可应用于无线传感器网络的低速、低功耗、低成本的短距 离无线通信技术——ZigB∞技术及其应用开展了研究和开发。 本课题的研究主要完成了以下工作:(1)分析比较多种短距离无线数据传 输技术,蓝牙、Wi.Fi等其它短距离无线通信技术协议复杂、成本高、耗电等, 而ZigBee技术具有近距离、低功耗、低速率、低成本等优点,可以广泛应用于 工业和民用监控系统中。(2)研究了无线传感器网络各种特性和ZigBee协议栈 的结构,重点分析了物理层、MAC层和网络层的协议规范。(3)完成了一种基 于ARM9 S3C2410处理器,符合ZigBee协议规范的低功耗短距离无线收发模 块C2420开发嵌入式Linux操作系统驱动程序,并对驱动程序的测试提供了一 些方法。(4)完成了对基于PIC单片机的ZigBee协议栈的移植工作,使协议栈 能工作在Linux环境下。(5)完成了网关与上位数据服务器通信的模块。 整个软件采用C语言模块化结构设计,使软件具有结构简明清晰、可靠性 高、易维护、重用性好、利于软件工程管理等优点。运行结果己达到课题当初 的设计要求。 总结上述工作,其创新之处在于完成了一个基于ARM9微处理器的ZigBee 网关的开发,其利用在无线工业现场网络中,能够将无线网络节点数据收集并 转发给上位数据服务器。由于网关采用了开源的Linux操作系统,因此程序的 升级、维护和移植都带来了极大的便利性。 7.2下一步设想 本课题的设计涉及ARM处理器、操作系统、协议栈和无线通信等众多领 域,由于作者知识背景和实践经验不足,在时间和条件的关系影响下,本系统 上海大学硕士学位论文 不可避免的存在一些不足,不足之处和一些后续的工作想法如下: 首先是驱动与网关应用程序通信方法,本课题中采用了通过异步通知发送 信号给应用程序,这里存在一个信号是否实时问题,虽然发送的是实时信号, 但是这里实时含义是指信号不会丢失,但是应用程序可能会有延时接收到内核 层发送信号,因此改进驱动和应用程序接口实时性可以进一步研究,一种办法 就是把应用程序全部移植到内核层中运行,好处是不需要再关心两者通信,缺 点是程序移植性不好,而且放置在内核空间一旦出错,系统容易崩溃。 第二个就是关于网关运行时候的参数配置问题,比如修改口、组网方式等 等参数。本来设想采用文本配置方式,gateway.conf负责参数配置,网关应用程 序启动后读取该文件,进行网关协议栈的变量初始化工作,由于时间原因,作 者只设计了一个简单读配置程序,并未归入主程序中,希望的方向就是通过这 个配置文件来支持网关工作模式,舍去现在通过在ZigBee.h方式配置。并且支 持可以动态修改网关运行参数。 第三由于作者通信知识背景有限,所以对协议栈理解不够深入,现在移植 的协议栈还不是标准ZigBee协议栈,比如协议还不支持群集通信,无安全和访 问控制功能,没有提供标准的用户配置文件;这些功能在大型的传感器网络中 是必不可少的,所以在以后的工作中需要进一步深入研究和完善。 最后就是能够丰富和完善作者基于Socket接口定义的网关通信协议,使其 能支持双向命令传输,协议格式更加规范。本系统服务器程序只是一个简单的 演示程序,以后还是希望上位服务器程序可以做个用户界面,方便观察无线网 络中设备运行情况。 上海大学硕士学位论文 参考文献 【1】. [2 1. IEEE Computer Society,IEEE Std 802.1 5.4TM,皿EE Standard for Information technology Part 1 5.A:Wireless Medium Access Control(MAC)and Physical Layer(PHY) Specifications for Low-Rate Wireless Personal Area Networks(LR-WPANs).,2003 ZigBee Alliance.,ZigBcc-Spccification Document 053474r1 3,2006 131.ChipCon Inc.SmartRF CC2420.-2004.2.4GHz IEEE 802.15.4/ZigBq∞.ready RF Transceiver.NORWAY.ChipCon INC,2004:l-87 【4】. Samsung Electronics,¥3C2410A一200MHz&266MHz 32..Bit RISC Microprocessor User's Manual,Revision 1.0,2 1-S3-C24 1 0A-032004,,2004 [5 1.Microchip Technology Inc,Microchip Stack for the ZigBeeTM Protocol AN965,2004 [6 1. Mierochip Technology Inc,PIC 1 8F2525/2620/4525/4620 Data Sheet,2004 1 7].Cirronet Inc,ZigBee'ⅢWireless Transceiver Engineering Options,2005 1 8 1. Richard M.Stallman,Roland McGrath,Paul D.Smith,,GNU Make,2006:1.1 1 8 [91.Mendel Cooper,Advanced Bash.-Scripting Guide,2005:23..182,425-449.,503..518 【lO]. Steve Best,,Linux@Debugging and Performance Tuning:Tips and Techniques。2005: ‘ 55·80.9%1 08 335--368 ‘ 【1 1】.Mark Mitchell,Jeffrey Oldham,Alex Samuel,Advanced Linux Programming,.200 1: chapter3-6 chapter8 chapterl 1 【121.Christian Benvenuti,Understanding Linux Network Internals,,2005:chapter3 chapter7-9 chapterl4 【1 3 1.Michael Barr,Programming Embedded Systems in C and C++,1 999:chapter3-4 【1 4 1.Daniel EBovet,Marco Cesati.Understanding the Linux Kernel 3rd Edition,2005: chapter4 chapter 6-7 chapterl 1 chapterl 3 chapterl 9 【1 5 1.Ed Callaway,Vcnkat Bahl.Paul Gorday,Jose A.Gutierrez,Lance Hester,Marco Naeve,and Bob Helle.,Home Networking with IEEE 802.1 5.4,a Developing Standard for Low-Rate Wireless Personal Area Networks,IEEE Communications Magazine, special issue on Home Networking,.v.40,n.8,August 2002,laP.70-77. 【1 6 1.·Jin-shyan Lee and Yang-chih Huang.Design and implementation of ZigBee/IEEE 上海大学硕士学位论文 802.1 5.4 Nodes for Wireless Sensor Networks,2006 【17]. JoBathan Corbet,Alessandro Rubini,and Greg Kroah-Hartman,Linux设备驱动程序 第三版2006:21.298 408-457 【181. Ulrich Drepper,Ingo Molnar,The Native POSIX Thread Library for Linux,2005 【19]. R.,Love Robert,Linux内核设计与实现第二版2006 [201. Rodriguez,Claudia Salzberg,Fischer,Gordon,Smolski,Steven,Linux内核编程,2006 [21】. ~舭do Mendoza,Chakamt Skawratananond,Artis Walker,Unix到Linux的移植, 2007:1 6-57,260-292 【22】. Kurt Wall,GNU/Linux编程指南第二版,2002:46.55 108.121 196.245 268.303 320..342 555..580 [23】. 林宇,郭凌云,Linux网络编程,2000:111.154 254.287 [241. Reek Kenneth A,C和指针,2003 125】. Linden Peter Van Der,C专家编程,2002 【26】. Karl,Holger,Willig,Andreas,无线传感网络协议与体系结构,2007 [271. Callaway,Edgar H.Jr,无线传感器网络,2006 [281. 孙利民,无线传感器网络,2005 [291. 蒋挺。赵成林,紫蜂技术及其应用,2006:167.237 【30】. 钱浙滨,RT-Signal及其应用要点,,2005 http://www.ibm.com/developerworks/cn/linux/1-rtsignal/ 【3l】. 郑彦兴,Linux环境进程间通信(二):信号(上),2003 http://www.ibm.com/developerworks/cn/linux/1-ipc/part2/indexl.html 【32]. 郑彦兴,Linux环境进程间通信(二):信号(下),2003 http://www.ibm.com/developerworks/cn/linux/l-ipe/part2/index2.html 【33】. M.Tim Jones,Linux文件系统剖析,2007 http://www.ibm.com/developerworks/cn/linax/l-linux-filesystera/index.html 【34]. M.Tim Jones,Linux slab分配器详解,2006 http://www-128.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/ 【351. Vikram Shukl钆Linux线程模型的比较:LinuxThreads和NPTL。2006 上海大学硕士学位论文 htIp://、帆mm.com/developerworks/cn/linux/1一threading.html [361.施聪,UNIX/LINUX平台可执行文件格式分析,2004 http://www.ibm.com/developerworks/cn/linux/l-excutif/ 【37】.常若愚,IEEE802.15.4低速率无线个人区域网络之CSMA/CA碰撞效能分析与研 究.2003:25-49 [381.苏圣夫,在Linux系统中设计并实现ZigBee无线网络协议层,2004:16-31 [391.梁维斌,基于ZigBee的无线传感器网络技术研究,上海大学硕士毕业论文,2007 140].电子产品世界,目前几种焦点近距无线技术的介绍和对比,2008.1.2 http://www.eepw.com.cn/article/76080.htm 上海大学硕士学位论文 作者在攻读硕士学位期间公开发表的论文 【l】 王舒憬,黄河,党彦博,刘涛。基于ARM的无线Zigaee收发器驱动设计。仪表 技术。2008.2,已录用。 [21 王舒憬,党彦博,黄河,刘涛。ZigBee无线传感器网络结合GPRS实现远程监控。 仪表技术,2008.3,已录用。 13] 徐永晋,刘涛,黄河,方圆。基于Nucleus Plus嵌入式以太网接口的设计与实现。 仪表技术,2008.3,已录用。 上海大学硕士学位论文 作者在攻读硕士学位期间所作的项目 【l】 宾馆楼宇系统的房间灯光控制部分的研制,主要负责单片程序开发和调 试工作。 【2】 无线ZigBee网关的研制,负责无线收发器的驱动、协议栈的移植和网 关通信程序开发。 【3】 基于Windows Mobile 6操作系统上XScale Monahans LV处理器的BSP 验证。 上海大学硕士学位论文 致谢 首先感谢我的导师王舒憬副教授,他的严谨细致、一丝不苟的作风一直是 我工作、学习中的榜样;他的循循善诱的教导和不拘一格的思路给予我无尽的 启迪。承蒙王健和徐永晋老师的亲切关怀和精心指导,虽然有繁忙的工作,但 仍抽出时间给予我学术上的指导和帮助,特别是给我提供了良好的学习环境, 使我从中获益不浅。 还要感谢我的父母家人。岁月不经意的,回想承欢膝前的日子,仿佛犹在 昨日,只是蓦然回首时,才发现曾经依靠的肩膀已经变得孱弱。感谢他们,让 我总是能够在脆弱的时候重新变得坚强,让我在最失意的时候也能够找回自信, 让我在迷茫彷徨时,也始终找得到人生的方向。 还要感谢实验室的兄弟姐妹们。实验室严肃认真的科研气氛,欢快融洽的 交流氛围,是值得我用一生来回味的。特别要感谢梁维斌师兄,他为人乐观向 上,在学习科研上给了我许多指导和中肯的意见。感谢我的室友刘涛和管武, 和他们.一起的日子是如此的快乐,还要感谢张艺、方圆、袁康、张文斌、党彦 博等同学,生活因为和他们一起经历才变得精彩。 最后感谢我的女友甘玲,她让我的生命充满快乐和幸福的感觉。感谢我本 科的室友赵亮、王宏刚、宋萧萧、田野和路自谦,我们一起在成都待了四年, 在郁闷的日子里,我们总是能够成为相互的慰藉,在欢乐的日子里,我们也总 是一同庆祝,今后的人生中,我们也必将是永远的朋友。感谢我的朋友黄硕、 刘强、马健、郑怀蜀,从高中到现在的友谊见证了时间的另一种力量。同时也 要感谢我其他的朋友孙健、郭蓓蓓、沈辉、辜焰、侯庆军等等,能够认识他们, 是一件快乐的事情。 基于ARM的嵌入式无线ZigBee网关的设计与实现 作者: 学位授予单位: 黄河 上海大学 相似文献(10条) 1.期刊论文 郭小琴.孙毅刚.陈维兴.GUO Xiao-qin.SUN Yi-gang.CHEN Wei-xing 机场场面无线传感器网络监控系 统关键技术研究 -计算机工程与设计2009,30(22) 针对传统的机场场面目视指挥管理模式存在的不足,提出了一种基于无线传感器网络的监控系统设计方案.对系统中无线网络定位系统和监控系统两 个关键技术进行了研究,并给出了针对关键技术的研究成果.在ZigBee2006协议栈的基础上,研究无线网络通信技术,实现ZigBee模块之间的无线通信.以国 内某机场为例,借助GIS技术和C#语言设计了机场场面监控界面. 2.学位论文 周小舟 基于802.15.4协议的ZigBee协议栈实现 2006 随着通讯技术的日益成熟,人与人之间被各种有线和无线通讯技术联系在一起。在一些应用场合,传统的有线通讯方式已经远远不能满足现代社会 信息互通的需要,各种无线网络正在成为有线网络的扩展与替代,多种通信技术的应用进一步丰富了人们的通信手段。 按照通讯距离划分,无线通信网络大致分为卫星通讯网、无线广域网、无线城域网、无线局域网以及更小的无线个人网络。本文研究无线个人网络 (WirelessPersonalAreaNetwork,简称WPAN)相关技术及其应用。本文以IEEE802.15系列的无线个人网络技术标准为背景(802.15.4协议是组建WPAN网络 的物理层和MAC层技术的新标准),对WPAN网络的相关技术及发展进行了详细的研究。重点针对组建WPAN网络的新兴技术ZigBee技术进行了研究,研究内 容包括网络拓扑结构分析与优化、路由算法、网络通讯等诸多方面,并且着重介绍如何去构建ZigBee网络协议栈。 针对WPAN技术是新兴技术,实验研究时需要相关芯片作为基础,成本较难控制且无法根据研究需要加以改进,不够灵活,因此对WPAN网络各个层次 进行仿真是较为有效的方法,特别是当应用研究集中于软件层面时。本文在Windows2000和Cygwin环境下,基于开源软件ns,构建了一个网络仿真模拟平 台,对本文提出的协议栈进行了仿真研究,为WPAN技术的软件应用研究提供了工具和手段。 3.学位论文 杨朋伟 基于Zigbee的低功耗数据采集系统设计 2009 Zigbee无线传感器网络技术是一种全新的短距离无线通信技术,广泛应用于智能控制、无线监控及环境监测等领域。目前,对于Zigbee无线传感器 网络技术的应用还存在诸多问题,本文重点对无线传感器网络时间同步算法、低功耗系统设计开展深入研究。 1.对Zigbee无线传感器网络时间同步算法进行了全面分析研究,从降低同步开销和关键路径长度的角度出发,提出了两种应用于不同环境下的时间 同步算法。1)当网络规模较小时,采用二层拓扑结构的Zigbee时间同步算法,该算法通过构造二层拓扑结构和时延估计的方法实现了ms级的时间同步精 度.降低了时间同步开销;2)当网络规模较大时,采用多跳传感器网络时间同步算法,该算法通过构造较优拓扑结构和累计时延估计的办法降低了时间 同步开销及关键路径长度。 2.通过对Zigbee协议栈的研究及分析,从低功耗设计的角度出发,完成了Zigbee低功耗无线数据采集及传输系统设计。主要内容包括如下几个方面 : 1)完成了Zigbee无线网络节点的电路设计及相关应用电路设计,在此基础上,应用IAR7.20H开发平台完成了Zigbee无线网络节点的功能软件设计 。 2)使用TI公司的CC2430芯片完成了Zigbee节点点对点无线通信的设计及Zigbee简单网络节点通信设计。 3)完成了多路传感器数据采集接口的设计及Zigbee无线网络监控管理软件设计。 4)研究了无线网络节点功能软件的低功耗设计方法。 5)搭建了Zigbee低功耗无线数据采集及传输系统,对其进行了调试和实验,结果表明该系统在70m范围内工作稳定,误码率较低,时间同步精度较 高,能够满足工业环境下的参数远程监控。 4.期刊论文 基于ZigBee的仓库温湿度采集系统的设计 -计算机与数字工程2009,37(9) 针对现有仓库温湿度检测存在的问题,结合无线传感器网络技术,提出一种基于ZigBee技术的仓库温湿度采集系统设计方法.设计采用CC2430射频芯片 及SHT11数字温湿度传感器,在ZigBee协议栈的基础上进行应用开发.阐述了系统的总体设计,节点的硬件设计和软件设计.通过实验测试表明,该无线化的 仓库温湿度采集系统能够稳定可靠的运行,并且具有组网简单、系统花费少、扩张网络容易等优点. 5.学位论文 张喆 基于ZigBee技术的无线网络的研究与开发 2008 随着通信技术的发展,短距离无线通信技术在人们生活中扮演着越来越重要的角色。Zigbee技术凭借其低成本、低功耗、组网方便等诸多优势在激 烈的无线通信技术竞争中逐渐脱颖而出。特别值得一提的是ZigBee技术具备强大的网络功能。它支持目前三种主要的自组织无线网络类型,且具有很强 的网络健壮性和系统可靠性,使得ZigBee网络更加灵活、高效、可靠。这种低速率无线通信技术的应用更贴近工业生产与人们的日常生活,可以很好的 应用于家庭自动化、工业控制、建筑自动化、医疗护理等。ZigBee技术的主要支持者成立了ZigBee联盟,负责推动标准的制定、ZigBee技术的全球推广 、ZigBee产品和平台的测试和认证。 本文介绍了ZigBee技术的背景、ZigBee设备构成和网络结构,并深入的研究了ZigBee协议规范。并从低成本、低功耗、高性能方面考虑,选取合适 的微处理器和射频芯片设计开发了ZigBee硬件开发平台,同时在此硬件开发平台基础上对Microchip ZigBee协议栈进行了研究与移植。基于 MSP430F149微处理器设计开发了实验平台的母板.以CC2420为射频芯片设计了无线收发模块。母板和无线收发模块间通过MSP430的SPI接口连接,并采取 主机模式进行通信。在系统软件设计方面,首先深入地研究了ZigBee协议栈的整体框架和各层的功能,再根据ZigBee网络的设备构成分别分析了协调器 、路由器和终端设备节点的协议栈。最后完成对数据结构以及微处理器芯片MSP430和ZigBee芯片CC2420的初始化程序等底层驱动的修改与编写。从而完 成了Microchip ZigBee协议栈软件在本文硬件开发平台上的实现。 6.学位论文 李鹏 ZigBee网络性能分析及网络规划应用研究 2009 ZigBee技术是针对短距离无线通信市场开发的一种无线传感网络应用技术。它具有低成本、低功耗、组网灵活和网络容量大等特点,非常适合应用 在无线抄表、家居智能化和楼宇自动化等大型监控网络中,可以解决现有监控网络存在的成本高、维护困难、移动性差等问题。 目前对ZigBee技术的研究主要集中在协议栈研发、协议各层算法设计、IC芯片开发、应用前景研究等方面,对ZigBee技术作为一个大型网络的网络 性能和网络规划的分析研究较少。本文旨在通过实验手段对ZigBee网络性能进行分析测量,在获得实际网络参数的基础上,完成一个面向应用的网络的 简单规划与设计。 本文以楼字自动化应用为设计背景,综合比较分析了当前存在的多种短距离无线通信技术,认为ZigBee技术是最适合应用在短距离监控领域的一种 无线通信技术。本文对ZigBee规范做了深入、全面的研究分析,并在此基础上介绍了TI公司ZigBee协议栈应用开发相关概念。 在对TI公司Z-stack协议栈的网络性能进行测量分析的基础上,通过对网络进行合理规划,包括网络拓扑结构、Profile设计、网络需要分析等,设 计了满足用户要求的一个简易楼宇监控系统。该系统可以支持动态组网,实现对远程节点温度的测量,并通过上位机监控软件实时监控这些信息。 7.学位论文 柯居鑫 ZigBee技术在无线鼠标中的应用研究 2009 ZigBee无线通信技术是一种新兴的短距离无线通信技术,具有低功耗、低速率、低时延等特性,具有强大的组网能力与超大的网络容量,可以广泛 应用在消费电子产品、家居与楼宇自动化、工业控制、医疗设备等领域。由于其独有的特性,ZigBee无线技术有更广阔的发展前景与更宽广的市场需求 。对ZigBee应用技术的研究,具有非常重要的研究意义和应用价值。 本文首先介绍了无线鼠标和ZigBee的现状及其发展前景和研究意义;接着简单比较了几种短距离无线通信技术的性能,进而引出ZigBee无线通信技 术,根据IEEE802.15.4标准规范与ZigBee标准规范,简单扼要地阐述了ZigBee协议栈的物理层、媒体接入层、网络层、安全层和应用框架层等各层的 功能以及各层间的接口。 本文结合学科发展趋势和实际应用需求,在参考了大量文献以及深入了解ZigBee各层协议和鼠标工作原理的基础上,着眼于研究ZigBee无线通信技 术在光电鼠标中的应用。本文主要进行以下几个方面的工作: (1)选取合适的芯片设计开发ZigBee无线收发模块。通过对各种芯片的比较和了解,选取功耗小且可以较好匹配的MC9S08GT60作为收发模块的微控 制器和MC13192作为收发芯片,进而开展了芯片的接口和射频天线的设计,以及PCB板的制作和ZigBee协议栈的移植。 (2)通过深入了解光电鼠标的工作原理,采用ZigBee收发模块对鼠标信号的提取、无线发送和接收,以USB接口连接PC机,实现鼠标的操作。 (3)针对已实现的ZigBee无线鼠标,对其传输距离和抗干扰等性能进行研究和综合评价,提出改进方法。 8.学位论文 王凯 基于ZigBee无线通信技术的无线水表设计与实现 2006 本文综述了目前常见的无线通信技术,探讨了各种无线通信技术的优缺点,并对市场上现有的自动抄表系统进行了分析和比较。在此基础上,应用 短程无线通信技术,介绍了基于ZigBee无线通信技术的无线水表设计方法和实现细节。 介绍了ZigBee技术产生的背景,详细描述了ZigBee以及相关的IEEE802.15.4内容,叙述了ZigBee技术的特点以及目标应用市场,并给出了市场上支 持ZigBee技术的RF芯片和模块;从无线水表的设计要求、工作原理着手,提出了无线水表的总体设计方案。通过对常见ZigBee RF芯片介绍和对比,选择 了CC2420芯片作为无线水表的无线器件。分析了无线水表的硬件设计原理,给出了具体设计的电路,讨论了若干技术细节和注意事项;根据无线水表需 实现的功能,以ZigBee协议栈为基础,提出了软件设计的总体架构,主要包括用水量的计数部分设计和数据的无线通讯部分,探讨了无线水表软件的设 计方法合实现过程;叙述了ZigBee网络的一些概念以及网络地址计算、网络建立、网络节点寻址等内容,介绍了ZigBee无线网络的调试工具,讨论了无 线水表的调试过程和结果。 总结了无线水表测试和试用情况,并对ZigBee技术的发展和应用前景作了展望。 9.期刊论文 海洁.张军.尤连荣 无线网络通信技术ZigBee及应用 -南北桥2009,""(3) 本文主要阐述了无线网络通信技术ZigBee.首先分析了ZigBee协议栈的组成、网络拓扑、和技术特点,其次与其他同类技术做了简单的比较分析,最后 研究了ZigBee的应用和发展方向. 10.学位论文 周倩 工业无线网络技术研究与应用 2007 工业无线技术是一种新兴的面向设备间信息交互的无线通信技术,适合在恶劣的工业现场环境使用,具有抗干扰能力强、能耗低、通信实时性好等 特征,是一类特殊的传感器网络。目前,广泛使用的工业无线技术有无线局域网,蓝牙和ZigBee等。 通过对蓝牙网络通信协议的研究,设计出以ARM9处理器和蓝牙适配器为核心的嵌入式网络节点,该节点具有模数转换和开关量输入输出等功能。在 ARM9平台上嵌入式Linux系统中,编写了设备驱动程序,移植了BlueZ协议栈,并在协议栈上开发了通信程序,实现了搜索设备、发现服务、建立连接和 收发数据等功能。 根据ZigBee协议的体系结构和技术特点,设计了以8位AVR单片机ATmega128和符合IEEE 802.15.4标准的射频芯片CC2420为核心的ZigBee网络协调器 和终端设备节点,节点具有光强度信号采集功能。编写了底层驱动程序,移植了PICZstack协议栈到AVR单片机上,并在协议栈上开发了协调器和终端设 备的通信程序。设计出的ZigBee网络协调器具有建立网络,处理设备关联请求,处理设备绑定请求,处理设备解关联请求和数据转发等功能,终端设备 具有搜寻网络,加入网络和数据收发的功能。 由蓝牙主设备和从设备组建的蓝牙微微网,实现了主设备对远程从设备的控制操作。由ZigBee协调器和终端设备组建的ZigBee星型网络,实现了对 环境中不同地点光强度信号的采集与监控。通过对上述两个网络的测试和比较分析得出,蓝牙节点具有数据传输速度快和传输质量高的特点,但功耗大 ,网络拓扑结构单一,扩展性较差,适用于传输语音和视频信号。而ZigBee节点具有功耗低和组网能力强的特点,但数据传输速度慢,适用于控制和数 据采集领域。可见,两种技术应用的领域不同,可以达到补充的作用。 本文链接:http://d.g.wanfangdata.com.cn/Thesis_Y1370264.aspx 下载时间:2010年5月26日

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。