毕业设计(论文)基于S3C2410芯片和嵌入式Linux的远程网络图像监控系统_第1页
毕业设计(论文)基于S3C2410芯片和嵌入式Linux的远程网络图像监控系统_第2页
毕业设计(论文)基于S3C2410芯片和嵌入式Linux的远程网络图像监控系统_第3页
毕业设计(论文)基于S3C2410芯片和嵌入式Linux的远程网络图像监控系统_第4页
毕业设计(论文)基于S3C2410芯片和嵌入式Linux的远程网络图像监控系统_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录摘要2第一章 绪论41.1 嵌入式监控系统的现状和发展41.2 本课题的研究背景及意义51.3 本文的章节安排6第二章 视频监控系统的总体设计82.1视频监控系统的总体设计82.2硬件平台设计82.3系统软件的设计92.4本章小结10第三章 嵌入式linux系统的设计和实现113.1嵌入式系统开发环境的建立113.1.1建立交叉编译环境113.1.2 bootloader113.2设备驱动程序143.2.1设备驱动程序的分类143.2.2设备驱动程序的基本结构143.2.3设备驱动程序的设计163.3 本章小结20第四章 视频监控系统应用软件的开发224.1基于usb接口的视频采集的设计与

2、实现224.1.1linux系统中的usb摄像头驱动程序224.1.2 v4l模块的开发244.2视频数据的处理274.2.1 jpeg标准274.2.2图像数据压缩的具体实现284.2.3服务器/客户端网络视频传输的实现314.3系统测试344.3.1测试环境344.3.2实验结果354.4本章小结36第五章 总结与展望375.1总结375.2展望37参考文献39致谢42 摘要 随着嵌入式技术和网络图像技术的迅猛发展,嵌入式网络与图像相结合的数据通信手段已成为一个重要的发展方向。基于arm处理器的嵌入式远程网络图像监控技术,给远程监控应用提供了一个更加简单、方便、小巧的实现手段,是现代各行各

3、业安防系统及工业自动控制系统的核心技术。 本文研究和设计了一种基于s3c2410芯片和嵌入式linux的远程网络图像监控系统,包括图像采集、压缩、传输、存储及客户端实现。 对于图像采集,本文使用基于usb接口的通用摄像头视频信号采集方法,采用v4l标准的摄像头驱动。采集到的图像数据量十分大,不适合在网络上传输,于是要对捕捉到的图像文件进行压缩,本文采用jpeg压缩方式。传输层的网络传输协议有两种:面向连接的tcp协议,面向无连接的udp协议,本文采用udp协议来实现图像的网络传输,并通过提供套接字socket来进行网络编程。关键字:s3c2410,嵌入式linux,图像采集,jpeg压缩,so

4、cket编程。 abstract with the rapid development of embedded technology and image technol-ogy in network,the way of data communication by combining embedded netw-ork and image has been an important direction of development.the techno-logy of arm based remote network supervising ,provided a more simple co

5、-nvenient and smart way with the remote monitoring,its the core technol-ogy of safe protection system and industry auto-control system in diffe-rent fields of modern times.this article studied and designed one kind of remote network super-vising based on the s3c2410 chip and embedded linux,it includ

6、es image c-apture,image compression,image transport,image storage and client real-ization.for image capture,this article use the usb camera to capture the vi-deo signal and use v4l kernel application programming interface .the im-age data captured is too mass to transport on network.then we need to

7、c-ompress the image data it has captured,in this article we adopt jpeg me-thod.there are two network communication protocals at transport layer:c-onnection-oriented protocol transport control protocol(tcp) and connect-ionless protocol and user datagram protocol(udp).in this article we ado-pt udp to

8、realize network transport and by providing network socket to realize network programming.key words:s3c2410,embedded linux,video capture,jpeg compressionsocket programming.第一章 绪论1.1 嵌入式监控系统的现状和发展 远程视频监控系统是一种综合运用多种技术,比如网络技术、工业控制和计算机技术等对所需监控对象进行远程监控的系统,视频监控系统的发展基本上是从早期的模拟闭路电视监控系统向数模结合的视频监控系统和现在的数字视频监控系

