您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页基于ArmLinux的智能传感器控制系统的设计与实现

基于ArmLinux的智能传感器控制系统的设计与实现

来源:化拓教育网
上海交通大学硕士学位论文

基于Arm-Linux的智能传感器控制系统的设计与实现

姓名:郑锐申请学位级别:硕士专业:通信与信息系统指导教师:黄佩伟

20080111

上海交通大学硕士学位论文

基于Arm-Linux的智能传感器控制系统

的设计与实现

摘要

网络技术和数字信息新技术的发展为实现家庭生活智能化提供了强有力的技术支撑;传感器技术的发展提供了家庭设备和家庭网络进行信息交换的技术基础;而计算机技术和嵌入式技术的发展为实现对接入家庭网络的各类设备的监测、控制和管理提供了技术支持。新技术的产生使人们对生活和工作的环境提出新的需求。以家庭网关为主导,将现有和将来可能的硬件设备纳入家庭网络,并且实现智能化服务和管理是数字家庭未来发展的主要方向。

由于传统的家庭网关很难将分散于家庭各处的传感设备连接到一起,因此,本文提出了中继器的设计概念,将其从常规的复杂家庭网关中分离出来,实现了对分散于家庭各处的传感器设备进行更为智能化的管理。中继器需要完成的基本功能包括:对于接入的传感器设备,能够将其迅速融入整个系统中,实现即插即用;根据采集信息的变化自动进行模仿人为分析、操作等功能;与家庭网关通信,提供远程控制、查询、管理等功能。

本控制系统核心部分采用S3C2410为处理器,嵌入式实时Linux为操作系统,极大地提高了控制系统的稳定性。本文详细地介绍了传感器控制系统的硬件、软件设计,并且详细地介绍了软件的具体实现。另外,本文还提出了基于自主通讯协议的家庭网络通信方式,

I

上海交通大学硕士学位论文

有效地提高了控制系统的实时性与可靠性。

本论文基于和日本NTT研究所合作的科研项目“家庭传感器及开关接入的中继系统设计”为技术背景。

关键字:智能传感器,嵌入式,中继控制器,家庭网关

II

上海交通大学硕士学位论文

DESIGN AND REALIZATION OF CENTRAL

CONTROL SYSTEM FOR INTELLIGENT SENSOR

BASED ON ARM-LINUX

ABSTRACT

The development of network technology and digital information has provided a strong technical support for the realization of intelligent family life; the development of sensor technology provides a technical foundation for the exchange of home equipment and network; and the development of computer and embedded technology also provides a good technical support for the various equipment detection, control, and management. The emergence of the new technology has enabled new demands of people’s life and work environment. A Home Gateway which can bring devices into home network is the most important problem to realize the intelligent service and management.

As traditional Home Gateway can not connect various sensor devices located in different places conveniently in our home, therefore, this paper proposes a design concept: relay controller, which is separated from the complex Home Gateway and can join all the sensor devices located in different places. Its basic function includes: bring a new device into the whole system quickly, it can realize plug and play; It also has

III

上海交通大学硕士学位论文

intelligent analyze function such as according to variational data, it can simulate human to analyze and operate the device; It can communicate with Home Gateway, provide the function of remote control, query, management and so on.

This control system is based on S3C2410 processor and real time embedded Linux operating system which can improve the reliability greatly. This paper introduces the hardware and software design in details, and also introduces how to realize the software; In addition, this paper has also proposed a communication way based on independent communication protocol which can improve the system real time function and reliability.

This paper is based on the project “design of relay system for sensor and switch” which is cooperated with Japanese NTT Corporation.

KEY WORDS: intelligent sensor, embedded Linux, relay controller, Home Gateway

IV

上海交通大学硕士学位论文

缩略语

HGW Home Gateway 家庭网关 RF Radio Frequency 射频 MAC Media Access Control 介质访问控制 LLC

MMU AMBA

UART MTD FSM

MCU CRC

ARQ Auto CGI Common PNP

NFS Network IPC Internet CSMA Carrier

Logic Link Control 逻辑链路控制 Memory Management Unit 存储器管理单元 Advanced Microcontroller Bus Architecture 高性能片上总线架构

Universal Asynchronous Receiver/Transmitter 通用异步收发器 Memory Technology Device 内存技术设备 Finite State Machine 有限状态机 Micro Controller Unit 微控制单元 Cyclical Redundancy Check 循环冗余码校验

Repeat request 自动重传请求 Gateway Interface 公共网关界面 Plug And Play

即插即用

File System 网络文件系统 Process Connection 共享命名管道 Sense Multiple Access

载波监听多路访问

VII

上海交通大学 学位论文原创性声明

本人郑重声明:所呈交的学位论文,是本人在导师的指导下,进行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。

学位论文作者签名:郑锐

日期:2008年 1月 11日

上海交通大学 学位论文版权使用授权书

本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权上海交通大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 保密□,在 年解密后适用本授权书。 本学位论文属于

不保密□。√ (请在以上方框内打“√”)

学位论文作者签名:郑锐 指导教师签名:黄佩伟 日期:2008年 1月 11日 日期: 2008年 1月 11日

上海交通大学硕士学位论文

第一章 绪论

1.1 背景与需求分析

网络技术和数字信息新技术的发展为实现家庭生活智能化提供了强有力的技术支撑。近年来宽带网络迅速发展,预计在两年以后全球将有1亿家庭实现宽带通信,这一基础设施的普及为家庭网络的应用提供了巨大的潜在市场。传感器技术的发展提供了家庭设备和家庭网络进行信息交换的技术基础,而计算机技术、大规模IC和嵌入式技术的发展为实现对接入家庭网络的各类设备的监测、控制和管理提供了技术支持。长久被忽视的家庭环境也终于开始了网络化进程。

新技术的产生使人们对生活和工作的环境提出新的需求,只有按键和开关电器的传统的服务方式已远不能满足人们的需求。

近年来,人们对在家庭中的工作、学习和生活的提出了新的需求,希望家庭网络具有:家庭安全监控功能;家居管理功能;在家办公、教育、娱乐等功能。

家庭安全监控:家庭安全威胁来自两个方面,一方面是外来入侵;另一方面是内部隐患(如火灾、煤气泄漏等)。

家庭安防应具有的功能有:(1)险情检测,主要是指通过各类传感器来检测家中状态,判别各类险情,如非法入侵、火灾、煤气泄漏、紧急情况等;(2)远程报警,即在险情发生时能够通过电话、互联网等向用户、小区物业中心、相关部门报警;用户也可以通过电话、互联网等查询家庭的安防状态;(3)联动处理,发现险情时通过预设的逻辑规则请求相关控制系统协同工作。如煤气泄漏时可以请求打开排气扇等等。

家居管理:包括建造舒适、健康、方便、个性化的居住环境;能耗及节能;以及与社区的信息交互等。

根据管理对象的不同,可以分为:照明控制、房间环境控制、视频音响控制、能耗及节能控制等。

照明控制实现灯光的个性控制和节能的目的。

房间环境控制包括:控制电动窗帘来调节房间的亮度,或者通风需求;根据室内的温、湿度自动调节空调等的启动关闭等。

1

上海交通大学硕士学位论文

视频音响控制根据用户的指令和活动状态,自动开启、关闭或选择视频音响节目。比如用户回家后即播放喜欢的背景音乐等。

能耗与节能控制包括:(1) 采集家庭三表(水、电、煤气)的数据,并将其传送至收费公司。(2)节能控制:比如可以根据一定的要求,实行白天/太阳能,晚上/电能的切换等;

新技术使人类的生存方式正在经历着深刻的变革,梦想中更为先进、高效、环保、完美的生活方式已是触手可及了。

可以设想:当清晨太阳升起,能源管理系统由夜间模式自动转换为白天模式,太阳能电池板开始储蓄光能,根据能耗情况自动进行必要的输出与储备;照明系统自动选择适合需要的场景;起床后用水时,水龙头里流出你所习惯的水温,镜子上可以显示出当时的室外温度;当你踏出家门的那一刻,智能保安系统同时启动,所有突发信息都会连接到你所设定的通信终端上;当你踏进家门时,自动记忆模式启动,舒适的温度,适宜的湿度,喜欢的音乐在等着你……未来的家庭网络服务管理系统还能实现全面监控、精确优化、自动维护。

1.2 传感器技术与数字家庭网络

科学技术的发展将人类社会带入了信息时代,人们的社会活动将主要依靠对信息资源的开发及获取、传输与处理。从浩瀚无垠的宇宙,到微观粒子世界,许多未知的现象和规律信息,没有相应的传感器是无法获取的。传感器技术是当今信息社会中的一门跨学科的边缘性技术学科,它在信息处理系统中占有十分重要的地位,是信息处理系统的三个构成单元(传感器、通信系统、电子计算机) 之一,已渗透到了生产、科研和生活的各个领域。传感器在自动检测与控制系统中占有特别重要的地位,它是感知、获取与检测信息的窗口,传感器位于研究对象测控系统的接口处,凡是要获取的科学研究和生产过程的信息,都要通过传感器将其转换为容易传输与处理的电信号。现在,由传感器和电子计算机(数字电路或单片机)组成的数字式测量仪表以至智能化测量系统已经得到普遍使用。

智能传感器是近期发展起来的新的传感器技术,它是微电子技术、微型电子计算机技术与检测技术相结合的产物。80 年代智能化测量主要以微处理器为核心,把传感器信号调节电路、微电子计算机存贮器及接口电路集成到一块芯片上,

2

上海交通大学硕士学位论文

使传感器具有一定的人工智能。90 年代智能化测量技术有了进一步的提高,使传感器实现了微型化、结构一体化、阵列式、数字式,使用方便和操作简单、具有自诊断(自标定、自校正、自动采集、自动补偿、自动检验、自选量程、自寻故障)功能、记忆与信息处理功能、数据存贮功能、多参量测量功能、联网通信功能、逻辑思维以及判断功能。由此可见,智能化传感器一般主要由主传感器、辅助传感器及微机硬件系统三大部分构成。也就是说,智能化传感器是一种带有微处理器的传感器,它兼有检测判断和信息处理功能[1][2][3]。

本节我们可以发现在先进的数字化家庭网络中,传感器技术的应用是必不可少的。在未来的数字家庭中,传感器甚至可以延伸到每一个角落,如何控制这些传感器便成为了一个重要的问题,下面将介绍此问题的解决方案。

1.3 控制系统的组成及其必要性

从对目前我国家庭的现状分析中,可以看出,要建立先进的家庭网络服务系统必须解决的关键问题有:

1)需求的个性化和随意性

家居生活是最能体现个性化的,用户可以在任意房间、任意地点,安装不同数量、不同种类的传感器和开关控制单元,甚至会有安放在室外的情况(如电表)。无法用一种标准程式去约定,因而如何适应个性化和随意性是家庭网络服务系统设计的生命所在。

2)对象与服务的多变性 网络家庭服务的基本功能有:

z 环境控制――包括房间温度、湿度等的控制、二氧化碳浓度控制等。 z 照度控制――包括照明灯具就地控制、场景程序控制、远程控制及自动控 制;安全模式控制等。

z 安防控制――包括火灾自动报警、煤气泄漏报警、侵入报警漏电报警、漏水报警等。

z 能耗控制――三表的查询、供电系统的切换等。 z 通信功能――包括电话、网络、远程控制报警等。

未来的家庭主要是依靠家庭网关(Home Gateway,HGW)实现各种家庭电

3

上海交通大学硕士学位论文

器设备的服务。如:HGW依靠温湿传感器自动调节室内的温度,根据感光传感器得到的光照强度对灯光的亮度进行调节,实现对能源的节约;通过设置在门窗等处的传感器和报警装置,实现家庭安全等。未来家庭主要的服务也必须依靠一个统一的HGW来实现,即HGW监视家庭网络上的接入设备、能够发出操作指令。为了实现这个目标,HGW必须可以连接家庭中所有的电器设备。

将家庭内部分散于各处的设备连接到一个固定位置的HGW,并不容易实现。因此,本文提出了中继器(relay)的设计概念,将其从常规的复杂家庭网关中分离出来,用来连接所有的设备,实现了对分散于家庭各处的传感器设备进行更为智能化的管理。从功能上看,中继设备需要实现对终端接入模块上传感器数据的收集并及时报告家庭网关,同时也要能够监听家庭网关下达的操作指令并对下控制终端接入模块上的开关设备。中继器承担各类信息的采集及汇接工作,其是控制系统的核心部分。

以传感器以及开关设备为例,设备接入控制如图1.1所示。从图中可以看出控制系统主要由中继器设备与HGW组成,其中中继器设备通过以太网与HGW进行通信。在此控制系统中,中继器设备是核心部分,而HGW部分将会得到很大程度的简化。本文的主要任务就是设计与实现中继器部分。

开关 中继器设备 Digital OUT 1bit Analog OUT 8bit Digital IN 1bit 传感器 Analog IN 8bit 中继器 10/100 - T base HGW

图1.1 控制系统图 Figure 1.1 central control system

综上所述,在一个数字化家庭或者智能小区里,我们需要一个控制系统来统一管理、操作接入家庭网络的各种传感器。本论文正是在这种应用背景下,设计并实现了以S3C2410为处理器,嵌入式Linux为操作系统的传感器控制

4

上海交通大学硕士学位论文

系统。鉴于篇幅,本文将会重点介绍中继器部分的设计与实现。

1.4 论文内容安排

本文的章节安排如下:第一章将简述本系统的应用背景;第二章将详述控制系统实现环境的搭建,这里包括如何搭建嵌入式系统平台、如何修改嵌入式系统的Bootloader以方便实现本系统功能等;第三章将详细介绍控制系统的设计思路及流程,是本文的重点部分;第四章将在第三章的基础上详细介绍如何实现该系统功能,包括环境的移植介绍、软件的编写等,其中重点是软件的实现;第五章是系统测试用例的设计,即实现对本系统的单元测试及功能性测试,该章也是检验本系统功能是否实现预期结果的重要依据;第六章将会从总体上对本系统的设计进行总结,并且提出展望。

1.5 本章总结

本章详细地叙述了家庭传感器控制系统的技术应用背景,并且详述了其在数字化家庭或者智能小区里的重要性,本章的最后还对本文的章节内容安排作了简单的介绍。

5

上海交通大学硕士学位论文

第二章 嵌入式系统环境的搭建

由于控制系统不仅要从下行接入设备接收数据,还要对数据进行智能分析、处理,然后存储在数据库里,最后还需提供远程监控的功能。所有这些对处理器的速度都有一定的要求,而且需要一个微型操作系统,提供多线程或多进程操作,故在本系统设计中采用的是Samsung公司的S3C2410芯片。S3C2410处理器是基于ARM公司的ARM920T处理器核,采用0.18um制造工艺的32位微控制器,其工作主频最高可达203Mhz,可以满足本控制系统的需要。在内嵌操作系统的选择上,采用Linux2.6版本的内核,该版本的内核在各方面的支持上都较2.4的内核有较大提高、完善,如其支持抢占式进程调度,极大地提高了系统的实时性。下面各节将会详细介绍相关嵌入式环境的建立。

2.1核心板外围硬件的扩展

按照中继器控制系统需要完成的功能,我们需要在核心板的基础上扩展如下这些模块:

(1)2个UART接口,由于至少需要使用一个UART来调试嵌入式系统,另一个UART来实现无线模块或者有线模块的通信,故这里需要扩展2-3个UART口,当然也可以通过telnet的方式调试嵌入式系统;