9、统演变的过程。纵观视频监控系统发展的历史,大致可分为三个阶段。第一阶段,本地模拟监控系统。原始视频监控系统的产生源于摄像机、电视机的出现,它首先被广泛应用于安防监控、生产管理(如建筑物、工厂生产线)等场合,模拟视频监控系统通常由摄像机等前端设备、传输系统和主控显示记录设备三大部分组成。在本地视频监控系统中,一般采用模拟方式进行传输,采用视频电缆或光纤,传输距离不能太远,主要应用于距离比较近的场合。第二阶段,基于pc的多媒体监控系统。该系统主要的工作方式是处理各种信息和完成本地所要求监控的各种功能,采用视频压缩卡和通信接口卡,通过连接好的通信网络,将监控信息传送到一个或多个监控中心。该系统的一般

10、结构是:在终端监控现场安装若干个摄像头,各种检测装置(如传感器等)、报警探头与数据设备,通过各自的传输线路,连接到多媒体监控终端上。多媒体监控终端采用pc机或者专用的工控机。虽然目前这种结构的远程视频监控系统在目前的市场上占有率非常高,但是这种结构的系统所能适合的场合是具有局限性的。比如,在一些特殊的应用场合上,需要安装不止一个摄像头的时候,如果要满足监控要求,必须在每个摄像头上配套安装一个解压缩卡对信号进行解压缩。这样,整个系统就显得繁杂,冗余,运行起来稳定性就得不到保障,可靠性非常低,另一方面,由于设备数量的增加导致成本增加,这样的系统性价比是很低的。从监控的距离范围的角度来对比,模拟监控

11、系统的监控范围是比较小的,这是由于其传输方式所决定的,传统的模拟监控系统大多应用控制电缆对信号进行传输,如果线路过长,信号就会有衰减,导致监控系统的监控效果降低。所以,一般模拟监控系统只应用于很小范围内的监控,比如,工厂,停车场等特定的一个区域。第三阶段,基于嵌入式技术的网络远程视频监控系统。这种系统是采用嵌入式技术将监控终端的摄像头和麦克风采集的信号(包括视频信号,音频信号灯)进行压缩后传送到网络上面。这种结构的监控系统一般在信号采集端采用专门的解压缩芯片,这种专门的解压缩芯片能同时对几组信号进行解压缩,这样既提高了效率,又减少了设备的使用量,降低了成本。另外一方面,这种结构的监控系统通过网

12、络传输信号,在监控终端,用户可以使用专门的软件对监控对象进行查看,还可以通过网络控制带有云台的摄像头转动,这样就实现了实时监控和实时控制。很显然这种系统比前面讲的两种系统具有更高的稳定性、实时性和实用性。从系统实现的可能性分析,这种系统在监控现场只需要一块集成好的电路板,板子上面把视频采集、压缩和传输的功能都集成在一起了。然后给每个监控现场分配一个ip地址,进行网络连接。最后在监控终端安装监控软件,这样,无论在世界上哪一个角落,使用用户都可以对监控对象进行监控。由于这种系统的这些优点,在工控领域,嵌入式已经应用的非常普遍。对于远程监控,国内外都展开了积极的研究,它是国内外研究的一个前沿课题,美

13、国两所大学开发出了一种基于hitemet的下一代远程监控诊断示范系统,这个系统得到了很多制造业、计算机业和仪器仪表业的大公司的大力支持。目前国内嵌入式和网络视频相关的研究也正处于快速成长期。中国相关的研究机构己经成立了智能视频监控的研究小组,正在开展智能视频监控方面的研究。虽然目前市场上也有不少智能视频监控方面的产品,如网络摄像机,dvr等,但是这些产品一般只适合于较大的企业和学校等研究单位使用,能够以较低的成本和进入寻常百姓家还需要很长的时间。1.2 本课题的研究背景及意义 众所周知,人类通过视觉所获取的信息约占到其获取的总信息量的70,视觉信息具有直观、可靠等一系列优越性。近年来,随着计算

14、机、网络及通信技术的迅猛发展,整个世界对网络视频方面的投入逐年加大,相关应用也越来越广泛,形成了具有巨大发展潜力的市场。其中,利用网络实现视频监控己成为一种趋势,传统的模拟视频监控技术正在逐步向数字化、网络化、智能化发展。在嵌入式领域,arm系列芯片以其高性能、低功耗、低成本等优点占领了大部分市场。目前最为流行的当属arm7和arm9两个系列。随着人们对系统功能提出了更高的要求,arm7在高端应用中已经显得力不从心,性能更加强劲的arm9处理器逐渐占据了市场上的高端产品应用。在视频监控方面,随着计算机多媒体技术特别是图像压缩技术的不断发展,使得数字图像通信技术得到越来越广泛的应用。数字监控开始

15、逐渐替换传统的模拟监控系统。而基于usb接口的数字摄像头以其良好的性能和低廉的价格得到广泛应用。同时因为usb接口的数字摄像头灵活、方便的特性,使得它比较容易集成到嵌入式系统中。使用usb接口的数字摄像头进行视频信号的采集可以大大降低视频采集系统的成本,增强其通用性和可维护性。目前基于usb摄像头的视频信号采集在pc机上已经大量使用并且取得了良好的效果,但在嵌入式领域的应用还比较少,尤其是在基于arm9系列芯片的嵌入式系统中,相关的理论研究也很少。在网络视频传输方面,近年来,随着网络技术的不断发展,在internet上传输视频和音频成为一种趋势。由此看来,将监控的功能与internet技术结合

16、起来是数字监控领域发展的方向。将监控的功能与网络技术完美地结合,拥有强大的技术优势,而这里面的核心部分就是一个可以直接连入以太网的视频采集设备,提供实时的图像采集、压缩和传输的功能。由此可见,嵌入式网络化数字视频监控系统必将有良好的应用和发展前景,由它替代当前普遍应用于pc的视频远程监控系统已成为必然趋势。而目前在我国基于嵌入式技术的网络化视频监控系统刚刚起步,所以研究并开发一种基于嵌入式技术的网络化数字视频监控系统具有很大的实际意义。1.3 本文的章节安排 在了解了嵌入式系统的发展历程和现阶段状况后,顺应嵌入式系统的发展趋势,将远程视频采集和嵌入式linux和嵌入式网络编程结合起来设计了嵌入

17、式的远程网络图像监控系统。本文包含主要内容如下:第1章 绪论 介绍了嵌入式监控系统的发展历程和现阶段发展状况。对把嵌入式系统应用于远程监控的可行性进行作了阐述。第2章 视频监控系统的总体设计介绍了嵌入式视频监控设计系统的总体设计方案。说明嵌入式视频监控系统的工作原理以及硬件板块的设计分析和组成,并介绍了本系统的体系结构。第3章 嵌入式linux操作系统的设计和实现本章讲的主要是嵌入式系统开发环境的建立及设备驱动的设计方法。在深入分析嵌入式linux操作系统技术特点的基础上,根据视频监控系统的硬件要求建立了系统软件开发环境。然后根据设备驱动的设计目标,提出了设备驱动的设计方案。第4章 视频监控系

18、统各功能模块的设计和实现 介绍视频采集系统和图像压缩功能模块的实现。在详细分析videoforlinux标准的基础上,提出了改进标准的方法,加快了采集速度。本章主要是通过linux下提供的socket进行网络视频传输的实现。第5章 总结和展望对本文所做的工作进行总结,对还未解决的问题提出构想,希望能在今后做出进一步的努力和完善。第二章 视频监控系统的总体设计2.1视频监控系统的总体设计本系统的执行流程:整个系统采用一个32位高性能的嵌入式处理器三星的s3c2410和嵌入式linux操作系统,通过usb摄像头采集图像数据,使用jpeg技术进行数据压缩,使用udp协议进行网络传输,最终用户在客户端

19、的界面显示图像数据。本设计的系统原理图如图2-1所示:视频监控客户端视频监控客户端嵌入式图像采集系统usb摄像头 图2-1 视频监控系统示意图linux是通过video4linux标准来实现视频处理的。video4linux是关于视频设备的内核驱动。为针对视频设备的应用程序编程提供一系列接口函数,这些视频设备包括现今市场上流行的电视卡、视频捕捉卡和usb摄像头等。对于usb摄像头,其驱动程序中需要提供基本的i/o操作接口函数open、read、writ、close的实现,对中断的处理实现、内存映射功能以及对i/o通道的控制接口函数ioctl的实现等。linux下视频采集的原理如图2-2所示。2

20、.2硬件平台设计本系统使用的硬件平台功能框图见2-3audiousb s3c2410x cpu64msdram64mnand flash以太网网卡cs8900alcd显示器jtagrs232usb摄像头宿主机pc 图2-3 硬件框图2.3系统软件的设计系统的软件主要由usb驱动程序、嵌入式linux操作系统、udp协议栈、socket通信服务程序、图像处理程序和vc应用程序几部分组成。如图2-4所示。 显示图像数据图像处理程序 usb驱动程序嵌入式linux操作系统socket 通信程序服务进程监听进程vc socket 通信程序客户端服务器端 图 2-4 软件总体结构图图像处理程序处理来自摄