(2)USB Host接口,预防系统需要实现海量存储数据的需要。虽然本系统使用的是嵌入式SQLite小型数据库,但是将数据存储在嵌入式系统所控制的M的Nandflash上还是不现实的。这里需要涉及的知识点有:内核必须提供 USB host 的驱动模块的支持;

(3)RJ45网络接口,Linux内核支持很好的网络驱动,而且网络接口在本系统中必不可少,中继器与HGW之间的通信全都是通过网络socket来实现的。这三块是所需要扩展的主要部分,加上和新板上的JTAG接口等,基本上可以满足本系统的需要。

ARM架构的处理器,有的带有指令cache和数据cache,但片内不带有片内RAM和片内ROM。系统所需的RAM和ROM都通过总线相连,由于系统的地

6

上海交通大学硕士学位论文

址范围较大,有的片内还带有存储器管理单元MMU。ARM架构的体系处理器内核一般没有I/O部件和模块,ARM架构的I/O可以通过AMBA总线来扩充[4]。 2.2 Bootloader的修改与移植

在本文中介绍Bootloader的作用,主要是因为:在控制系统的实际实现过程中,我们遇到了嵌入式系统板上资源有限的情况,如串口资源缺少。而这些资源Linux系统本身也要占用,为了释放这些系统占用资源,必须要了解Bootloader的工作原理,然后进行相关修改,以实现系统设计的总体目标。

简单地说,Bootloader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

2.2.1 Bootloader所完成的作用

从操作系统的角度看,Bootloader的总目标就是正确地调用内核来执行。 另外,由于Bootloader 的实现依赖于CPU 的体系结构,因此传统的大多数 Bootloader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。下面是Bootloader的完整启动流程[5][6]:

(1) 硬件设备初始化;

这是 Bootloader 一开始就执行的操作,其目的是为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序):屏蔽所有的中断,为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Bootloader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏蔽寄存器或状态寄存器(比如ARM的CPSR寄存器)来完成;设置 CPU 的速度和时钟频率;RAM 初始化,包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等;初始化 LED,典型地,通过 GPIO

7

上海交通大学硕士学位论文

来驱动 LED,其目的是表明系统的状态是正常还是错误。如果板子上没有 LED,那么也可以通过初始化 UART 向串口打印 Bootloader 的启动字符信息来完成这一点;关闭 CPU 内部指令/数据 cache。

(2) 为加载 Bootloader 的 stage2 准备 RAM 空间; (3) 拷贝 Bootloader 的 stage2 到 RAM 空间中; (4) 设置好堆栈;

(5) 跳转到 stage2 的 C 入口点; (6) 初始化本阶段要使用到的硬件设备; (7) 检测系统内存映射;

(8) 将内核映像和根文件系统映像从 flash 上读到 RAM 空间中; (9) 为内核设置启动参数; (10) 调用内核。

至此,Bootloader已完成它所有的功能,整个系统的控制权交给嵌入式Linux操作系统。

2.2.2 Bootloader与内核启动参数

应该说,在将内核映像和根文件系统映像拷贝到 RAM 空间中后,就可以准备启动 Linux 内核了。但是在调用内核之前,应该作一步准备工作,即:设置 Linux 内核的启动参数。Bootloader 可以通过两种方法传递参数给内核, 一种是旧的参数结构方式parameter_struct,这个主要是2.6 之前的内核使用的方式。另外一种就是现在的2.6 内核在用的参数链表 (tagged list) 方式。这些参数主要包括,系统的根设备标志,页面大小,内存的起始地址和大小,RAMDISK 的起始地址和大小,压缩的RAMDISK 根文件系统的起始地址和大小,内核命令参数等。内核参数链表的格式和说明可以从内核源代码目录树中的 include/asm-arm/setup.h中找到,参数链表必须以ATAG_CORE开始,以ATAG_NONE 结束。这里的ATAG_CORE,ATAG_NONE是各个参数本身的标记,本身是一个32位值,例如:ATAG_CORE=0x54410001。每个参数标记就代表一个参数结构体,由各个参数结构体构成了参数链表[6]。

Linux 内核在启动时可以以命令行参数的形式来接收信息,利用这一点我

8

上海交通大学硕士学位论文

们可以向内核提供那些内核自己不能检测的硬件参数信息,或者重载内核自己检测到的信息。比如,我们用这样一个命令行参数字符串\"console=ttyS0,115200n8\"来通知内核以 ttyS0 作为控制台,且串口采用115200bps、无奇偶校验、8位数据位这样的设置。 2.2.3 修改Bootloader代码

前面已经详细介绍了Bootloader的所有相关知识,Bootloader和正常PC的BIOS的原理与功能基本上是一致的。在前面也了解到本中继器系统中,我们将需要利用多个串口,一个串口用来实现无线通信模块,一个串口用来实现RS485通信。然而,当在Bootloader的参数列表里传递了console=ttyS0这样的参数后,内核便会利用第一个UART作为其调试终端,从而这个UART便不能用来进行正常的数据通信了。在了解了Bootloader的整体结构后,便可以很容易地解决这个问题,问题解决的方案如下步骤:

(1) Bootloader stage1的UART_INIT()函数功能不变,这样仍然可以在控制权交给内核之前利用UART对整个嵌入式系统进行控制、调试;

(2) Bootloader stage2传递内核启动参数的时候,将console=ttyS0代码片删掉,这样内核在启动以后便不会以第一个UART作为默认的调试终端了,当然也不会占用第二个UART来作为调试终端;

(3) 利用ADS重新编译Bootloader源代码,利用JTAG口将Bootloader烧进nandflash的起始地址里面。

按照以上步骤操作后,重启嵌入式系统。可以发现在Bootloader阶段仍然可以看到串口的相关调试信息的打印,但是当出现“uncompressed kernel......”等调试信息后,串口便不会再有调试信息的出现了。此时,我们可以在用户层,正确地使用系统上的所有串口资源进行数据通信。

2.3 嵌入式文件系统的移植

目前,Linux操作系统可以支持多种文件系统,包括ext2、ext3、vfat、ntfs等多种形式。而嵌入式系统中由于存储介质通常为RAM(SDRAM)和ROM(通常采用FLASH存储器)。因为不同的文件系统有不同的特点,因而根据存储设备的

9

上海交通大学硕士学位论文

硬件特性,系统需要不同的文件系统。在本控制系统中,其存储介质主要为RAM和NAND FLASH,适合其的文件系统有cramfs和yaffs文件系统。下面将详细介绍这两种文件系统[7]。

¾ cramfs文件系统

cramfs文件系统是一种只读性质的压缩文件系统,它是基于MTD驱动程序的。在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比达到2:1,这也为嵌入式系统节省大量的flash存储空间,使系统通过更低容量的存储介质存储相同的文件,从而降低了系统总成本。cramfs文件系统以压缩方式存储,在运行时解压缩,所有的应用程序要求被拷到RAM里去运行,但这并不代表比ramfs需求的RAM空间要大一点,因为cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。由于以上特性,cramfs在嵌入式系统中应用很广泛。但是它的只读属性同时又是它的一大缺陷(虽然只读性在一定程序上对于嵌入式操作系统的稳定性有帮助),使得用户无法对其内容对进扩充。正是因为此原因,下面将介绍另外一种嵌入式文件系统yaffs,其可以支持读写,让其与cramfs配合使用,将会极大地方便嵌入式软件开发。

¾ yaffs文件系统

yaffs是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2、cramfs相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。yaffs自带NAND芯片驱动,并且为嵌入式系统提供了直接访问文件系统的API,从而用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用[8]。

Yaffs文件系统的编译:要想移植内核支持yaffs文件系统,我们需要将yaffs文件系统编译进内核模块。首先可以从yaffs的官方网站上下载其源代码,然后

10

上海交通大学硕士学位论文

需要在内核源码树下建立一个yaffs文件目录,将yaffs的源代码拷贝进去,并且需要新建一个makefile文件如下:

TARGET := yaffs.o

obj-y := yaffs_fs.o yaffs_guts.o yaffs_mtdif.o yaffs_ecc.o obj-m := $(TARGET)

然后还需要修改fs/makefile,添加编译yaffs文件系统。在配置内核的时候,需要加上yaffs支持并调整相关MTD支持选项。重新编译内核并将其烧进flash存储系统。此时,嵌入式系统便可以支持yaffs文件系统了。我们可以采用挂接文件系统或者在yaffs上建立根文件系统的方法使用yaffs文件系统。两种方式都十分方便,如#mount –t yaffs /dev/mtdblock/x /mnt(其中x表示flash的分区情况,可以通过ls /dev/mtd来查看嵌入式系统的存储分区情况),我们便可以在mnt下面进行读写操作了,并且系统掉电后数据将会保存在设备文件为/dev/mtdblock的存储分区里面;另外一种方式就是在采用上一种方式挂接后,将根文件系统内容拷贝到其上面,然后修改启动参数root=/dev/mtdblock/x(此处参数的修改可以在Bootloader源代码里直接修改,也可以在提供修改参数功能的Bootloader界面上进行修改,如2.3.3节所述)。这样系统启动后,根文件系统就是yaffs形式的,我们便可以在其根目录下进行读写操作,并且掉电后内容不丢失。

2.4 PC端开发环境的建立

建议安装Redhat9.0系列或者是Fedora系列,我们可以选择直接安装在PC机上,或者是安装在Vmware上。在安装linux操作系统的时候,注意要选择安装gcc,tftp server,ftp server,nfs server,minicom telnet等。另外就是要安装ARM的编译器,命令形式如arm-linux-gcc,使用该编译器编译出的代码可以运行于ARM平台。

在这里简单介绍NFS服务器的使用:

网络文件系统(NFS,Network File System)是一种将远程主机上的分区经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像操作本地分区一样来对远程主机的共享分区(目录)进行操作。在嵌入式Linux 的开发过程中,开发者需要在Linux 服务器上进行所有的软件开发,

11

上海交通大学硕士学位论文

交叉编译后,通用FTP 方式将可执行文件下载到嵌入式系统运行,但这种方式不但效率低下,且无法实现在线的调试。因此,可以通过建立NFS,把Linux 服务器上的特定分区共享到待调试的嵌入式目标系统上,就可以直接在嵌入式目标系统上操作Linux 服务器,同时可以在线对程序进行调试和修改,大大的方便了软件的开发。因此,NFS 的是嵌入式Linux 开发的一个重要的组成部分,本部分内容将详细说明如何配置嵌入式Linux 的NFS 开发环境。

Linux 服务器端NFS 服务器的配置:以root 身份登陆Linux 服务器,编辑/etc 目录下的共享目录配置文件exports,指定共享目录及权限等。编辑文件/etc/exports,在该文件里添加如下内容:/home/zhengrui(rw,sync,no_root_squash),然后保存退出。添加的内容表示:NFS提供读写的权限来访问/home/zhengrui 目录,/home/zhengrui 也称为服务器输出共享目录。括号内的参数意义描述如下:rw:读/写权限,只读权限的参数为ro;sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘;no_root_squash:NFS 服务器共享目录用户的属性,如果用户是 root,那么对于这个共享目录来说就具有 root 的权限。操作完毕后,可以采用自我挂载的方法验证NFS是否工作正常:# /etc/rc.d/init.d/nfs start,用户也可以重新启动Linux 服务器,自动启动NFS 服务;在NFS 服务器启动后,还需要检查Linux 服务器的防火墙等设置,一般需要关闭防火墙服务;# mount -t nfs 192.168.0.99:/home/zhengrui /mnt,该命令将Linux 服务器的NFS 输出共享目录挂载到/mnt 目录下,如果NFS 正常工作,应该能够在/mnt 目录看到/home/zhengrui共享目录中的内容。 2.5 本章总结

由于本系统的控制核心部分是由S3C2410处理器加实时Linux操作系统环境实现的,所以本章较为详细地介绍了嵌入式开发环境的配置问题。在系统的实际实现过程中涉及到一个难题:如何释放系统占用的有限的串口资源,解决此问题的最终方法是修改嵌入式系统的Bootloader。本章详细介绍了Bootloader的相关知识,并且介绍了如何解决系统释放资源的问题。本章的最后简述了一下PC端交叉开发环境的建立。

12

上海交通大学硕士学位论文

第三章 控制系统总体设计

本论文的目的是为现代家庭设计一套控制系统,包括健全的家庭网络,和智能化的家庭网关。家庭网络将所有的对象(感知元和执行元)互连成网,家庭网关沟通家庭内部和外部,有序、高效、优化地管理各种家庭事务和监控家居设备。

为了提高效率,家庭网关必须从繁杂的通信方式和信号采集中解脱出来,有效地完成家庭网络智能化的服务和管理的任务。因此,本文提出中继器的设计思路(如1.3节所述)。从功能上看,中继器(relay)需要实现对终端接入模块上传感器数据的收集并及时报告家庭网关,同时也要能够监听家庭网关下达的操作指令并对下控制终端接入模块上的开关设备。中继器对下应该能够及时的发现新设备的接入、已接入设备的移除、设备在工作中出现的异常,如电量不足,射频设备超出传输有效范围等;同时中继器还应该通过查询终端接入模块或终端接入模块主动报告的形式及时的获取接入模块的传感器数据和开关状态,而且中继器从终端接入模块获得的所有有效信息都应该以数据报告的形式上报家庭网关。中继器对上应该及时分析家庭网关的下行控制指令,如中继查询、设备设定、设备隔离、设备激活、设备查询、设备清空和设备重启,并通过访问数据库或者下行访问终端接入模块的方式完成指令操作。中继器承担各类信息的采集及汇接工作,其是控制系统的核心部分。

下面各章节将会简要设计完整的控制系统框架,详细设计中继器各模块,包括模块功能设计、硬件设计、软件功能设计以及自主通讯协议的制定。 3.1 家庭网络的底层通信 3.1.1 家庭网络底层通信的选型

底层网络通信是实现数字家庭智能化的基础。实际上底层网络的选择的关键是底层网络标准的选择,在选择底层网络标准的基础上,所需解决关键问题是通信控制芯片的选择、通信介质的确定以及相关通讯协议的设计。通常在选择底层

13

上海交通大学硕士学位论文

网络时应该注意以下原则[9][10]:

(1) 可靠性原则

在底层网络中,传输的内容主要是系统控制指令和状态信息,这些信息是绝对不允许出现错误的。因此,底层网络各环节都要保证很高的可靠性。通常我们选择满足不同环境要求的接口标准、高可靠性的接口芯片以及满足抗干扰性的通信介质等。此外,对于采用RS485等传统的总线时,可以通过增加数据通信协议的抗干扰性来提高系统的可靠性。

(2) 通信速率和通信距离的要求

在底层网络中,不同的应用要求传输速率和距离各不相同,而且有时差异较大。因此,应根据实际需求出发,根据通信距离的要求综合考虑。例如在本控制系统中,由于数字家庭网络中对传感器的数据传输速率要求不高,但可靠性要求较高,所以选择了RS485总线的通信方式。该方式通信距离较长,速度适中,抗干扰性能较强。

(3) 先进性与实用性相结合的原则

当今技术都是追求先进性,从而避免技术的过度陈旧而被迅速淘汰。为了满足家庭中的先进性与美观性,本系统还采用了另外一种通信方式,即无线射频通信方式。该种通信方式较RS485通信距离还要长,故在本控制系统中,称之为远端接入,而RS485接入统称为近端接入(本文后面章节可能会直接使用近端远端接入的概念)。 3.1.2 家庭网络的拓扑结构