21、像头的图象信息,将其转换成适合在网络中传输的图象格式,比如jpeg等。usb通信程序负责与usb串行口通信,获取设备状态信息。socket通信服务程序负责与客户端通信。2.4本章小结本章主要提出了嵌入式视频监控系统的总体设计方案及开发环境的建立。首先,阐述了系统的构成和在linux下视频采集的工作原理,介绍了硬件主要组成模块,接着提出了本系统软件设计的体系结构。第三章 嵌入式linux系统的设计和实现3.1嵌入式系统开发环境的建立3.1.1建立交叉编译环境在裁减和定制嵌入式linux,运用于系统之前,由于一般嵌入式开发系统存储大小有限,通常需要在强大的pc机上建立一个用于目标机的交叉编译环境。

22、什么是交叉编译呢?简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(architecture)、操作系统(operating system)。建立一个交叉编译工具链是一个相当复杂的过程,互联网上有一些编译好的可用的交叉编译工具链可以下载。本文采用arm-linux-gcc-3.4.1.tar.bz2作为交叉编译环境,下载源代码,解压缩以后交叉编译环境就建立好了。3.1.2 bootloader1)bootloader的概念一个嵌入式系统从软件的角度看通常可以分为四个层次:引导加载程序、操作系统内核、文件系统、用户应用程序。如图3-1

23、所示。 用户应用程序文件系统引导加载程序系统内核系统调用接口 设备驱动操作系统核心机制(进程调度、内存管理、文件系统、网络支持信号机制、同步机制等等) 图3-1 嵌入式系统层次结构图 引导加载程序是系统加电后运行的第一段代码。我们熟悉的pc中的引导程序一般由bios和位于mbr的os bootloade广起组成。然而在嵌入式系统中通常没有像bios那样的固件程序(有的嵌入式cpu有),因此整个系统的加载启动任务就完全由bootloader来完成。简单地说,bootloader就是在操作系统内核运行前运行的一段小程序。通过这段小程序,我们可以初始化必要的硬件设备,创建内核需要的一些信息并将这些信

24、息通过相关机制传递给内核,从而将系统的软硬件环境带到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用。bootloader的启动过程可以是单阶段的,也可以是多阶段的。通常多阶段的bootloader能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的bootloader大多数是二阶段的启动过程,也即启动过程可以分为stagel和stage2两部分。bootloader的第一阶段。(1) 基本的硬件设备初始化这是bootloader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境。它通常包括以下步骤:a屏蔽所有的中

25、断。为中断提供服务通常是操作系统设备驱动程序的责任,因此在bootloader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写cpu的中断屏蔽寄存器或状态寄存器(比如arm的cpsr寄存器)来完成。b设置cpu的速度和时钟频率。cram初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。d初始化led。典型地,通过gpio驱动led,其目的是表明系统的状态是正常还是不正常的。如果板子上没有led,那么也可以通过初始化uart向串口打印bootloader的logo字符信息来完成这一点。e关闭cpu内部指令数据缓冲。(2) 为加载stage2准备ram空间为了获得更

26、快的执行速度,通常把stage2加载到ram空问中来执行,因此必须为加载bootloader的stage2准备好一段可用的ram空间范围。(3) 拷贝stage2到ram中拷贝时要确定两点:(1)stage2的可执行映象在固态存储设备的存放起始地址和终止地址:(2)ram空间的起始地址。(4) 设置堆栈指针sp堆栈指针的设置是为了执行c语言程序作好准备。(5) 跳转到stage2的c程序入口点在上述一切都就绪后,就可以跳转到bootloader的stage2去执行了。比如,在arm系统中,这可以通过修改pc寄存器为合适的地址来实现。bootloader的第二阶段。 (1).初始化本阶段要使用到

27、的硬件设备这通常包括:a 初始化至少一个串口,以便和终端用户进行i/o输出信息;b初始化计时器等。在初始化这些设备之前,也可以重新把led灯点亮,以表明我们已经进入main()函数执行。设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。(2).检测系统的内存映射(memory map)所谓内存映射就是指在整个4gb物理地址空间中有哪些地址范围被分配用来寻址系统的ram单元。虽然cpu通常预留出一大段足够的地址空间给系统ram,但是在搭建具体的嵌入式系统时却不一定会实现cpu预留的全部ram地址空间。也就是说,具体的嵌入式系统往往只把cpu预留的全部ram地址空间中的一部分映射到

28、ram单元上,而让剩下的那部分预留ram地址空间处于未使用状态。由于上述这个事实,因此bootloader的stage2必须在它执行(比如,将存储在flash上的内核映像读到ram空间中)之前检测整个系统的内存映射情况,也即它必须知道cpu预留的全部ram地址空间中的哪些被真正映射到ram地址单元,哪些是处于“unused”状态的。(3).加载内核映像和根文件系统映像a.规划内存占用的布局这里包括两个方面,一方面是内核映像所占用的内存范围;另一方面是根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地址和映像的大小两个方面。b.从flash上拷贝由于像arm这样的嵌入式cpu通常都

29、是在统一的内存地址空间中寻址flash等固态存储设备的,因此从flash上读取数据与从ram单元中读取数据并没有什么不同。(4).设置内核的启动参数应该说,在将内核映像和根文件系统映像拷贝到ram空间中后,就可以准备启动linux核了。但是在调用内核之前,应该作进一步准备工作,即:设置linux内核的启动参数。 (5).调用内核3.2设备驱动程序3.2.1设备驱动程序的分类在linux中,对每一个设备的描述都通过主设备号和从设备号。其中主设备号描述控制这一类设备的驱动程序,从设备号用来区分同一个驱动程序控制的不同设备。linux为三大类设备提供了接口:1)字符设备(char device)字符

30、设备支持面向字符的i/o操作,它不经过系统的快速缓存,所以它们负责管理自己的缓冲区结构。字符设备只支持顺序存取的功能,不支持随机存取。典型的字符设备包括鼠标、键盘、串行口等。2)块设备(block device)块设备接口仅支持面向块的i/o操作,所有i/o操作都通过在内核地址空间中的i/o缓冲区进行,它可以提供随机存取的功能。典型的块设备主要包括硬盘、软盘、cd-rom等。3)网络设备(network device)网络设备在linux里做专门的处理。linux的网络系统主要是基于bsd unix的socket机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系

31、统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。3.2.2设备驱动程序的基本结构设备驱动程序是内核的一部分,但是由于设备种类繁多,相应的,设备驱动程序的代码也多。而且设备驱动程序往往由许多人来开发。为了能协调设备驱动程序和内核之间的开发,就必须有一个严格定义和管理的接口。例如,unix svr4提出了ddi/d目规范。ddi/dki的意思是设备驱动程序接口/设备驱动程序内核接口 (device-driver interface/driver-kernel interface)。通过它,可以来规范化设备驱动程序与内核之间的接口。 linux的设备驱动程序与外界的接口与d

32、di/dki规范相似,可分为三部分(如图35所示):1)驱动程序与系统引导的接口即自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和是否能正常工作。如果该设备正常,则对这个设备及其相关的、设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化的时候被调用一次。系统引导操作系统内核硬件设备与系统引导的接口与操作系统内核的接口与硬件设备的接口设备驱动程序 图 3-5 linux设备驱动的接口2)驱动程序与操作系统内核的接口即i/o操作的子程序,如读写操作。调用这部分是由于系统调用的结果。这部分程序在执行的时候,系统仍认为是和进行调用的进程属于同一个进程,在其中调用sleep()等

33、与进程运行环境有关的函数。3)驱动程序与设备的接口即中断服务子程序。中断可以产生在任何一个进程运行的时候,因此在中断服务程序被调用的时候,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般都支持同一类型的若干设备,所以在系统调用中断服务子程序的时候,都带有一个或多个参数,以唯一标识请求服务的设备。在上面三部分中,驱动程序与操作系统内核的接口(即i/o操作接口)是通过一组固定的接口函数来实现的,这组接口函数是由每个设备的设备驱动程序提供的。一般来说,设备驱动程序能够提供如下几个接口函数:open接口函数:打开设备操作。open子程序必须对将要进行的i/o操作

34、做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备处于忙状态。close接口函数:关闭一个设备。当最后一次使用设备终结后,调用close子程序。独占设备必须标记设备可再次使用。read接口函数:从设备上读数据。对于有缓冲区的i/o操作,一般是从缓冲区里读数据。write接口函数:往设备上写数据。对于有缓冲区的i/o操作,一般是把数据写入缓冲区里。ioctl接口函数:执行读、写之外的操作。select接口函数:检查设备,看数据是否可读或设备是否可用于写数据。select系统调用在检查与设备文件相关的文件描述符时使用