遵循适应性、通用性、经济性、标准化、易扩展的设计原则,经过查阅资料及调查分析,对国内外家庭网络的现状有了一定的了解,就网络构成来讲有两种方式:集中式和总线式。

集中式网络由一个主控制器和诸多的终端组成,形成主从关系。由主控制器对每个终端进行识别和控制。好处是控制指令简单易懂,多数指令可以由“0”和“1”来完成。缺点是主控制器必须与每一个终端(哪怕是最小的无源器件-门磁)连线,形成一个较大的星型网络,网络布线繁琐。且所有接口模块都须具备标准的通信接口和协议文本,较为复杂,成本也高。

14

上海交通大学硕士学位论文

总线型网络即在一条总线上挂接(并联)很多不同的终端,以既定的通讯协议进行相互之间的信息传递。优势在于组网灵活,只需要将总线围绕家庭转一周,所有终端可以在相应的任何位置并入总线,节省了相当大一部分的布线工程费用。缺点是每个终端必须有自己的控制器和接口,这无疑又增加了成本费用。

因此,建议家庭网络采用分布式、集散型方式,每个房间设一中继器收集本室所有需要纳入对象的信息并实现监控。然后再将家庭网关与各中继器连接起来,组成家庭网络见图3.1。

房间1 开关 中继器 传感器 房间n 开关 中继器 传感器 •••••• HGW 图3.1 家庭网络结构示意图Figure 3.1 Home network structure diagram

对于规模不大、纳入家庭网络对象数量不多的情况,也可以从简考虑,将所有的传感器、开关接入一只中继器来实现。甚至还可以将中继器和家庭网关融合起来。

3.2 中继器的概念

中继器是整个控制系统中最重要的部分,也是本文的核心设计任务。 中继器的主要任务:对上解决与家庭网关的信息交互;对下解决与纳入对象之间的信息交互,把“触手”延伸到家庭中任一个地方。中继器的组成及其在本控制系统中的位置如图3.2所示。

(1) 中继器与家庭网关之间的连接,这是一个主干网。

对于新建的小区,建议采用10M/100M以太网。对于现有的家居可以根据能够提供的传输媒质按需选择,比如采用电力线载波、双绞线等通信手段实行连接。

(2) 中继器与纳入对象的连接。

由于纳入对象的多样性,中继器必须有相适应的措施。为了设计方便,考虑

15

上海交通大学硕士学位论文

将中继器划分为中继控制和接口2个部分,接口模块实现众多纳入对象的接入;控制部分完成与家庭网关,以及与纳入对象间的信息交互等工作。

(1) 中继器的控制部分:当多个设备接入时,完成设备的检测、物理地址分配、信息采集、操作控制和信息的传输。

(2) 中继器的接入部分:当具有多样的物理接口以及电气特性的设备要连接到中继器的接入部时,能够将其转换为能被中继器所收容的设备,并完成设备的信息化。

另外,在本部分我们还需要考虑中继器的供电问题。在通常情况下中继器由市电220v经整流降压后获取直流12V,5V等提供给控制部分和接入部分。在供电异常情况下启用备用电池并停止向接入部分供电。

在接入设备中,包括传感器和开关:传感器,将一个能被测的非电量变换为电量的器件,提供给系统赖以进行处理和决策的原始信息,可以是开关量或连续量;开关,控制改变设备运行状态的器件,可以是开关量或连续量。

HGW Ethernet 中继控制模块 中继器 中继接口模块 RF 传感器设备 RS485 传感器设备

图3.2 中继器在系统中的位置

Figure 3.2 relay’s position in whole control system

接口模块与中继控制部分应紧连在一起,其间的连接应采用最简单的方法,比如串行数据总线。对于纳入对象数量大的情况,可以允许使用多个接口模块,中继控制应解决与多个接口模块相连的问题。这种设计考虑是为了将来便于融合各类接口模块而成为通用接口模块。

16

上海交通大学硕士学位论文

3.3中继器接入部分设计

中继接口模块是在中继器中为了解决纳入对象的多样性而设计的。 根据调查结果,对调研资料整理、归纳和仔细分析后发现:①传感器及开关等纳入对象的输入或输出特性可归纳为二种类型:开/关型和模拟型。开/关型的信息量是1bit;而模拟型是连续的电压或电流。②绝大多数模拟型的纳入对象为电压型;③模拟型对象采用的电压或电流值随产品不同而不同。

设想按输入、输出特性将纳入对象的类型归纳为3类:Ⅰ类为开关型、Ⅱ类为模拟电压型、Ⅲ类为模拟电流型。

针对以上情况提出了“信号调理”的思路,信号调理器对上行的、从需纳入服务对象送来的信号,按照纳入对象的类型,选择相应的调理器,先进行预处理,将不同类型的输入信号调理成定义的信号(比如:开关型为0/5V;模拟型为0∼5V),然后接入家庭网络;同样地,信号调理器对下行的定义的信号(0/5V或0∼5V)调理成服务对象所需的输入信号,去实现操作控制。经信号调理器的梳理,如果再选择具有A/D、D/A功能的单片机,就很容易处理了。然后通过中继控制接入家庭网络。

根据发展趋势,今后可以将以上3种信号调理器融合为一种通用接口。考虑到个性化或随意性,各对象与接口模块之间的信息传输,建议采用射频或远红外等无线连接方式。此外,目前在传感器领域,也出现了近程传感器和包括传输的远程传感器,就可以更方便地接入家庭网络了。对于已具有如LonWorks等通信资源的家庭,也可以用作为家庭网络的延伸。

鉴于文章篇幅,本节将不会对该模块的硬件电路实现作详细介绍,但会给出其总体功能框架设计,这样后面的重点章节即软件的具体实现会有更加清晰的思路。

3.3.1 接入模块功能设计 接入模块应具有以下功能: a) 获取感知对象信息; b)纳入对象接入或拆除检测;

17

上海交通大学硕士学位论文

c) 感知对象电源正常与否; d)执行控制(开关与可调器件)。 下面详细说明各功能:

z 获取感知对象信息:感知对象信息包括温度传感器、湿度传感器、门磁传 感器等器件所输出反映家庭环境的电信号。模块将获取的这些信息加以处理后上传给中继器。

z 纳入对象接入或拆除检测:这包括感知器件接入、正常工作时和脱离模块 时的检测。

z 感知对象电源正常与否:确定感知对象工作电压是否正常。

z 执行控制:包括可控开关和可调器件控制。这部分信息包括下行的控制指 令和上行开关和可调器件状态信息。 3.3.2 接入模块基本设计

家庭感知对象输出信息有两种:一是两态的开关量信息,二是连续模拟量信息。对开关信号处理目的是将不同幅值电压转换成标准电平送MCU处理再传至中继器,而对连续的模拟信息处理的目的是将模拟电流或电压转换成标准电压信号经A/D后送MCU处理再传至中继器。执行控制(开关和可调器件)有:对开关控制器或可调器件控制器发出指令,通过采集获取控制器件状态信息。其具体为:

1、控制信息包括1bit的指令进行开关控制操作和8bits的指令进行可制操作;

2、状态信息包括1bit的开关状态信息和8bits可调器件状态信息。 本文定义以下名称:

A) 接入开关量的电路称为Ⅰ类调理电路; B) 接入模拟电流的电路称为Ⅱ类调理电路; C) 接入模拟电压的电路称为Ⅲ类调理电路。 根据前面描述模块总体结构如下图3.3,其中包括:

18

上海交通大学硕士学位论文

图3.3 中继接入部分方框图 Figure 3.3 Diagram of relay’s access

A) Ⅰ类调理器:进行开关量信号调理供MCU接收; B) Ⅱ类调理器:进行模拟电流信号调理以供A/D采样; C) Ⅲ类调理器:进行模拟电压信号调理以供A/D采样; D) 开关控制器:对开关器件进行控制; E) 接口总线控制器:用以和中继控制部分通信; F) A/D&D/A:进行模数和数模转换; G) 器件电源检测电路:检测供电是否正常; H) 器件接入检测电路:检测器件是否接入。 3.3.3 接入设备的软件状态设计

用FSM(有限状态机模型)描述每个单独设备的状态变化如下图所示:

19

上海交通大学硕士学位论文

初始化设定 正常在线工作 设备异常 设备隔离(脱机) 设备发现 图3.4 设备状态分析 Figure 3.4 device state analyses

关于接入设备的基本状态设计如下:

1) 设备发现:设备连接后被检测发现或由上层软件添加的设备;

2) 初始化设定:设备基本参数获取并上报,在HGW完成对下行设备的确认或者由HGW完成对设备的参数配置后转入正常在线工作;

3) 正常在线工作:可完成参数设置,数据报告,控制相关设备操作; 4) 设备隔离(脱机):处于休眠状态,中继器不向HGW转发该设备的任何事件,也不向该设备传递HGW的操作指令;

5) 设备异常:因为某种原因,设备处于不正常的工作状态,如在一定时间内连接断开频繁,或电源告警,在此状态下,中继器仅向HGW转发该设备的处于异常,不转发该设备的其他任何事件,也不向该设备传递HGW的操作指令;

工作过程描述: 1、纳入对象的接入检测

每个纳入对象都带有接入检测信号,未接入是该信号保持低电平,当纳入对象接入时,该检测信号变为高电平并保持不变,知道纳入对象拆除。MCU定时查询检测信号接入的I/O口,可判断纳入对象是接入还是拆除。

2、纳入对象的初始化

系统上电开始运行,中继器要查询确定纳入对象的状态(是否接入)。若纳入对象已经接入,则将初始值返回给中继器,然后中继器返回该纳入对象的参数,如器件类型等。若纳入对象未接入,则返回未接入标志。中继器周期性的对各纳入对象查询,追加的纳入对象可按上面的程序进行初始化。

3、电量检测

20

上海交通大学硕士学位论文

初始化完成以后,接入模块与中继器开始通信。接入模块返回数据之前,必须先检测纳入对象的电量,若电量低,则采集的数据无效,需拆除纳入对象更换电池。

4、接入模块与中继器的通信

完成电量检测之后,中继器查询接入模块有没有数据发送,若有数据发送,则接入模块发送数据。发送的数据有两种。一种是传感器的状态,这属于周期性数据,由MCU定期采集。另一种是开关报警数据,这是突发数据,当开关类传感器报警时,用中断的方式报告给MCU。数据发送完成后,若中继器还需要控制该纳入对象,则发送相应的控制指令。对于开关,发送1bit的控制量;对于其他调光器件,则发送8bit的控制信号,该控制信号经D/A变化后进行控制。

3.4 中继器控制部分设计

本部分是整个控制系统的重点,它是连接HGW和传感器/开关之间的重要桥梁。控制部分所要求实现的功能,分为面向HGW一侧的功能,和面向传感器/开关一侧的功能。

面向HGW方面必须具有以下功能: ¾ 接受请求

从HGW接收指令,指令内容是对中继器的直接操作或对传感器和开关的间接操作(由中继控制器转发指令控制传感器和开关),并返回确认信息表示接受请求。

¾ 返回响应

对中继器直接操作的响应:接受HGW的指示,传输自身的信息。 对传感器和开关的间接操作:向下对传感器和开关执行HGW的指令,并返回指令操作后的结果,如设备的当前状态。

¾ 传送设备信息

1) 报告发现新的传感器、开关及信息; 2) 报告既存的传感器、开关移除;

3) 报告采集到的运行中的传感器、开关信息; 4) 报告既存的传感器、开关状态异常。

21

上海交通大学硕士学位论文

面向传感器/开关方面,必须有以下三种命令:

¾ Polling:主要负责巡视所有的接口,能够监视设备的加入和退出。中继器 必须具备以下两个方面监视功能:

1) 传感器、开关类电器设备和中继器连接的时候、应能检测出; 2) 传感器、开关类电器设备和中继器断开的时候、应能检测出。 ¾ Listen:监视温度等状态。

中继器可以从传感器收集数据。收集数据的时间有两种: 1) 从传感器定期收集信息,如温度类传感器。

2) 收集传感器发生突然事故时的信息,如门窗磁感应器。 中继设备收集数据、有以下两种方式:

1) 数字Input(开关量):收集1bit数据,如安防类报警传感器,开关传感 器或开关仅在发生变化时需要采集信息。

2) 模拟Input(连续量):收集8bit数据(bit数要检测),如照度传感器。 一般模拟连续变化的传感器会定时被采集信息。

¾ Push:对开关的操作。

中继器从HGW接收指令、按照指令对开关进行控制操作。 中继器控制操作开关有以下两种:

1) 数字 Output:接受1bit的指令进行开关控制操作

2) 模拟 Output:接受8bit的指令进行开关控制操作(bit数要检测)。 3.4.1 中继控制部分硬件框架

从前面2.2章节,我们知道控制部分是采用S3C2410处理器芯片,Linux2.6内核的操作系统来实现的。这里再次简单介绍下其硬件框架构成。

中继控制部分的硬件由网络接口控制器、核心处理器及其外围电路和总线控制器组成。中继器通过网络接口以以太网和HGW相连交互信息,通过总线接口以数据总线方式和接入部分交互信息。

1) 网络接口控制器:被核心处理器控制,在以太网上实现TCP/IP中的ARP、IP、ICMP、TCP等协议的功能,完成和HGW的数据帧收发。

2) 总线控制器:被核心处理器控制,和接入部分以数据总线方式通信,实

22

上海交通大学硕士学位论文

现信息的获取和传递。目前在传感器系统中流行的总线结构主要有RS232/RS485,USB,IIC,Micro-wire,SMBUS,IEEE1145,SPI,1-Wire等。

3) 核心处理器及其外围电路:

核心处理器的外围电路包括RAM、ROM、逻辑控制器、时钟电路、复位电路、调试接口和输出指示组成,框架如图3.5所示。

HGW

Network Interface Controller RAM ROM Logical Controller Bus Controller(RS232) Data Bus Core Processor (s3c2410) Clock Reset Debug USB Access Part

图3.5 中继控制部分硬件模块

Figure 3.5 hardware module of relay control part

在此基础上,我们还需要扩展2.1节所提到的功能模块。 3.4.2 中继控制部分软件设计 3.4.2.1 软件接口描述

1.与接入部分通信接口

标准总线:RS232/RS485,USB,IIC,Micro-wire,SMBUS,IEEE1145,SPI,1-Wire等。

接入部分的传输信息主要是传感器和开关的控制量及一些物理量的参数,信号频率相对较低,传输速率较低,但控制信息的错误不仅可能导致设备的非正常

23

上海交通大学硕士学位论文

工作,而且可能导致设备的损坏,因此对这类接口,主要解决的是可靠性。由3.1.1可知本系统的中继控制部分使用的通信接口为RS232/RS485。

2. 与HGW网络通信接口

以太网接口:10/100 Base-T Ethernet。

信息网络的信息传输较快,在网络协议的处理下错误较低,对这类接口,主要解决的是及时对大量数据的处理。在此基础上,我们还可以通过移植嵌入式网络服务器Boa,中继系统便可以响应IE浏览器发出的请求;完成响应交互的模块可以通过CGI交互语言来实现。 3.4.2.2 软件功能设计

系统在上电或复位后,Bootloader从ROM被引导读取,完成系统核心处理器及其周围硬件的初始化。在初始化结束后,Linux内核被调用。在系统启动完毕后,自动执行监控主程序以及相关服务器程序,实现系统对设备的检测、数据采集和控制。