35、select接口函数。如果设备驱动程序没有提供上述接口函数中的某一个,系统会用缺省的子程序来代替。对于不同的系统,也还有一些其它的接口函数。3.2.3设备驱动程序的设计在设备驱动程序的开发过程中,明确该设备完成的功能以及如何使该设备能够有效地工作,并且编写相应的接口函数,是开发设备驱动程序过程中的主要任务。1)设备文件linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,它是linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。它们的关系如图3-6所示。应用程序设备文件驱动模块硬件/etc/modules

36、.conf文件系统内核open write read命令mknod 通过 主设备号关联通过模块中的 read write操作返回主设备号insmod向系统注册如果需要,可根据别名加载 图3-6 驱动程序与系统关系设备文件可以使用与操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和i/o控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。2)设备驱动程序的模块linux下的设备驱动程序可以按照两种方式进行编译,一种是直接静态编译成内核的一部分,另一种则是编译成可以动态加载的模块。如果编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态卸载,也不利于调试。而动态加载

37、的驱动程序,以模块方式存在,可以在需要时加载,任务完成后卸载。在嵌入式应用中,以后者为多。在以模块方式编写驱动程序时,要实现两个必不可少的函数init_moudle()和cleanuo_moudle() ,而且至少要和件。在编译内核模块时,需要加上-module d_kernel_-dlinux这几个参数,编译生成的模块(一般为.o文件)可以使用命令insmod载入linux内核,从而成为内核的一个组成部分,此时内核会调用模块中的函数init_module()。当不需要该模块时,可以使用rmmod命令进行卸载,此时内核会调用模块中的函数cleanup_module()。3)设备驱动程序的构成l

38、inux的设备驱动程序大致可以分为如下几个部分:驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理 (1).驱动程序的注册与注销向系统增加一个驱动程序意味着要赋予它一个主设备号,这可以通过在驱动程序的初始化过程中调用register_chrdev()或registeres_blkdev()来完成。而在关闭字符设备或者块设备时,则需要通过调用unregister_chrdev()或unregister_blkdev()从内核中注销设备,同时释放占用的主设备号。在模块驱动程序中,把下条语句加入init_module()函数中完成“csi2c”设备的注册:i

39、nt result=register_chrdev(o,csi2c“&csi2c_fops);把下条语句加入cleanup_module()函数中完成“csi2c”设备的注销:unregister_chrdev(int gmajor,“csi2c”) ;(2).设备的打开与释放打开设备是通过调用file_operations结构中的open()函数来完成的,它是驱动程序用来为今后的操作完成初始化准备工作的。在大部分驱动程序中,open()通常需要完成下列工作:a.检查设备相关错误,如设备尚未准备好等;b.如果是第一次打开,则初始化硬件设备;c.识别次设备号,如果有必要则更新读写操作的当前位置指

40、针fd.分配和填写要放在file-private_data 的数据结构;e.使用计数增l。在打开设备函数中,需要加入以下:mod_inc_use_count;mod_inc_use_count是linux系统定义的宏,用来统计使用该模块的用户数。释放设备是通过调用file_operationss结构中的函数release()来完成的,这个设备方法有时也被称为close(),它的作用正好与open()相反,通常要完成下列工作:a.使用计数减1;b.释放在file-private_data中分配的内存。在关闭设备函数中,需要加入以下:mod_dec_use_count;只有在使用该模块的用户数为0

41、时,系统才会完成卸载设备模块的操作。一般地,在打开和释放设备函数中,对设备的控制权、释放占用的内存及中断等,按相反的顺序完成为好。(3).设备的读写操作字符设备的读写操作相对比较简单,直接使用函数read()和write()就可以了。但如果是块设备的话,则需要调用函数block_read()和block_write()来进行数据读写,这两个函数将向设备请求表中增加读写请求,以便linux内核对请求顺序进行优化。由于是对内存缓冲区而不是直接对设备进行操作的,因此可以加快读写速度。如果内存缓冲区中没有所要读入的数据,或者需要执行写操作将数据写入设备,那么就要执行真正的数据传输。设备的读写操作,分阻

42、塞型操作和非阻塞型操作两种。它们的区别如下:阻塞型操作:如果一个进程调用了read(),但是还没有数据可读,此进程必须阻塞。数据一到,进程随即被唤醒,并把数据返回给调用者;如果一个进程调用了write(),但缓冲区没有空问,此进程必须阻塞。而且必须睡眠在与读进程不同的等待队列上。当向硬件设备写入一些数据,从而腾出了部分输出缓冲区时,进程随即被唤醒,write调用成功。非阻塞型操作:如果在数据没有就绪时调用rcad()或者在缓冲区没有空间时调用write(),则该调用简单地返回-eagain。可在filp-f_flags中设置o_nobblock标志来实现read()和write()的非阻塞型操