系统上电复位系统启动监控主程序N复位Y 图3.6 中继器软件运行框图 Figure 3.6 software process flow

一、系统启动

系统启动代码完成系统基本硬件的初始化,主要内容包括:关看门狗定时器,关中断,初始化核心处理器,对于某些外部接口,需要设置相关的寄存器,确定刷新频率和总线接口,启动完毕允许中断,调用主程序代码入口,开始监控主程

24

上海交通大学硕士学位论文

序及相关服务器程序的执行。

二、监控主程序 1.监控主程序的基本组成

1)初始化管理

初始化本系统软件中所需的外设接口,这里主要是包括初始化网络接口和总线接口(RS232),设置正确的通信参数。

2)通信控制

按照和中继接入部分与下行设备的通信协议实现总线数据通信,即传输指令给中继接入部分,或者接收从中继接入传过来的数据信息;按照和HGW通信协议实现网络数据通信,即传输数据信息给HGW,或者接收从HGW传过来的指令。

3)信息处理

按照通信协议分析并处理接收到的数据或指令,然后转发至设备管理模块或通信接口,并能输出指示中继器和下行接入设备的工作状态。

初始化管理 通信控制 接口参数初始化 网络数据通信 总线数据通信 监控主程序 信息处理 数据处理 数据转发 输出指示 设备管理 设备信息管理 设备状态控制 图3.7 监控程序组成 Figure 3.7 Monitor program module

4)设备管理

根据信息处理模块获得的部分信息更新中继器的设备信息表,设备信息表中

25

上海交通大学硕士学位论文

记录中继器及末端传感器和开关设备的有用信息。控制设备工作状态转移变化。

监控程序的各个模块的详细功能将在下面详细设计。 2、监控主程序各部分的功能详细设计 1)初始化管理 设计目的:

在中继器启动后开始初始化过程,只有当中继器初始化结束后才能进入在线工作运行阶段。

功能设计描述:

接口参数初始化:初始化核心处理器端口和周围外设接口,包括初始化网络接口和总线接口,设置接口参数,确定数据收发方式。

2)通信控制 设计目的:

网络数据通信—实现与HGW之间的信息交互,采用TCP/IP协议实现通信。 总线数据通信—实现与中继器接入部分的信息交互,采用数据总线方式通信。

功能设计描述: ¾ 网络数据通信

z 能够对特定HGW通信端口进行侦听,服务器接受一个客户端请求之后 创建一个线程实例来处理请求,并把校验后的数据转交给信息处理模块。

z 能够向HGW发送来自信息处理模块的数据或指令。

z 按照和HGW的通信协议实现数据收发,包括实现发送接收数据和指令 的格式,重传机制,输入输出缓存,指令或数据出错处理等等。 ¾ 总线数据通信

z 能够接收relay接入部分发送的数据。

z 能够向relay接入部分发送来自信息处理模块的数据或指令。

z 按照和relay接入部分的通信协议实现数据收发,包括实现发送接收数据 和指令的格式,重传机制,输入输出缓存,指令或数据出错处理等等。

3)信息处理 设计目的:

26

上海交通大学硕士学位论文

信息处理是监控主程序的核心部分,它处理从各模块获得的信息,分析提取有效内容,实现信息在HGW和relay接入部分之间的交互。

功能设计描述: ¾ 数据处理

z 能够接收从通信控制模块接收到的数据;

z 能够分析从通信控制模块接收到的数据,并进行处理,发送给设备管理 模块;

z 能够接收设备管理模块发送的消息,并进行处理,发送给数据转发模块。 数据转发:

z 能够接收数据处理模块发送的消息,确定转发的接口,并发送给通信接 口。 ¾ 输出指示

z 能够指示relay工作状态; z 能够指示接入设备的工作状态。 4)设备管理

设计目的:有效管理设备信息,确定设备工作状态。 功能设计描述: ¾ 设备信息管理

z 能够接收信息处理模块的数据,检测发现或移除设备,并完成对设备的 基本配置。

z 能够接收信息处理模块的数据,更新relay设备信息表中的设备信息。 ¾ 设备状态控制

z 能够接收信息处理模块的数据,控制设备的工作状态转移,发送消息给 信息处理模块。 3.5 家庭网关

家庭网关是家庭网络的总控制,通过家庭网关,用户可以和所有的纳入对象进行快速沟通。同时家庭网关又是一个媒介平台,通过该平台实现与家庭以外的世界沟通信息,满足远程控制、监测和交换信息的需求。

27

上海交通大学硕士学位论文

家庭网关具有以下的主要功能: 1) 智能控制功能

实现对纳入对象的轻松控制,包括集中控制、灯光情景控制、组合控制、条件控制、远程控制等。

2) 安防监控功能

安防监控的主要对象为家庭安全,主要包括可视对讲、安防报警、远程报警和紧急求助。

3) 信息服务功能

信息服务包括信息浏览(小区服务器提供相关信息)、语音留言、远程抄表和便民服务(小区服务器提供相关信息)等。

输入输出为模拟量的传感器和开关的电气特性没有统一的标准,无法直接成为家庭信息网络中的设备成员,必须通过中继器完成设备的信息化并接入HGW,成为家庭网络中的可见、可测、可控设备,并通过一定的服务关联实现智能化的功能。中继器通过10M/100Mb以太网和HGW互连在家庭网络总线上。中继器分离了家庭网络中的信息网络(HGW)和控制网络(传感器和开关),并实现了两者之间的数据透明传输。

3.6 传感器设备的信息结构描述

这里的所谓信息结构是指如何描述一个设备,在HGW和中继器之间他们是怎样描述一个设备的。在后续的设计中,信息结构将会直接反映在通信协议的格式中。

描述传感器的信息结构中有静态的部分和动态的部分。其中,静态信息主要包括设备的标识ID、设备类型、子系统类型、控制类型等。

动态信息结构如下表3.1所示:

表 3.1 动态信息,描述设备现在的状态信息

字段名

设备当前状态

设备前次状态

数值 1Byte 1Byte 含义

开关量:0表示OFF,1表示ON 连续量:采样值。 同上

28

上海交通大学硕士学位论文

静态信息结构如下表3.2所示:

表3.2 静态信息,描述该设备所需要的信息

字段名 数值 含义 设备ID 1Byte 中继器通过接口检测感知存在的设

备,分配给设备的局部物理地址。Relay最多允许连接255个设备,考虑设备ID可详细划分。

设备类型 1Byte 1表示1比特传感器/开关量

2表示多比特传感器开关量 3表示集成子系统 255表示未知设备类型 其它作保留,可自定义。

所属子系统1Byte 0表示安防系统 类型 1表示灯光控制系统

2表示智能家电 3表示数字三表

255表示未知子系统类型。 其它作保留,可自定义。

设备最大精1Byte 1-8,精度为1到8比特 度

控制类型 1Byte 1表示周期传送

2表示突发传送

255表示控制类型未知

总线类型 1Byte 表示设备属于何种总线 总线地址 1Byte 表示设备在总线上的地址

3.7 自主通讯协议

为了提高控制系统的实时性与可靠性,本系统设计了自主通讯协议。其主要包括应用层、数据链路层和物理层通信协议。 3.7.1 应用层协议设计

应用层协议主要包括中继控制部分与接入部分通信协议,中继控制部分与

HGW通信协议。由于二者很相似,这里只介绍中继控制部分与接入部分通信协议。

协议设计要点:

1) 协议面向对象为Relay控制部分和由数据总线接入Relay的Relay接入部

29

上海交通大学硕士学位论文

分之间,主从关系为Relay控制部分作为主机,Relay接入部分作为从机。

2) 接入部分传输的是低速数据,数据帧结构应该简单,长度较短提高响应速度,这里设置最大数据帧长度为255字节。

下行协议—Relay向接入部分传输的数据帧格式。其中,各个字段的具体长度及其含义如表3.3所示。

格式:帧头+中继器ID+帧长度+基本命令字+帧数据段+校验+帧尾 通信协议帧结构定义如表3.3所示:

表3.3 通信协议帧结构定义

字段名称 数值

帧头 1Byte,固定值中继器ID1Byte,1-255 帧长度 1Byte 基本命令1Byte, 字

帧数据段 N Byte, 校验 1Byte 帧尾 1Byte,固定值基本命令数值 字

设备请求1Byte,固定值应答

设备查询 1Byte,固定值设备设定 1Byte,固定值

含义

表示数据帧的起始。 唯一标识中继器。

从命令字至帧尾的字节长度。

数据帧的命令代码:更为复杂的命令嵌入在帧数据段中。 数据帧的具体内容。

从帧头至帧数据段结束按字节异或,以证实数据帧的完整性。 表示数据帧的结束。 含义

请求设备应答。

查询设备,获取其当前工作状态,基本参数,判断设备的健康状况。 追加设定发现设备的基本参数,如设备类型、所属子系统、设备最大精度和控制类型。

操作设备,获取相关的采集数据或实现对设备的控制,或者转发集成子系统内部数据。

使接入部分设备复位重启。

设备操作 1Byte,固定值

设备重启 1Byte,固定值¾ 设备请求应答+帧数据段

帧数据段格式:无内容

接入部分设备回应数据帧格式:

有数据发送:ACK+中继器ID+设备请求应答+有数据发送+校验+帧尾 无数据发送:ACK+中继器ID+设备请求应答+无数据发送+校验+帧尾 NAK:NAK+中继器ID+设备请求应答+校验+帧尾

30

上海交通大学硕士学位论文

¾ 设备查询+帧数据段

帧数据段格式:设备ID

接入部分若存在对应设备ID,则该设备回应数据帧格式:

ACK帧:ACK+中继器ID+设备查询+设备ID+设备类型+所属子系统类型+设备最大精度+控制类型+校验+帧尾

NAK帧:NAK+中继器ID+设备查询+设备ID+校验+帧尾 ¾ 设备设定+帧数据段

帧数据段格式:设备ID+设备类型+所属子系统类型+设备最大精度+控制类型 对设备基本参数设定,包括分配设备ID等,设备回应数据帧格式: ACK帧:ACK+中继器ID+设备设定+设备ID+校验+帧尾 NAK帧:NAK+中继器ID+设备设定+设备ID+校验+帧尾 ¾ 设备操作+帧数据段

帧数据段格式:设备ID+操作指令长度+操作指令 接入部分若存在对应设备ID,则该设备回应数据帧格式:

ACK帧:ACK+中继器ID+设备操作+设备事件类型+设备ID+设备事件长度+设备事件内容+校验+帧尾

NAK帧:NAK+中继器ID+设备操作+设备ID+校验+帧尾

表3.4 设备事件类型

字段名 数值 含义

设备事件类1Byte 1表示设备事件报告,报告设备的传型 感器测量数据或开关状态

2表示集成子系统数据 3表示设备异常

其它作保留,可自定义。 设备的相关状态基本命令字如下表3.5所示:

表3.5 上行通信基本命令字

基本命令字 数值

设备发现 1Byte,固定值 设备移除 1Byte,固定值 设备异常 1Byte,固定值 设备数据报告 1Byte,固定值 ¾ 设备重启+帧数据段 帧数据段格式:设备ID

含义

接入部分设备被发现。 接入部分设备被移除。 接入部分设备异常。

报告设备的传感器测量数据或状态。

31

上海交通大学硕士学位论文

接入部分若存在对应设备ID,则该设备回应数据帧格式: ACK帧:ACK+中继器ID+设备重启+设备ID+校验+帧尾 NAK帧:NAK+中继器ID+设备重启+设备ID+校验+帧尾 上行协议—接入部分向Relay传输的数据帧格式 ¾ 设备发现+帧数据段

帧数据段格式:设备ID+设备类型+所属子系统类型+设备最大精度+控制类型 因为是新发现设备,设备ID为保留的未分配ID号255 relay回应数据帧格式:

ACK帧:ACK+中继器ID+设备发现+设备ID+校验+帧尾,relay在回应中把分配的设备ID号传给设备。

NAK帧:NAK+中继器ID+设备发现+设备ID+校验+帧尾 ¾ 设备移除+帧数据段 帧数据段格式:设备ID relay回应数据帧格式:

ACK帧:ACK+中继器ID+设备移除+设备ID+校验+帧尾 NAK帧:NAK+中继器ID+设备移除+设备ID+校验+帧尾 ¾ 设备数据报告+帧数据段

帧数据段格式:设备ID+数据长度+数据内容 relay回应数据帧格式:

ACK帧:ACK+中继器ID+设备数据报告+设备ID+校验+帧尾 NAK帧:NAK+中继器ID+设备数据报告+设备ID+校验+帧尾

在上面的协议中和设备有关的字段参见3.6节所述传感器和开关的信息结构。 3.7.2 数据链路层协议

数据链路层分为逻辑链路控制层(LLC)和媒体访问控制层(MAC)。 LLC层实现如下功能:带应答数据的请求传输服务;提供两种报文分组的传输错误检测手段:校验和CRC;采用ARQ协议对出错的数据帧进行自动重传纠错[11]。

MAC层有两大体系:令牌环/令牌总线和载波监听/冲突检测(CSMA/CD)。

32

上海交通大学硕士学位论文

CSMA/CD是基于竞争原理,各节点在发送数据前都要不断探测信道状况,一旦信道空闲,立即发送数据,适合紧急式的发送。令牌环通过令牌的传递,来控制节点对网络的访问,适合固定周期的报文。在数字家庭网络中,既有需要定期发送报文,检查节点的网络状况,又有紧急式的发送情况如烟雾传感器探测到烟雾浓度过大,需要紧急报警。因此,在本控制系统中,单纯的使用令牌总线或者载波监听/冲突检测方法都不能很好地解决实时性可靠性的通信。所以,这里采用了一种二者结合的方式:平时节点采用令牌环的方式,各智能节点等待中继轮询信息,当设备ID和自己对应时,该节点向中继控制部分发送数据,并以此方式来通知本设备节点的网络通信状况;当某节点有紧急信息需要上报时,该节点采用载波监听进行数据发送。同时持有令牌的节点,检测到数据冲突时,停止数据的发送。有报警信息的节点进行数据发送,一旦紧急信息发送完毕,该节点在网络中发送信息发送完毕信号,恢复到令牌环方式。当每一个时刻有多个节点需要报告紧急信息时,这些节点采用P-持续CSMA方法发送紧急信息。

在p-持续CSMA方式中,将时间分成一些时隙,时隙的长度一般等于最大传播时延、p-持续CSMA方式的操作一般如下[11]:

(1)如果侦听到信道空闲,则它以概率p发出一个待发的数据帧,而以概率(1-p)延迟一个时隙,然后在侦听信道。如果此时信道忙,它就等到信道空闲并重复这一步骤。

(2)如果在下一个时隙中侦听到信道空,则重复步骤(1)。

本控制系统物理层通信采用了RS485与RF两种信道,其中每种信道采用的通信协议如下:

¾ RS485总线采用的通信协议是令牌环/令牌总线方式;

¾ 无线RF信道采用的是令牌环/令牌总线加CSMA 方式,其可以实现紧急情

况的立即上报。 3.7.3 物理层设计

从3.1.1节可以知道,本控制系统底层物理通信采用的是RS485总线与无线RF信道。这两种通信方式中RS485具有传输距离较远,抗干扰性较强的特点;RF信道的选择是为了满足家庭的二次装修问题。由于家居布线很难一次完成,

33

上海交通大学硕士学位论文

往往需要根据用户在不同时期提出的不同要求,再次重新布线。另外,由于临时性的通讯要求,使得传统布线为力。因此,无线信道在数字家庭网络中有着独特的优势。在本控制系统的设计中,紧跟先进技术理念,选择了支持RF无线通信方式。在此物理层通信的基础上,配合前面的链路层和应用层协议,可以较好地提高整个控制系统的实时性,具有较好的应用前景。

3.8 本章总结

本章是本文的重点部分,详细介绍了传感器控制系统的设计流程,并且详细介绍了控制系统中的接口模块、中继控制模块、虚拟家庭网关模块的设计思路;本章还设计了控制系统的总体软件框架,包括软件模块功能设计,为下一章的详细实现打下了扎实的基础;本章的最后还详细设计了本控制系统中的自主通讯协议,包括链路层协议设计,以及应用层各个接口模块之间通信的应用协议,包括的帧的结构、基本命令字的定义等。

34

上海交通大学硕士学位论文

第四章 系统软件的具体实现

在前一章的基础上,可以将整个控制系统的软件功能模块划分如下:

信息接入部分 总线 数据交互 嵌入式 数据库 数据分析 处理 网络数据交互 网络服务器 远程控制端

图4.1 系统功能模块图

Figure 4.1 function module diagram of the control software system

其中数据信息交互、分析处理、数据库、嵌入式服务器都是属于中继器控制模块的,而信息接入部分是属于中继器接入模块。中继器在家庭网络树上处于枝干地位,起到了管理本房间设备以及在家庭网关和终端接入模块之间上传下达的作用,是本系统的关键部分之一,本章也将重点介绍这部分软件的实现。下面各章节将详细介绍各模块的软件具体实现。

4.1 总线数据交互模块

作为信息控制器,需要留出接口来接收下行传输上来的数据,如红外接入、蓝牙接入、串行口接入。这里的信息交互模块不仅要正确接收数据帧,还要提取出数据段以便下一步的分析。另外,本模块还封装了所有发送接收直接操作传感器设备命令的函数,以便在远程控制模块那里直接调用。为了保证单片机和嵌入式系统之间数据的正确交互,软件实现过程中需要使用3.7节所制定的协议。在本系统中,下行数据指的是传感器信息采集接入,参数控制信息,以及各种设备系统的状态信息等。

总线数据交互部分编程主要是涉及到Linux下RS232的相关编程。在嵌入式Linux应用系统中,如果要利用串口作为通信接口,则需要编写串口通信程序。本节将主要介绍编写串口通信程序的相关知识,在介绍编写串口应用程序之前,

35

上海交通大学硕士学位论文

先介绍串口驱动程序的编写。

4.1.1 Linux下串口驱动程序的编写

设备驱动程序是操作系统内核与机器硬件之间的接口,设备驱动程序为应用程序屏蔽了硬件的细节,这样硬件对应用程序来说是透明的。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像普通文件一样对硬件设备进行操作。设备驱动程序完成以下功能:

1) 对硬件设备进行初始化和释放;

2) 把数据从内核传送到硬件,或从硬件读取数据;

3) 读取应用程序传送给设备文件的数据或回送应用程序请求的数据; 4) 检测或处理设备出现的错误和异常。

Linux系统的设备分为字符设备、块设备和网络设备。字符设备是指存取时没有缓存设备,它不使用系统缓冲,对设备的操作直接反映到硬件上。块设备的读写都有缓存来支持,并且块设备必须能够支持随机存取,字符设备没有这个要求。典型的字符设备包括鼠标、键盘、串行口等,块设备主要包括硬盘软盘设备、CD-ROM等。

用户进程通过设备文件实现与硬件的交流。每个设备文件都有其文件属性,表示是字符设备还是块设备。另外每个文件都有两个设备号:第一个是主设备号,表示驱动程序;第二个是从设备号,表示使用同一个设备驱动程序的不同的硬件设备,比如两个软盘,就可以使用从次设备号来区分他们。设备文件的主设备号必须与设备驱动程序登记时申请的主设备号一致,否则用户进程将无法访问到设备驱动程序。

设备驱动程序可以分为3个主要组成部分[12]: 1) 自动配置和初始化子程序。

用于负责检测所要驱动程序的硬件设备是否存在和是否能正常工作。如果该设备正常,则对这个设备及其相关的设备驱动程序需要的软件状态进行初始化,如设置寄存器的值,初始化驱动程序用到的数据结构。这部分程序仅在初始化的时候被调用一次。

2) 服务与I/O请求的子程序。

36

上海交通大学硕士学位论文

调用服务于I/O请求的子程序是由于系统调用的结果,如read、write调用 这部分程序在执行的时候,系统仍认为是和进行调用的进程属于同一个进程,只 是由用户态变成核心态,他们的运行环境和进行此系统调用的用户程序一样,因 此可以在其中调用sleep()等与进程运行有关的函数。

3) 中断服务子程序。

在Linux系统中,并不是直接从中断向量表中调用设备驱动程序和中断服务子程序,而是由Linux系统来接收硬件中断,在由系统调用中断服务子程序。中断可以发生在任何一个进程运行的时候,因此在中断服务程序被调用的时候,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境相关的函数。因为设备驱动程序一般支持同一类的若干设备,所以在系统调用中断服务子程序的时候,都带有一个或多个参数,以惟一标识请求服务的设备。在系统内部,I/O设备的存取通过一组固定的入口点来进行,这组入口点是由每个设备的设备驱动程序提供的。一般来说,字符型设备提供如下几个入口点[12]:

1) open入口点

open入口点用于打开设备准备I/O操作。对设备文件进行打开操作,都会调用设备的open入口点。Open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志表示设备处于忙状态。

2) close入口点

close入口点用于关闭一个设备。当最后一次使用设备终结后,调用close子程序。独占设备必须标记设备可以再次使用。

3) read入口点

read入口点用于从设备上读取数据。对于有缓冲区的I/O操作,一般是从缓冲区里读取数据。对设备文件进行读操作时,将调用read子程序。

4) write入口点

write入口点用于往设备上写数据。对于有缓冲区的I/O操作,一般是将数据写入缓冲区里。对字符设备文件进行写操作将调用write子程序。

5) ioctl入口点

ioctl入口点用于执行读、写之外的操作。

37

上海交通大学硕士学位论文

6) select入口点

select入口点用于检查设备,查看数据是否可读或者查看设备是否可用于写数据。Select系统调用在检查与设备文件相关的文件描述符时使用select入口点。如果设备驱动程序没有提供上述入口点的一个,系统会用默认的子程序来代替。

Linux下串口便是属于字符型设备,其驱动程序最小型也需要实现上面的基本入口函数。下一节将会单独介绍在编写驱动程序中,涉及到的难点与重点即关于内核态的内存分配与硬件内存的访问,此部分将会严重影响到驱动程序的性能以及程序的可扩展性。

4.1.2 Linux下对硬件内存的访问

现在,硬件对驱动程序的要求越来越苛刻,也就是要求有高质量的驱动程序使得硬件发挥其最大的功能,这就要求我们对驱动程序中内存的操作做详细的研究。另外在中继控制部分软件编写模块涉及到Linux系统级的编程,而且内存在影响硬件驱动程序性能上有着至关重要的作用。下面将详细分析、研究这方面的内容。

在分析研究内存管理、操作时候,必须理解这样几个概念:物理地址、内核逻辑地址、内核虚拟地址、页帧数。

(1) 物理地址:在处理器与系统内存之间使用的内存概念;

(2) 内核逻辑地址:其组成了内核的常规内存部分,它映射了部分或者全部的物理内存,它与物理内存之间只是存在一个固定的偏移量,所以很多材料上就视其为物理地址;

(3) 在内核态虚拟内存系统中,处于内核逻辑地址之上的一段内存空间,其与逻辑地址的区别在于该段内存不一定有直接的物理内存与其映射;

(4) 页帧数:一般内存地址的表示都是由页号与页内的偏移量来表示,地址偏移量处于低位,而页号处在高位,若忽略偏移量,将除掉偏移量的剩余位右移,则称该结果为页帧数。

在32位系统中,内建指针长度为4个字节,故其最大寻址空间为4G。在通常情况下,内核将这4G空间分为用户空间与内核空间。而内核空间又通常分为上面所述的内核逻辑分配区(内核逻辑地址区域)、虚拟内存分配区(内核虚拟

38

上海交通大学硕士学位论文

地址区域)、高端页面映射区、专用页面映射区、系统保留映射区。其中高端页面映射区主要是实现对高端内存的映射访问,由于高端内存在内核逻辑区没有直接映射,而内核虚拟系统对系统内存的访问都需要转换为虚拟地址来实现,这就是高端内存映射区的目的。当然我们可以通过地址扩展来实现32位系统在大于4G 的地址空间实现寻址,这也是以系统性能为代价的。如当系统物理内存大于4G时,我们须使用CPU的扩展分页机制(PAE)模式来访问超过4G部分的物理内存。在此模式下,程序线性地址到物理地址采用3级页表映射机制[13]。 4.1.2.1 驱动程序中内存的分配

不管是字符型驱动程序还是块设备驱动程序以及网络设备驱动程序,大部分设备都涉及到数据的采集、转发过程,还有对硬件IO口、硬件寄存器的操作,这些都需要内核态虚拟内存系统的知识。针对驱动程序的不同需求,可以采用不同的内存操作接口。

(1) kmalloc()与__get_free_pages()

kmalloc()使用于小内存量的分配(通常是小于128K的内存),其实现是基于slab机制,并且得到的虚拟地址处于内核逻辑地址区。由于内核逻辑地址区与物理地址是线性对应的,并且kmalloc()得到的地址在物理内存里也是连续的,所以经常称kmalloc()分配的是物理地址。__get_free_pages()用于分配较大块内存的函数,其是面向页的分配技术,相对与kamlloc()来说,它可以有效减少内存碎片的产生。

(2) 在2.6内核中USB驱动程序采用了一种新的内存分配方式,先是调用函数kmem_cache_create(),然后调用函数kmem_cache_alloc()。这种内存分配方式称为后备高速内存缓存,先由kmem_cache_create()来分配缓存对象,然后在该缓存对象中使用函数kmem_cache_alloc()分配内存对象。这种内存分配方式适用于驱动程序中多次分配大小相同的内存块。由于分配的内存对象处于内存缓存对象中,并且内存对象在内存缓存池中的大小是相同的,所以它们的排列就非常的密集,有效地减少了内存碎片的产生[13]。

39

上海交通大学硕士学位论文

4.1.2.2 硬件I/O内存的操作

在硬件层,内存区域与I/O区域没有概念上的区别:他们都是通过向地址总线和控制总线发送电平信号进行访问,再通过数据总线读写数据。X86系列的处理器还为I/O端口的读写提供了的线路,并且使用特殊的CPU指令进行访问。I/O寄存器与内存十分相似,但是在访问I/O寄存器的时候容易产生边际效应。

1、I/O端口的访问

所有的I/O端口的分配情况都可以从/proc/ioports中得到,使用I/O端口的步骤为:注册I/O端口,验证I/O端口是否可用,操作I/O端口,释放I/O端口,相应的函数形式分别为:request_region()、check_region()、inb()、inw()、inl()、 outb()、outw()、outl()等。

2、I/O内存的访问

和硬件设备通信的另外一种方式即是I/O内存了,是指通过使用映射到内存的寄存器或设备内存。使用I/O内存之前必须要先分配内存,若系统架构是通过页表形式访问内存的,还需要先进行映射的操作让I/O内存对内核而言是可见的,然后才可以操作I/O内存空间。这个映射的操作是通过ioremap()函数来操作的,ioremap()操作并没有分配新的内存的空间,而是返回一个很特殊的虚拟地址空间,通过这个虚拟地址空间我们可以访问实际的物理地址空间,这个虚拟地址空间最后需要通过iounmap()来释放。对于ioremap()返回的地址空间可以使用内核提供的接口访问函数如ioread(),iowrite()等来操作,而不应该直接对其地址指针进行操作,这样将会有更好的移植性。

介绍完串口驱动程序的相关编写后,下一节将会介绍串口的用户态应用编程。 4.1.3 Linux下串口的应用编程

同所有的嵌入式设备一样,嵌入式Linux是通过设备文件访问串口的,在

访问具体的串行端口时,只需打开相应的设备文件即可。在嵌入式Linux系统中,串行口Port1和Port2分别对应的设备文件为:/dev/ttyS0和/dev/ttyS1,这是常用的映射方式,当然也可以采用不同的映射方式,如将Port映射为/dev/tts/0等。下面将介绍串口的详细使用过程。

40

上海交通大学硕士学位论文

在使用串口之前,需要对串口进行一系列的属性设置,这些属性包括数据传输的波特率、传输的数据格式、是否有奇偶校验位、流控制方式等。

若要设置串口属性,首先应在程序中包含termios.h的头文件,这个头文件包

含终端控制结构和控制函数。在termios.h中有一个非常重要的数据结构struct termios,这个数据结构包含了所有的串口参数,设置串口属性就是对这个数据结构赋值。在termios.h中还定义了两个重要的函数tcgetattr()和tcsetattr(),它们分别用于获取和设置串口属性。他们的函数调用形式为tcgetattr(fdcom,&termios_old),tcsetattr(fdcom,TCSANOW,&termios_new)。其中fdcom为串口的文件描述符,termios_old和termios_new是struct termios形式的数据结构,用于存放获得的串口属性和欲设置的串口属性。TCSANOW表示设置立即生效,无须等到数据发送或接收结束[12]。

1)设置波特率

波特率是串口的通信速率,有输入和输出两个方向。设置波特率可以使用cfsetispeed(&termios_new,baudrate)和cfsetospeed(termios_new,baudrate)两个函数,参数baudrate是波特率的宏定义值。这两个函数分别设置入口端和出口端的速率,它们也是通过改变struct termios的值实现的。通信两端的通信速率必须设置为一致才能通信。

2)设置流控

流控的控制方式包括不使用流控、使用硬件流控、使用软件流控三种方式。具体实现是通过与c_cflag和c_iflag两个成员变量进行逻辑操作实现的。

若不使用流控:termios_new.c_cflag&=~CRTSCTS; 使用硬件流控:termios_new.c_cflag |=CRTSCTS;

使用软件流控:termios_new.c_iflag |=IXON|IXOFF|IXANY。 3)设置奇偶校验方式。

奇偶校验分为无校验、奇校验、偶校验三种方式,也是通过设置c_cflag标志位实现的。具体实现方法为:

无校验位: termios_new.c_cflag &=~PARENB; 奇校验位: termios_new.c_cflag |=PARENB; termios_new.c_cflag &=PARODD;

41

上海交通大学硕士学位论文

偶校验位: termios_new.c_cflag |=PARENB; termios_new.c_cflag &=~PARODD。

以上是对串口的一些常用属性设置。当串口属性都设置正确后,我们便可以正常访问串口资源了,具体过程如下:

1) 打开串口

类似普通文件一样,打开串口就是使用open()系统调用。当然,执行打开操作的用户必须有相应的权限。打开函数类似于:

int fd = open(“dev/ttyS0”,O_RDWR|O_NOCTTY|O_NDELAY);

其中的参数具体含义为:O_RDWR:可读可写;O_NOCTTY:告诉系统,该程序不想成为此端口的控制终端。如果应用程序不强调这一点,那么任何输入都会影响程序的运行,所以这个参数的指定是非常重要的。O_NDELAY:表明该程序不关注DCD信号所处的状态,即不管对端设备是在运行还是在挂起。如果不设置该标志,则程序会被设置为睡眠状态,直到DCD信号为低为止。