43、作,缺省为阻塞型操作。(4).设备的控制操作除了读写操作外,应用程序有时还需要对设备进行控制,这可以通过file_operations结构中的ioctl()函数来完成。ioctl()的用法与具体设备密切关联,因此需要根据设备的实际情况进行具体分析。xxx_ioctl()的函数原型为:static int xxx_ioctl (struct inode* inode,struct file* file,unsigned int cmd,unsigned long arg)根据cmd参数,加入特定的功能函数完成设备的控制操作。在对资源的访问控制方式上,除了有i/0指令以外,还有对外设i/o内存的访

44、问。对这些内存的操作一方面可以通过把i/o内存重新映射后作为普通内存进行操作;另一方面也可以通过总线主dma的方式让设备把数据通过dma传送到系统内存中。(5).设备的中断和轮询处理对于不支持中断的设备,读写时需要轮流查询设备状态,以便决定是否继续进行数据传输。例如,打印机驱动程序在缺省时采用轮询的方法来查询打印机的状态。而对于支持中断的设备,就要有中断服务子程序来处理中断。linux内核为了将来自硬件设备的中断传递到相应的设备驱动程序,在驱动程序初始化的时候就将其对应的中断服务子程序进行了登记,设备驱动程序是通过调request_irq函数来把中断号和中断服务子程序联系起来的,通过free_

45、irq来释放中断。它们的定义为:int request_irq(unsigned int irq,void(*handler)(int irq,void dev_id,struct pt_regs*regs),unsigned long flags,const char*device,oid dev_id);void free_irq(unsigned int irq,void*dev_id);参数irq表示所要申请的硬件中断号。handler为向系统登记的中断处理子程序,中断产生时由系统来调用,调用时所带参数均为中断号,dev_id为申请时告诉系统的设备标识,regs为中断发生时寄存器内容。

46、device为设备名,将会出现在/proc/interrupts文件里。flag是申请时的选项,它决定中断处理程序的一些特性,其中最重要的是中断处理程序是快速处理程序(flags里设置了sa_interrupt)还是慢速处理程序(不设置sa_interrupt),快速处理程序运行时,所有中断都被屏蔽,而慢速处理程序运行时,除了正在处理的中断外,其它中断都没有被屏蔽。在linux系统中,中断可以被不同的中断处理程序共享,这要求每一个共享此中断的处理程序在申请中断时在flags里设置sa_shirq,这些处理程序之间以dev_id来区分。如果中断由某个处理程序独占,则dev_id可以为null。r

47、equest_irq返回0表示成功,返回_inval表示irq15或handler=null,返回-ebusy表示中断已经被占用且不能共享。本章讲的主要是嵌入式系统开发环境的建立和设备驱动的设计。在深入分析嵌入式linux操作系统技术特点的基础上,根据视频监控系统的硬件要求建立了系统软件开发环境。然后根据设备驱动的设计目标,提出了设备驱动的设计方案。由于linux源码开放,因此给连接到系统的任何设备编写驱动程序变得相对容易,按照这些结构,就可以编写通常的设备驱动程序。3.3 本章小结本章讲的主要是嵌入式系统开发环境的建立和设备驱动的设计。在深入分析嵌入式linux操作系统技术特点的基础上,根据

48、视频监控系统的硬件要求建立了系统软件开发环境。然后根据设备驱动的设计目标,提出了设备驱动的设计方案。由于linux源码开放,因此给连接到系统的任何设备编写驱动程序变得相对容易,按照这些结构,就可以编写通常的设备驱动程序。第四章 视频监控系统应用软件的开发4.1基于usb接口的视频采集的设计与实现本系统运行的平台是基于三星s3c2410的硬件平台和基于嵌入式linux系统的软件平台。嵌入式linux系统启动的时候启用了mmu(memory management unit,存储器管理单元),系统进入保护模式,所以应用程序就不能直接读写外设的i/o区域(包括i/o端口和i/o内存),这时就要借助于该

49、外设的驱动来进入内核完成这个工作。linux对于视频采集设备的支持,是通过video4linux实现的,通常可以简称为v4l,现在较高版本的linux内核都已经包含了v4l。v4l是为各种电视卡和usb接口的音视频采集设备提供统一的编程接口。在linux下,视频采集设备的正常使用依赖于对v4l标准的支持。但是如果使用现有的符合v4l标准的驱动程序配合通用应用程序,难以充分利用usb带宽,帧速不高,不易满足实时监控等要求。本小节首先介绍在linux系统下usb摄像头驱动编制的一般方法,然后在此基础上优化驱动程序,以达到提高帧速目的4.1.1linux系统中的usb摄像头驱动程序在linux下,设