2) 关闭端口

关闭端口使用close()系统调用即可。 3) 向串口写数据

使用write()函数向串口写入数据,write()系统调用若成功,则返回发送的字节数,否则返回-1。

4) 从串口读取数据

使用read()函数从串口读取数据,read()将返回实际读取的数据字节数。串口打开时的配置参数将会影响到这里的数据读写,如果串口在打开时没有加参数O_NONBLOCK,则read()调用在串口缓存区没有数据的情况下进行阻塞,处于等待状态,直到有数据的到来;如果添加了参数O_NONBLOCK,则read()调用会立即返回,不会处于等待状态。

串口读写数据在本系统的软件实现中非常重要,因为多个模块都需要调用到次函数。为了改善数据读写程序的功能,这里使用了select()系统调用。该系统调用支持多路输入输出,即select()允许一个进程监视一个或者多个文件描述词,等待直到它们中的一个或者多个对某类I/O操作变得可用。当能够执行相应的操作而不会阻塞时,一个文件描述词被认为可用。当用户层应用程序调用select()

42

上海交通大学硕士学位论文

时,底层驱动程序调用poll(),即调用文件描述符fd对应的struct file类型变量的struct file_operations *f_op的poll函数。poll指向的函数返回当前可否读写的信息:

1) 如果当前可读写,返回读写信息;

2) 如果当前不可读写,则阻塞进程,并等待驱动程序唤醒,重新调用poll函数,或超时返回;

==

3) 驱动需要实现poll函数。

关于串口驱动的框架4.1节已经作了相关介绍。当驱动发现有数据可以读写时,通知核心层,核心层重新调用poll指向的函数查询信息。

鉴于以上特点,read()函数实现如下所示,这里面使用了select()调用加超时机制调用,这二者可以有效确保串口资源的正常使用[12]。

int dataRecv(int fdcom, char *data, int datalen, int baudrate) {

int len, fs_sel;

fd_set fs_read;

struct timeval tv_timeout;

FD_ZERO(&fs_read); FD_SET(fdcom, &fs_read);

tv_timeout.tv_sec TIMEOUT_SEC(datalen, baudrate); tv_timeout.tv_usec TIMEOUT_USEC;

fs_sel = select(fdcom+1, &fs_read, NULL, NULL, &tv_timeout);

if(fs_sel){

len = read(fdcom, data, datalen);

return len; } else{ return -1; } return len; }

43

上海交通大学硕士学位论文

至此,系统软件中总线数据接口模块(RS232)相关编程的要点已经介绍完毕。该部分程序的健壮性将会直接影响到整个系统的性能,因为不同的模块需要多次调用到此模块的相关函数。

4.1.4 系统总线接口部分(RS232)软件流程

串口端应用程序的流程图如4.2所示,其中数据帧的校验与后期处理将会在下一节中详细介绍。

Startrelay发送询问帧给总线上的设备在一定时间内设备应答?Y设备回应N连续超时>3次?YN无数据发送有数据发送轮询总线上的下一个设备发送数据给设备接收设备的数据产生设备超时消息Nrelay发送完?YN设备发送完?Y数据预处理

图4.2 总线接口数据收发

Figure 4.2 data communication of bus interface

中继接入部分以数据总线方式和中继控制部分通信,主从关系为中继控制部分作为主机,中继接入部分作为从机。考虑到接入部分数据的重要性,顺序上先接收设备的数据,然后再对数据作进一步的处理。

44

上海交通大学硕士学位论文

4.2 网络数据交互模块

Relay和HGW通过IP-Based以太网连接,使用socket通信实现数据收发。在接收HGW发送的数据时,Relay作为服务器端,在发送数据给HGW时,Relay作为客户端。

Relay作为服务器端的数据接收:此程序实现对与HGW通信端口的侦听,服务器接受一个客户端请求之后创建一个线程实例来处理请求。异常处理包括超时处理、出错处理,通常是网络连接不正常造成的。在多次网络连接异常后,Relay将停止网络接口通信,即停止向HGW发送设备信息,并重新开始初始化管理过程中的网络地址分配过程,直到网络连接正常。

服务器初始化设置ServerSocket等待连接有连接请求?Y创建分线程,传递接收到的Socket给分线程出现ExceptionException处理接收Socket发送的数据,并将相关数据传递给接口预处理模块分线程结束,关闭套接字和I/O流

图4.3 Relay作为服务器端的数据接收 Figure 4.3 data communication when relay is server

Relay作为客户端的数据发送程序流程较简单,这里不再详细介绍其流程。

45

上海交通大学硕士学位论文

4.3 数据信息处理模块

4.3.1总线数据处理流程

数据处理模块会接收到来自总线接口、网络接口或设备管理模块的数据。当从发送端接收到数据帧信息后,数据处理的第一个步骤便是校验数据的可靠性,其流程如下:

接收接口数据接收信息处理模块数据检查发送数据帧类型N发现帧头?YN数据帧完整?Y校验正确?Y检查数据帧基本命令字N添加帧头等字节组成完整数据帧N接口发送数据帧检查数据帧基本命令字N一定时间内有数据回应?Y判断消息类型ACK回应判断消息类型NAK回应N校验正确?YYACK?消息内容发送给信息处理模块

图4.4 数据校验预处理流程

Figure 4.4 checkout disposal flow of the received data frame

当校验通过后,数据处理模块便会提取数据帧的基本命令字段信息,根据不同的基本命令字采取不同的处理方式,如存储采集数据到数据库;遇到新设备发现或者移除等情况要上报HGW等。数据处理流程图如下图4.5所示。在下图中我们看见了数据转发功能,数据转发模块接收数据处理模块的数据,并转发到相应的

46

上海交通大学硕士学位论文

通信接口,这里主要是下行数据接口与网络通信接口。

接收总线数据 判断数据类型 设备查询信息返回 设备信息采集 设备异常 设备状态改变 发送给数据转发流程 数据库存储线程 上报HGW并储存ID 上报HGW并储存ID

图4.5总线数据处理流程图 Figure 4.5 bus data disposal flow

4.3.2网络数据处理流程

本系统提供简单的HGW功能。从HGW端,用户可以进行设备信息管理和控制操作等。

在通过4.3.1节所介绍的数据预处理后,将处理由信息处理模块分析后的来自通信接口的数据,更新设备信息表或发起设备检测、设备信息采集等。这类命令字主要包括这两类:

(1) 设备查询类,主要是查询中继控制器信息或者传感器设备信息,该类命令字将会与嵌入式数据库部分进行交互;

(2) 设备设置类,这类命令字主要包括设备设定、设备隔离、设备重启等。其中设备设定是指通过HGW端进行设备设定,如传感器参数、子系统类型等;设备隔离是指将特定设备从该网络系统中隔离;设备重启是指将被隔离的设备重新加入到整个控制系统中。

信息处理成功后,每条命令都会有相应的应答信息。

47

上海交通大学硕士学位论文

4.4嵌入式数据库

中继器控制部分要与家庭网关和终端接入模块进行通信就需要本身具有一定的数据存储功能,能够存储一些关于家庭网关以及自己所管理设备的静态信息。而中继控制器是基于ARM-Linux平台实现,所以在中继器上选用适合于Linux操作系统且占用空间小的数据库实现其存储功能。 4.4.1 嵌入式数据库的选取

在众多的数据库中,我们需要选择适用于嵌入式系统的数据库。嵌入式系统开发环境决定了其对数据库需求的特点[14][15][16]。

(1) 适当的体积

嵌入式系统对于数据的存储与程序的运行一般都有较强的空间,所以适用于嵌入式系统使用的数据库首先应该有一个适当的体积。

(2) 较强的功能

嵌入式开发中有很多应用,用户需求决定了开发中需要有一个大小适中且功能齐备的数据库来实现对数据的管理。对开发人员来说,要求采用的数据库技术提供完备开发的文档而且易于开发。

(3) 开源的代码

作为产品的开发,开源的代码不仅可以减少产品的生产成本,更重要的是为产品的维护完善和稳定运行都提供了最为彻底的解决手段。Oracle 、Sybase 、DB2 等功能强大,系统体积庞大,要求付费使用,仅适用于作为大型商业数据; SQLite 则简单易用,速度也很快,同时提供了丰富的数据库接口。它的设计思想是小型、快速和最小化的管理。这对于需要一个数据库用于存储数据,但又不想花太多时间来调整数据性能的开发人员很适用。实际上在很多情况下并不需要存储程序或复杂的表之间的关联。这时会发现SQLite 在大小和功能之间找到了一个理想的平衡点。完全的开源代码使其可以称得上是理想的嵌入式数据库[14]。 SQLite 有一种优雅、标准化的设计,其中有一些相当接近于关系数据库管理。SQLite 有自己高度优化的分析生成器,可以快速地生产出高效率的代码,而且依靠它新颖的设计对内存泄漏有着特别的抵抗力。在底部是基于Knuth 经

48

上海交通大学硕士学位论文

过优化的B 树。这样可以运行在可调整的页面缓冲上,有助于将对磁盘的查找减到最小。再往下是页面高速缓存。它作用在OS 的抽象层之上,这样的安排有助于数据库的移动[14][15]。下节将详细介绍嵌入式环境下Sqlite3的搭建。 4.4.2 Sqlite3的跨平台移植

(1) 交叉编译Sqlite3

本文前面已经详细介绍了在PC端建立交叉编译环境的过程。在这里,先需要先从SQLite的官网上下载源码,设置交叉编译环境:

# export PATH=/usr/local/arm-linux/bin:$PATH

一般来说,当宿主机多次用于交叉编译的时候,我们应该在/etc/bashrc文件里面加上这个路径,这样下次便不用再次插入路径了。

配置:# ../sqlite/configure,并且如下设置好host与prefix参数,例如可以设置 --host= arm-linux --prefix=/usr/local/arm-linux/sqlite-arm-linux,编译安装:即执行make、make install命令。接下来可以采用strip命令处理生成库文件,以去掉其中的调试信息,执行文件大小也将小很多。命令如下:

# arm-linux-strip libsqlite3.so.0.8.6 (2) 在ARM板上运行Sqlite3

将/usr/local/arm-linux/sqlite-arm-linux/bin/目录下的 sqlite文件下载到嵌入式板上。下载完毕后,更改可执行程序的属性。将 /usr/local/arm-linux/ sqlite-arm-linux/lib 目录下所有文件下到嵌入式板上 Linux默认的/lib或者/usr/lib目录下面。如果不在Linux的默认路径下,假设库文件在嵌入式板上的 /usr/sqlite/lib/ 目录下,可以这样设置环境变量:

# export LD_LIBRARY_PATH=/usr/sqlite/lib:$LD_LIBRARY_PATH 运行sqlite3可执行程序: # ./sqlite3 sailing.db SQLite version 3.0.8 Enter \".help\" for instructions sqlite>

看见 sqlite> 这样的控制台提示符,sqlite3便是移植成功了。在下一节中,

49

上海交通大学硕士学位论文

将会详细介绍sqlite的使用方法。 4.4.3 Sqlite3的使用简介

Sqlite3的使用还是很方便的,可以通过如下两种方式来使用sqlite3: ¾ Sqlite的命令控制终端。

在嵌入式系统上,# ./sqlite3,当出现sqlite>提示符后,输入: sqlite> .help

便会出现一系列sqlite的控制命令。另外,大部分的SQL语句也都可以直接在其控制终端使用。

¾ C/C++中调用Sqlite提供的API函数。

我们可以在C/C++中调用sqlite3的API函数方便地建立、操作、关闭数据库。使用C 语言API只需要三步。首先,要提供文件名和访问模式用来调用sqlite _open()连接数据库。然后,执行一个callback 函数,SQLite 通过对每个记录执行call2back 函数获得从数据库那里得到的结果。最后,如果想执行一个SQL 查询并获得一个callback函数的指针,可以调用sqlite_exec()。除此之外还需要错误代码检查。SQLite可以通过对一个主键声明它为INTEGER PRI2MARY KEY成为能够自动增加的主键,实现自增字段。 以下是常用的几个API函数接口[14]:

(1) sqlite3_open(“database name”,db)函数打开或新建以database为名的数据库;

(2) sqlite3_exec(db,”create table list(*,*,*……)”,0,0,&errMsg)函数来创建一个需要的列表项(“*”代表函数的参数);

(3) sqlite3_exec(db,”insert into list values(*,*,*,……)”)进行数据存储; (4) sqlite3_close(db)关闭数据库;

(5) sqlite3_get_table(db,”select *from list where *;”, &azResult, &nrow, &ncolume, &errMsg)函数调用数据库中的列表项,然后再结合printf()函数即可正确地查询到数据库中的数据。

50

上海交通大学硕士学位论文

4.4.4 嵌入式数据库的具体设计

中继控制部分主要是需要能够存储一些关于家庭网关以及自己所管理设备的静态信息,例如设备ID、中继器ID等;另外,中继控制器还保存了一些传感器设备实时采集上报的数据信息。其中静态信息的数据库表格设计如下表4.1所示:

表4.1 中继器数据库静态数据表结构

表格名称 RelayInfo

字段名称 数据类型 含义

DeviceInfo

DeviceData

Useable char(1) 标志本行数据是否可用 RelayID Integer Relay的ID号 HGW_IP char(17) HGW的IP地址

DeviceID Integer Device的ID号(关键字)

primary key

DeviceState Integer 设备工作状态 Subsystem Integer 所属子系统 MaxPrecision Integer 最大精度 ControlType Integer 控制类型 SuspendFlag Integer Device是否被隔离 ExceptionTypeInteger Device异常类型 formerData char(1) 设备的前次数据报告 currentData char(1) 设备的当前数据报告

在表格RelayInfo中,字段RelayID是家庭网关给本中继器分配的ID号,HGW_IP是管理本中继器的家庭网关的IP地址;在表格DeviceInfo中存储着本中继器所管理设备的静态数据,包括区别设备唯一性的设备ID等;DeviceData包括了前次数据报告信息和当前数据报告信息。

4.5嵌入式网络服务器

在本系统中,添加使用webServer 主要是为了实现在接入网络的个人PC机上通过网络浏览器进行远程操控,这在某些场合比使用单独编写的HGW界面更方便。

目前,在嵌入式系统中应用比较多的WEB服务器是boa,主要原因还是boa是开放源码,占用系统资源很少,但功能较为强大。下面主要介绍在本系统中boa服务器和嵌入式数据库及下行接口之间的连接问题。本系统中的boa功能主

51

上海交通大学硕士学位论文

要是接收监控端的命令字,然后有两个交互方向:数据库和下行设备,最后将所需信息反馈给监控端的浏览器上。下图4.6即是webserver的监控端的功能流程图:

浏览器软件如IE等 ...... 发送指令 浏览器软件如IE等 嵌入式WEB服务器 CGI程序交互语言 总线数据接口 嵌入式数据库

图 4.6 websetver监控端流程 Figure 4.6 Webserver monitor flow

4.5.1 Boa的交叉移植与配置

Boa的交叉移植较为简单,可以先从boa官网上下载boa的源代码,运行/src/configure即可生成Makefile文件,然后修改文件里面的编译器工具,如将CC=gcc修改为CC=/path/arm-linux-gcc,执行make命令即可生成可执行程序。Boa需要在/etc目录下建立一个目录,里面放入Boa的主要配置文件boa.conf。在Boa源码目录下已有一个示例boa.conf,可以在其基础上进行修改。修改项主要包括:

(1) Group修改

由于在/etc/group文件中没有nogroup组,所以设成0;另外在/etc/passwd中有nobody用户,所以User nobody不用修改。即Group nogroup修改为Group 0。

52

上海交通大学硕士学位论文

(2) ScriptAlias的修改

将ScriptAlias /cgi-bin/ /user/lib/cgi-bin/改为ScriptAlias /user/boa/cgi-bin/,此目录是指定cgi-bin可执行程序的位置。

(3) ServerName的设置

找到ServerName选项,将其设置为ServerName www.myembedded.org。如果该项默认为未打开,执行Boa会异常退出,提示“gethostbyname::No such file or directory”,所以必须打开,其它默认设置即可。 4.5.2 CGI交互应用程序

CGI全称是“公共网关界面”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行交互的一种工具,其程序须运行在网络服务器上。绝大多数的CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器。CGI程序使网页具有交互功能。CGI程序最初在UNIX操作系统上CERN或NCSA格式的服务器上运行。在其它操作系统如windows NT及windows95等服务器上也广泛地使用CGI程序,同时它也适用于各种类型机器[16][17]。

CGI处理步骤:

(1) 通过Internet把用户请求送到服务器; (2) 服务器接收用户请求并交给CGI程序处理; (3) CGI程序把处理结果传送给服务器; (4) 服务器把结果送回到用户。

CGI程序不是放在服务器上就能顺利运行,如果要想使其在服务器上顺利的运行并准确的处理用户的请求,则须对所使用的服务器进行必要的设置。配置:根据所使用的服务器类型以及它的设置把CGI程序放在某一特定的目录中或使其带有特定的扩展名。如上面介绍的boa中Script Alias命令就是指出某一目录下的文件是可执行程序,且这个命令是用来执行这些程序的。

简单的说来,CGI是用来沟通HTML表单和服务器端程序的接口。说它是接口,也就是说CGI并不是一种语言,而是可以被其他语言所应用的一个规范集。理论上讲,你可以用任何的程序语言来编写CGI程序,只要在编程的时候

53

上海交通大学硕士学位论文

符合CGI规范所定义的一些东西就可以了。由于C语言在平台无关性上表现很好,而且对大多数程序员而言都算得上很熟悉,因此,C是CGI编程的首选语言之一[17]。下面来看下远程控制,web Server,数据库以及下行接口之间的联系、交互过程:

(1) 远端,用户在pc机上用IE浏览器发出请求,输入嵌入式系统的IP地址即可打开事先设计好的静态页面,利用静态页面上的FORM表格发送命令或请求;

(2) Web Server将命令信息交给CGI交互语言,CGI解析命令(具体命令字需自行定义);

(3) CGI根据不同命令完成不同的功能,如调出数据库中所需的数据信息、更新数据库中的内容、数据库的维护等;若需要操作下行设备,则调用总线数据交互模块那里封装的上下通信函数;

(4) 脚本执行完毕后,通过Web Server将数据反馈信息传输给IE浏览器端; (5) 关闭连接。

整个过程是非常直观的。

另外,本控制系统还用Java Swing实现了HGW的人机交互界面,该界面是连接前面所介绍的网络数据交互部分。通过该人机界面用户可以实现远程控制、查看、管理等功能。关于界面的软件实现这里不再作详细介绍。

4.6 中继器软件总流程

本章前面各节中已经将中继器软件各功能模块作了详细介绍,并且介绍了相关模块的软件实现。在本控制系统中,需要完成的功能比较多,这需要一个合理的软件框架,以便提高程序运行效率。首先,信息交互、信息处理、数据库部分联系紧密,这里可以用多线程编程;Web Server这里再单独用一个线程;为了信息安全,这里要用到线程安全编程,线程之间需要通信的就用Linux下的信号来完成。这将在下一节中单独详解。至此,可以给出整个控制器的软件流程图,如图4.7所示:

54

上海交通大学硕士学位论文

开始 数据接收线程 Y 出现异常? N 数据解析分析设备类型 分析记录 异常分析处理 数据的智能分析处理 数据库线程 N 设备操作? Y 信息交互 单片机 CGI行为/socket WebServer/Java 图4.7 中继控制部分软件总流程 Figure 4.7 relay control part software flow

监控端

在该流程图中看到了一个智能处理模块,该模块是本系统中最重要的也是未来扩展的重要方向,它需要完成的功能主要包括:

a) 对采集信息进行判断、处理,这里的信息不仅包括传感器的采集的实时 信息,还有下行单片机对传感器设备所进行的一些控制信息。为了完善对多种传感器设备的管理,需要定义自主通讯协议,进行传感器的一些管理设定,如分配设备ID,设备分类等;

b) 对数据信息进行判断,并驱动应用程序,如煤气浓度高于预定安全值, 立即驱动报警器;

c) 可根据异常情况进行简单的故障分析,并自动采取相应处理措施,如自 动查看设备状态信息,并与数据库中原始信息比较,修正传感器参数设置,对上

55

上海交通大学硕士学位论文

报告可能故障信息等;

d) 和实时数据库之间保持良好的通信接口,因为在该模块中不管是信息处 理还是智能分析,都应该将有用信息储存起来,这样管理人员在监控模块可以轻松地查看,这也有利于故障的进一步处理。

从该模块需完成的功能来看,该部分其实就是一智能程序块,我们需要把自己分析该系统问题时的思维用程序来完成。在程序运行过程中,可能需要调用一些设定好的参数信息,而这些参数信息都会保存在嵌入式数据库中。

4.7 中继控制部分软件实现中的几个问题

从前面的章节中,可以知道整个控制系统的软件包括:串口端监控扫描程序,此部分需要负责两个RS232的通信工作(一个串口负责近端传感器设备的接入,另一个负责远端传感器设备的接入);数据分析处理程序,此部分包括数据帧的校验、提取、处理工作,其中处理又包括上报HGW或者存储进数据库操作;HGW端监控程序,此部分程序不仅需要访问板上资源,如数据库,必要时还需要直接控制接入设备,这就需要访问串口资源从而达到控制设备的目的。从这里可以发现有些模块程序需要同时访问共享资源,如RS232串口资源,这便会造成访问冲突情况。还有控制系统处理事情较多,如果使用单线程将会大大降低效率。鉴于上面多种原因,本系统采用了多线程的软件编写方式,并且为访问共享资源的多进程设立可靠的安全措施。下面将分节介绍控制系统软件实现过程中需要注意的几个问题。 4.7.1 共享资源的冲突避免

任何被任务占用的实体都可称为资源。资源可以是输入输出设备,例如打印机,键盘等。资源也可以是一个变量、一个结构等。可以被一个以上的任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在使用共享资源的时,都应该独占资源,直到该任务结束对该共享资源的使用。在多任务操作系统中,我们必须处理好共享资源的访问问题。

在本控制系统中,最经常出现的资源共享就是串口资源的访问:

1)在2.3.3节中,本系统修改了Bootloader的代码,其具体原因也正是系统

56

上海交通大学硕士学位论文

和应用程序要共享其中的一个串口资源。内核需要占用一个串口来作为默认调试终端,并进行相关调试信息的打印;用户的应用程序也需要次串口来进行与下行接入设备进行通信。此时也就发生了资源冲突的情况,以至于通信不能正常进行。

2)针对一个具体的串口,在正常情况下,串口端都会有监控轮询程序在查询设备,而HGW端有可能发生用户需要设定设备的情况。在这种情况下,便出现了资源访问冲突的情况。

针对本系统中出现的共享资源的问题,在软件实现中采用了信号量的方式:当某一任务需要访问串口的时候,需要首先获得串口的信号量,否则进程将会一直处于等待状态。当某个任务获得串口的信号量后,其将独占此资源。

信号量的作用是为互相同步的进程提供一种复杂的、但是较为可靠的同步方法。由于临界资源只能进行互斥地访问。但是当可供使用的临界资源不止一个的时候,使用简单的信号量很容易引起死锁。当只有一个临界资源可供使用时,一个二元信号量就可以了。信号量为1,表示资源可以使用;为0,表示资源正在被其他进程使用,必须等待信号量的释放[23]。

从用户编程的角度来看,内核在IPC信号量机制中提供了三个系统调用。它们的函数原型定义在文件include/linux/sem.h中。函数的源代码在/ipc/sem.c文件中。这三个系统调用的名字为:int sys_semget(key_t key,int nsems,int semflg)、int sys_semop(int semid,struct sembuf*sops,unsigned nsops)、int sys_semctl(int semid, int semnum,int cmd,union semun arg)。其中具体参数的含义这里不再给出详细说明,可以参考相关资料[23]。 4.7.2 监控端程序的超时机制

在本系统中,各个模块之间交互比较多,可靠性会相应降低。如不同任务在争夺串口资源的时候陷入死锁现象,或者下行接入设备已经发生故障,轮询程序在串口处陷入死等。为了防止此类现象的发生,本系统的软件实现中加入了任务超时监控,从而提高系统的可靠性。超时监控的设计思路如下:因为被监控任务的正常执行时间是可以预估的,如轮询一个设备的时间在正常情况下不会超过5秒钟,若在规定的时间内,监控超时程序收到被监控任务执行完毕的发送执行完毕消息,说明该任务运行正常。反之,在规定时间内,监控超时程序没有收到被

57

上海交通大学硕士学位论文

监控任务发出的执行完毕消息,则认为该任务执行异常,并记录异常次数,当异常次数达到一定次数后便上报HGW,认为下行设备已经发生异常。当被监控任务运行时,监控超时程序处于等待状态,等待被监控任务的执行消息,等待时间为被监控任务的预估的任务能正常运行所需的最大时间。不管监控程序端收到正常或者是异常消息,下一任务都会被调用。但是在收到异常消息的时候,程序会做相应的计数处理,以便上报HGW。

在本系统中采用超时机制后,另外一个优点就是可以打破死锁现象。在上一节中本文详细解释了本控制系统中出现的共享资源的问题。为了控制访问临界资源,在本系统的软件设计中采用了信号量互斥访问的方法。采用该方法虽然可以有效地同步多任务对共享资源的访问,但是当出现多个共享资源的时候,在某些特定的情况下就会发生死锁的现象。如果发生死锁,则必须打破死锁,否则整个系统程序将会处于僵死阶段。打破死锁的直接方法就是让死锁任务放弃对资源的占有,然后再重新申请资源。由于在本系统中采用了超时机制,当死锁发生时,肯定会引起超时,此时超时处理程序会有效地结束死锁任务并唤起下一个任务,从而可以打破死锁。

在本控制系统软件超时机制实现中,需要注意的一个问题是:串口资源的使用方式必须设为NONBLOCK方式,否则当串口端陷入阻塞时,超时机制将会失效。

4.7.3 程序的可重入问题

在多任务系统中,经常会出现一个函数被多个任务调用。如果该函数使用了全局变量,并且没有对全局变量进行保护,由于数据存储在静态存储器中,这些数据有可能会发生覆盖,从而造成数据破坏,软件系统运行出错,会引起此类问题的函数叫做不可重入函数,反之成为可重入函数[24]。如果某任务调用了一个不可重入函数,在即将处理全局变量的时候,处理器被另一优先级更高的任务强行剥夺,并且对存储在公共数据区的全局变量进行了未知的操作;等高优先级任务操作完毕后,处理器交给原先的任务,原先任务并不知道高优先级任务对全局数据的操作情况,从而便会引起判断出错。由于调用不可重入函数引起的问题在软件调试的时候很少发生,但是在实际情况中会因为许多不确定的因素引发软件

58

上海交通大学硕士学位论文

故障,所以应该避免使用不可重入函数[19]。

在本控制系统的软件设计中,使用了以下几种方式来避免不可重入函数: ¾ 尽量使用局部变量;

¾ 使用全局变量前,使用信号量进行同步操作;

¾ 在处理局部变量的时候,关闭中断,因为由中断引起的处理程序优先级非常

高。

4.7.4 多线程的应用

在本系统软件实现中,为了保证不间断的通讯以及通讯的可靠性,模块内编程采用了多线程的方式。线程是在多任务操作系统中为了更好地描述系统运行情况而引入的概念,线程是一个应用中的基本执行路径。线程由一个堆栈、CPU寄存器的状态和系统调用列表中的一个入口组成。每个线程都可以访问进程中的所有资源,但进程中的线程之间是相互的。

这里选择多线程而不是多进程主要有以下几个方面的原因:线程共享相同的内存空间,不同的线程可以存取内存中的同一个变量。所以,程序中的所有线程都可以读或写声明过的全局变量。如果曾用 fork() 编写过重要代码,就会认识到这个工具的重要性。因为fork()虽然允许创建多个进程,但它还会带来以下通信问题:如何让多个进程相互通信,这里每个进程都有各自的内存空间。虽然有许多不同种类的本地 IPC通信机制,但它们都遇到两个重要障碍:

(1)强加了某种形式的额外内核开销,从而降低性能。

(2)对于大多数情形,IPC 不是对于代码的自然扩展,通常极大地增加了程序的复杂性。

由于所有的线程都驻留在同一内存空间,所以线程无需进行开销大而复杂的长距离调用。只要利用简单的同步机制,程序中所有的线程都可以读取和修改已有的数据结构,而无需将数据经由文件描述符转储入紧窄的共享内存空间。鉴于此原因,我们应该考虑采用单进程/多线程模式而非多进程/单线程模式。

不仅如此,线程同样还是非常快捷的。与标准 fork() 相比,线程带来的开销很小。内核无需单独复制进程的内存空间或文件描述符等等,这就节省了大量的 CPU 时间,使得线程创建比新进程创建快上十到一百倍。因为这一点,可以

59

上海交通大学硕士学位论文

大量使用线程而无需太过于担心带来的 CPU 或内存不足。使用 fork() 时导致的大量 CPU 占用也不复存在。这表示只要在程序中有意义,通常就可以创建线程。当然,和进程一样,线程将利用多 CPU。特定类型线程程序的性能将随系统中处理器的数目几乎线性地提高。如果正在编写 CPU 非常密集型的程序,则应该设法在代码中使用多线程。一旦掌握了多线程编码,无需使用繁琐的 IPC 和其它复杂的通信机制,就能够以全新和创造性的方法解决编码难题。所有这些特性配合在一起使得多线程编程更加快速和灵活[30]。

4.8 本章小结

本章在第三章的总体设计基础上,将中继控制部分软件划分为总线数据交互、网络数据交互、数据信息处理、嵌入式数据库、网络服务器这几个模块,并且详细地介绍了各个子模块的具体实现问题,其中重点介绍了软件的实现过程。本章的最后总结了控制系统软件总体实现中需要注意的几个问题,进一步提高系统软件的可靠性。

60

上海交通大学硕士学位论文

第五章 系统测试设计

为了验证系统是否实现了预期的目标,我们必须设计相关测试用例进行测试。测试从目的上可以分为单元测试与整体功能性测试;从测试角度来看,可以分为硬件测试与软件测试。鉴于篇幅,本章将设计几个代表性的测试用例。

5.1 硬件单元测试

硬件测试的目的主要是为了验证近端与远端接入模块的信号调理电路、通信电路、器件接入检测电路是否工作正常。鉴于篇幅,本文以接入模块通信功能测试为例:

¾ 测试对象:有线信道(RS485)与无线信道(RF)。 ¾ 验证目的:验证传输信道正确与否。

¾ 测试说明:本控制系统中,近端接入模块与远端接入模块分别采用不同MCU

作为处理器。近端模块采用RS485总线进行接入,而远端接入模块采用RF进行接入。

5.1.1 近端接入模块通信测试(RS485)

测试所需设备及器件:三类近端接入模块一块、二类近端接入模块一块、RS232-RS485转换器、供电电源、PC机(windows XP)。测试所需软件:串口调试助手、PIC单片机烧写程序2005U2V11-ch.exe、PICC单片机C语言编写器、测试程序(test01.hex、test02.hex)。具体数据帧的含义请见3.7.1节所述。

测试步骤:

① 分将RS485总线和电源的连接好;

② 利用在线烧写方式将编译成功的二进制程序test01.hex下载到二类近端接入模块中,将test02.hex下载到三类近端接入模块中;

③ 连接好测试电路;

④ 打开串口调试助手,将界面设置为十六进制显示和十六进制发送。在发送栏中写入十六进制数据帧“AA 08 04 01 01 A6 55”,并且按手动发送;

61

上海交通大学硕士学位论文

⑤ 在接收栏中观察接入模块的回应数据帧,如果显示“EE 08 05 01 03 10 F1 55”,则验证二类接入板与RS485通信正常;

⑥ 在发送栏中写入十六进制数据帧“AA 08 04 01 02 A6 55”,并且按手动发送;

⑦ 在接收栏中观察接入模块的回应数据帧,如果显示“EE 08 05 02 03 10 F3 55,则验证三类板与485通信正常;

⑧ 在发送栏中写入十六进制数据帧“AA 08 04 01 03 A6 55”并且手动发送,接收栏应没有任何数据。

依此验证RS485 总线与近端接入模块方式是否工作正常。 5.1.2 远端接入模块通信测试(RF)

所需的设备与器件:

① RF 远端模块服务器一块,远端的第一类接入模块一块,射频天线模块两片;

② PC机一台:带有并口和串口; ③ +5V稳压源:为RF服务器供电;

④ +7.3~+9V稳压源: 用于模拟干电池的输出,为远端第一类接入模块供电;

⑤ RS232串口线一条:连接RF服务器与Relay; ⑥ AVR的ISP下载线一条:支持ATmega8的下载线。 所需可执行程序:

① RF无线模块服务端第一片单片机程序:severmcu1.hex; ② RF无线模块服务端第二片单片机程序:severmcu2.hex; ③ 远端第一类接入模块单片机程序:access1.hex;

④ PC上的应用软件:CodeVisionAVR、SLISP和串口调试助手。 测试步骤:

1) 把两片射频天线模块分别插与服务器与远端第一类接入模块的无线插座上;

2) 用串口线连接RF服务端的与PC的串口;

62

上海交通大学硕士学位论文

3) 先把跳线帽扣在离下载插座近的两个排针上,下载severmcu1.hex;再把跳线帽扣在另两个排针上,下载severmcu2.hex;注意下载的先后顺序,不然不出现编程失败或者每次只插一片单片机下载程序;

4) 把下载线接于远端第一类模块的下载插座上,下载access1.hex; 5) 在串口调试助手的输入框中输入如下的帧:AA 08 04 01 03 A4 55,点击发送按钮,发送输入框中的帧;

6) 观察串口调试助手的输出框;将出现如下图所示的数据帧;图中所示数据帧表明无线接入模块工作正常。

图5.1 远端接入模块测试结果

Figure 5.1 remote access module communication test result

5.2 软件单元测试

本系统中,软件实现的主要功能为:access、Relay和HGW之间的通信、数据信息的提取与处理、虚拟HGW管理等。软件主要是中继接入、中继控制和HGW界面操作。由于中继控制部分是系统软件核心部分,故本节将会给出该部分的单元测试,其它部分模块测试鉴于篇幅不在给出。

软件测试环境:

软件测试需要的硬件包括一台模拟家庭网关的PC、一个作为中继器的ARM嵌入式开发板、一台测试串口的PC以及用路由器建立的局域网环境。在家庭网

63

上海交通大学硕士学位论文

关上要求已安装好JDK,并已有我们编写好的用于家庭网关的软件。在中继器上要求是已经建立好的ARM-Linux环境,并已有我们编写的用于中继器的软件。在测试阶段最好在Linux系统下运行Telnet或SSH服务器,以便测试过程中查看中间结果。串口终端用来模拟终端接入模块,主要是用其串口来查看中继器的串口输出以及模拟接入模块输入。 具体的测试环境如图所示:

图5.2 软件测试环境 Figure 5.2 software test environment

中继控制部分软件测试过程:

① 中继器上电运行,为确保系统已正常运行,可以通过超级终端观察处理器的输出信息;

② 中继器与台式电脑之间用RS232线正确连接,注意中继器上选择第二个串口;

③ 打开台式电脑上的串口调试助手,选择正确的通信参数;

④ 运行中继器里串口服务程序./serialtime,观察串口调试助手里的数据信息;

⑤ 在串口调试助手接收到请求应答信息后,向中继系统先发送ACK帧:EE 08 04 01 01 55,模拟设备有信息要交互,然后发送相应的几种数据帧,即设备发现、设备异常、设备移除、设备数据报告等;

设备发现帧:AA 08 08 10 01 01 FF 01 01 45 55; 设备异常帧:AA 08 05 40 05 02 E0 55; 设备移除帧:AA 08 04 20 01 87 55;

设备数据报告帧:AA 08 07 80 01 02 05 06 25 55;

⑥ 在发送每种数据帧后,注意观察终端上的显示信息(程序的debug信息)

上海交通大学硕士学位论文

及串口调试助手上的信息,注意通信的准确性;如当我们输入设备发现帧后,串口调试助手上信息为:

图5.3 中继控制软件数据通信

Figure 5.3 relay’s control part software communication result

而我们可以从Putty上看到调试信息为:

图5.4 putty调试信息

Figure 5.4 program debug information on putty

⑦ 如果程序运行正常,中继器能够查询一定数量的设备,并且针对每一个设备都有限定的时间。如果由于某种异常超时,则程序将要查询下一个设备。由于调试阶段中继控制部分软件将从串口调试助手得到的信息打印在超级终端上, 这也就可以很轻松知道数据的正确性,如上图5.3、5.4所示。如某个设备响应时间超时,控制器会查询下一个设备。

65

上海交通大学硕士学位论文

5.3 系统整体测试

此部分测试通信协议是否正确地在access与Relay部分实现,以及HGW与Relay、Access部分的实际通信状况。根据项目要求,对以下场景进行检测,①接入检测场景;②数据采集场景;③数据报告场景。鉴于篇幅,这里给出接入场景测试步骤及结果。

测试步骤:

(1) 打开家庭网关、中继器电源,进入各自的操作系统; (2) 将中继器连入局域网;

(3) 在家庭网关上运行 JNHGW/src/server 下的 ServerHGW服务程序,如果控制台上打印出:TCP server started 和 UDP server started,则证明网关上服务器端已开始运行,注意:防火墙需设置为允许 JVM;

(4) 在中继器上运行数据库初始化程序 DBinit; (5) 在中继器上运行对上服务端程序 ServerUP; (6) 将近端接入模块正确地连接在RS485总线上; (7) 将接入模块电源接好;

(8) 将RS485<=>RS232转换器接在嵌入式中继系统的第二个串口上; (9) 给相关模块供电;

(10) 利用万用表及示波器,超级终端检测硬件是否已经正常工作(参照前面硬件测试标准);

(11) 运行HGW服务程序;

(12) 利用putty登录进嵌入式中继系统,运行串口程序以及网络HGW服务程序;

(13) 将温度传感器插入到接入模块的传感器接口; (14) 观察HGW上是否有提示信息,如下图所示:

66

上海交通大学硕士学位论文

图5.5 新设备发现报告 Figure 5.5 new device detection report

(15) 对此设备进行子系统设定,如下图所示:

图5.6 设备设定 Figure 5.6 device setting

(16) 家庭网关更新数据库后会返回设置成功对话框,如下图所示。

图5.7 设备设定回应 Figure 5.7 device setting response

(17) 重复步骤(1)-(10),接入第二个近端传感器:可燃气体传感器; (13) 将远端接入模块与RF client接好; (14) 将远端接入模块与RF Client的电源接好;

(15) 将RF Server用RS232与Relay连接好,注意此时使用的是Relay的第二个RS232接口;

67

上海交通大学硕士学位论文

(16) 分别给接入模块与Relay上电,并且测试其是否正常工作; (17) 运行HGW服务程序;

(18) 利用putty登录进嵌入式中继系统,运行串口交互程序以及HGW服务程序;

(19) 将人体红外检测传感器插入到远端接入模块上的传感器接口; (20) 此时,观察HGW上将会有类似的新设备报告对话框,并且我们可以进行相应的设定操作。

鉴于文章篇幅,这里只给出这些具有代表性的测试用例及其结果,在文章的最后附录中将会给出一些系统整体模型的实例图。

5.4 本章总结

本章设计了控制系统的硬件与软件单元测试,最后设计了系统整体测试用例。针对每种测试用例,本章都详细地介绍了测试环境与测试过程,并给出了测试结果。

68

上海交通大学硕士学位论文

第六章 总结与展望

为了实现对散落在家庭各个角落的传感器设备进行统一的管理与服务,本文提出了中继器的设计概念,弥补了传统家庭网关的不足;本文较为详细地介绍了传感器控制器的模块功能设计以及各个模块的软件实现过程;本文还详细设计了下行设备、控制器端以及监控端之间的应用通讯协议,以保证信息交互的可靠性;该控制系统可以实现传感器设备的即插即用功能,这也将是未来数字家庭设备发展的重要趋势。

本控制系统的设计是基于与日本NTT研究所的合作项目“家庭传感器及开关的接入研究”,并且合作项目已经成功通过验收。

在未来发展趋势下,本系统可以改进的地方有:

(1) 结合现场总线与完善的自主通讯协议,进一步提高系统的健壮性与实时性。现场总线是以ISO/OSI模型为基础,具有完整的软件支持系统,能够解决总线控制、冲突检测、链路维护等问题。如果系统采用Lonworks等现场总线,结合自主通讯协议,则可以极大地提高系统的可靠性与实时性。

(2) 将更多的无线技术应用到本系统中来。虽然本系统中支持无线RF信道通信,但是我们可以将更多的无线技术应用到控制系统中,如可以添加GPRS模块,这样系统就可以在紧急情况下直接与主人对话。

本系统最终的目标是满足人们在家庭中对安全、舒适、方便的工作、学习和生活的需求。设计以家庭网关为主导,通过家庭网络实现对家庭中的电器和设备进行统一的监测和控制。在家庭网关中根据感知元的提供的信息和用户设定的情景模式运行数据库中相应的程序,将控制指令通过家庭网络传送给执行元,从而实现智能化的管理和服务。

69

上海交通大学硕士学位论文

参考文献

[1] 丁镇生,传感器及传感器技术应用[M],北京:电子工业出版社,1998. 8 [2] 吴仲城,虞承端,嵌入式智能化传感器的设计,电子技术应用,2000年第3版

[3] 卢伟国,杨本强,嵌入式WEB传感器的网络化接口设计,计算机应用,2003.9 [4] 马忠梅,马广云,徐英慧等编著,ARM嵌入式处理器结构与应用基础,北京航空航天大学出版社,2002

[5] http://www-128.ibm.com/developerworks/cn/linux/l-btloader/index.html #author [6] 夏传凯,吴乃陵,Bootloader与Linux内核的参数传递,中国科技论文在线,2006.10

[6] Chen Tianzhou, Hu Wei, Wang Xiangsheng,Smart File System: Embedded File System Based on NAND-Flash,IEEE, Digital Object Identifier ,2006

[7] 朱文凯,何岭松,丁汉,熊有伦,基于Internet的嵌入式Web传感器,仪表技术与传感器,2002. 08

[8] Umar Saif,Daniel Gordon,Internet Access to a Home Area Network,IEEE Internet Computing,2001.1

[9] 刘小胜,吴乐南,周爽,智能小区系统工程技术导论,电子工业出版社,2001年

[10] 杨四海,马利,信息家电嵌入式系统选择方案,自动化技术与应用,2002.4 [11] 顾商杰,薛质,计算机通信网基础,电子工业出版社,2000.9:174-200pp [12] 刘峥嵘等,嵌入式Linux应用开发详解,机械工业出版社;2004:p435-448pp [13] Jonatban Corbet, Alessandro Rubini,Greg Kroab-Hartman, 魏永明等译,Linux device driver, 2006.01:408-453pp

[14] http://www.sqlite.org/capi3ref.html, C/C++ Interface For SQLite Version 3 [15] SQLite3 Manual

[16] 雷小俊,李伟,SQLite在嵌入式Web服务器中的应用,信息技术,2006.6 小型微型计算机[17] 张曦煌, 柴志雷,嵌入式Web 服务器中CGI的特点及实现,

70

上海交通大学硕士学位论文

系统,2003.11

[18] 谭峰,基于Ethernet的嵌入式监控系统的研究与开发,西北工业大学硕士论文,2005.3

[19] 倪超,家庭智能网络终端系统的研制,东南大学硕士学位论文,2004.03 [20] 黄颖,张小飞,网络监控系统的设计与实现,计算机工程与应用,2003.2 [21] 赵,基于嵌入式技术的家庭智能化系统,南京航空航天大学硕士论文,2004.2

[22] 乔俊平,基于嵌入式Linux平台的家庭网关设备的研究与设计,电子科技大学硕士学位论文,2006.1

[23] 陈莉君,操作系统内核分析,北京:人们邮电出版社,2003.3

[24] 李善平,刘文峰,王焕龙,Linux与嵌入式系统[M],北京,清华大学出版社,2003.1

[25] Fanshawe DGJ, Architecture for Home System Information, Entertainment and Control[J],IEEE Colloquium on 1990.3/1-3/3

[26] Takeshi Saito, Ichiro Tornnoda, HomeGateway Architecture and its Implementation, Contributed Paper IEEE, 2000.9

[27] http://tech.it168.com/db/oo/2006-07-18/200607182313734.shtml

[28] 全国大学生嵌入式系统专题邀请赛优秀作品选编,上海交通大学出版社,2004.05

[29] 康萍,宋小杉等,智能家居网络的串口通讯通讯实现方案,西北大学学报(自然科学版),2005.8

[30] Daniel Robbins,POSIX线程详解,IBM development works,200.7

71

上海交通大学硕士学位论文

致谢

时光飞逝,转眼两年半的硕士研究生生涯就即将结束了。这两年半期间,不

论是平时的学习,还是最后的毕业设计,黄佩伟教授都在各方面给予了悉心的指导,给我创造了一个宽松的学术科研环境,给了我充分自由发挥的空间。同时黄佩伟教授在生活中也给予了我们细致的关心。对黄佩伟教授,我要表示衷心的感谢。

本次毕业设计的完成,还要特别感谢戚英豪博士在设计理论上给予的指导以

及在调试阶段给予的帮助。感谢王波、夏宏波、蔡文豪等同学在调试阶段给于的帮助与配合。你们的帮助大大加快了我毕设项目完成的进度,谢谢你们!

最后,感谢研究生阶段一起度过的同学。你们在生活和精神上都给了我很大

的帮助,是你们让我的研究生生活变得多姿多彩。

72

上海交通大学硕士学位论文

攻读硕士学位期间完成的学术论文

1、郑锐,黄佩伟,“基于ARM-Linux的智能传感器控制器”,《电子技术》2006.12,已发表,ISSN 1000-0755

73

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务