50、备驱动程序可以看成linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件实现的细节,使得应用程序可以像操作普通文件一样来操作外部设备,可以使用和操作文件中相同的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和i/o控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。本系统平台使用的嵌入式linux系统在内核的主要功能上与桌面linux操作系统没本质区别,所以驱动程序要实现的任务也一样,只要编译时使用的编译器、部分头文件和库文件等要涉及到具体处理器体系结构,这些都可以在makefile文件中具体指定。1)usb摄像头驱动的一般编写方法从前面我们知道,usb摄像头

51、属于v4l支持的范畴。所以,usb摄像头的驱动应当与内核提供的视频驱动相结合。即首先在驱动中声明一个vedio_device结构,并为其指定文件操作函数指针数组fops,向系统注册。在应用程序发出文件操作的相关命令时,linux内核根据这些指针调用相应函数,并将该结构作为参数传递给它们。这样,就完成了驱动和内核之间的通信。例如:static video_device vdev_tcmplate=;/声明video_device,指出挂接驱动static stmct file_operations zc301_fops=;/声明本驱动的文件操作函数指针struct video_device*vd

52、ec=video_devdata(file);/从文件指针中提取出video_device结构在video_ device结构中,有一个私有指针,可以将它指向一块保留内存。在这块内存中,保存着该驱动、该设备的相关初始化信息。这块内存的申请、初始化、指针指向等工作都是在usb驱动的枚举函数probe中完成。这样,在枚举函数将控制权返还给系统后,因为内核不销毁保留内存,所以驱动仍然保留着自己的信息。当然,在驱动卸载函数中,应该将申请的各块内存全部释放。2)使用双urb (usb request block)轮流通信众所周知,usb1.1总线标准定义了控制、中断、批量、等时等四种管道。对于时间性极强

53、但是准确度要求不高的视频捕捉应用来说,摄像头应该使用等时传输方式。为了尽可能快地得到图像数据,应当在urb中指定usb_iso_asap标志。urb-transfer_flags=usb_isoasap;/尽可能快地发出本urblinux系统中任何usb传输都通过urb实现。为提高速度,可以考虑扩大urb的缓冲,这样可以降低每个usb事务中握手信息所占比例,提高有效数据的传输速度。但是受限于总线带宽和具体的usb设备芯片,单纯扩大urb的缓冲不能无限制地解决问题。具体分析一下usb数据传输在操作系统中的实现:每次传输都要包括urb的建立、发出、回收、数据整理等阶段,这些时间不产生有效数据。因此

54、可以建立两个urb,在等待一个urb被回收时,也就是图像正在被传感器采集时,处理、初始化另一个urb,并在回收后立刻将其发出。两个urb交替使用,大大减少了额外时间。工作流程如图4-1所示。回收urb发出下一个urb处理、再次初始化此urb 图4-1 urb处理例程这个过程是在urb的完成例程中实现的,有两点需要注意:首先处理再次初始化的代码时间不能长,否则会造成完成例程的重入,如果确实来不及,可以在完成例程中设定标志,例如“数据采集好”词语,由应用程序使用阻塞ioctl()来查询该词语并做处理;其次由于cpu可能会在完成例程中停留较长时间,系统负担较大,可以在open函数中初始化两个urb并

55、将其发出,有限度地减轻系统负担。3)使用双帧缓冲提高效率linux系统中,文件操作通常是由read、write等系统调用来完成。这些系统调用在驱动中的解决方法就是用copy_to_user()、copy_from_user()等函数在核态、户态内存空间中互相拷贝。但是对于大批量的图像数据,采用拷贝的方法显然会增加时间开销,因此用内存映射的方法解决。首先使用vmalloc()申请足够大的核态内存,将其作为图像数据缓冲空间,两个urb带回的图像数据在这里暂存;然后使用remap_page_range()函数将其逐页映射到用户空间中。户态的图像处理程序使用mmap()数,直接读写核态图像缓冲内存,大大减少额外开销。图像数据的处理可能要花费比较长的时间,不同的算法对于数据保留时间的要求也不一样。因此可以申请两帧图像缓冲,在处理一帧图像的同时,将两个urb带回的数据全部填充到另一帧缓冲中,这样可以免去时间冲突上的麻烦。值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论