嵌入式专业课程设计方案报告_第1页
嵌入式专业课程设计方案报告_第2页
嵌入式专业课程设计方案报告_第3页
嵌入式专业课程设计方案报告_第4页
嵌入式专业课程设计方案报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式课程设计报告一、课程设计目1.1掌握linux开发环境搭建;1.2巩固嵌入式交叉编译开发思想;1.3掌握嵌入式GUI软件设计技。,.

课程设计规定输入信号为1路AV视频信号,规定系统能对1路输入信号进行实时采集,数字化解决,压缩,存储,要保证一定录像质量.依照设计题目规定,选取拟定ARM芯片型号,视频采集芯片型号,完毕系统硬件设计和程序设计.课程设计内容

设计原理ARM10系列微解决器为低功耗32位RISC解决器,最合用于对价位和功耗要求较高消费类应用.ARM10系列微解决器重要应用领域为:工业控制,Internet设备,调制解调器设备,移动电话等各种多媒体和嵌入式应用.视频监控系统总体设计一方面需要对系统进行总体规划,将系统划提成几种功能模块,拟定各个模块实现办法.整个视频监控系统采用C/S构造,从主体上分为两某些:服务器端和客户端.服务器端重要涉及S3C4510平台上运营采集,压缩,传播程序,客户端是PC机上运营接受,解压,回放程序.视频监控终端从摄像头捕获实时视频信息,压缩之后通过以太网传播到视频监控服务器上.视频图像采集和打包发送在服务器端完毕,图像接受解包和回放将在客户端完毕.采集图像数据压缩打包发送接受系统硬件设计系统采用模块化设计方案,重要涉及如下几种模块:主控制器模块,储存电路模块,外围接口电路模块,电源和复位电路,S3C4510主控器模块主控器模块是整个系统核心,采用S3C4510B解决器.Samsung公司S3C4510B是基于以太网应用系统高性价比16/32位RISC微控制器,内含一种由ARM公司设计16/32位ARM7TDMIRISC解决器核,ARM7TDMI为低功耗,高性能16/32核,系统存储电路模块主控器还需某些外围存储单元如NandFlash,和SDRAM.NandFlash中包括LinuxBootloader,系统内核,文献系统,应用程序以及环境变量和系统配备文献等;SDRAM读写速度快,系统运营时把它作为内存单元使用.外围电路模块外围电路重要是如下几种电路,复位电路图,电源电路图以及JTAG电路,三、课程设计设备及工具硬件:UP-NETARM2410-S嵌入式实验仪、PC机、ov511摄像头;软件:PC机操作系统REDHATLINUX9.0、MINICOM、AMR-LINUX开发环境。四、设计方案本次课程设计采用arm10开发平台。该平台采用Samsung公司解决器S3C2410。该解决器内部集成了ARM公司ARM920T解决器核32位微控制器,资源丰富,带独立16KB指令Cache和16KB数据Cache、LCD控制器、RAM控制器、NAND闪存控制器、3路UART、4路DMA、4路带PWMTimer、并行I/O口、8路10位ADC、TouchScreen接口、I2C接口、I2S接口、2个USB接口控制器、2路SPI,主频最高可达203MHz。在解决器丰富资源基本上,还进行了有关配备和扩展,平台配备了16MB16位Flash和64MB32位SDRAM。通过以太网控制器芯片DM9000E扩展了一种网口,此外引出了一种HOSTUSB接口。通过在USB接口上外接一种带USB口摄像头,将采集到视频图像数据放入输入缓冲区中。然后,对缓冲区中视频数据进行压缩成帧,并把每一帧图片在网页中显示出来,每秒钟刷新两次,得到一种动态视频界面,然后通过局域网访问该主机网页,得到网络视频信息。本次课程设计重要是完毕得到视频图片及网页刷新过程。本次设计规定在局域网环境中进行。五、开发环境配备5.1摄像头驱动加载在Linux下,设备驱动程序可以当作Linux内核与外部设备之间接口。设备驱动程序向应用程序屏蔽了硬件实现了细节,使得应用程序可以像操作普通文献同样来操作外部设备,可以使用和操作文献中相似、原则系统调用接口函数来完毕对硬件设备打开、关闭、读写和I/O控制操作,而驱动程序重要任务也就是要实现这些系统调用函数。本系统平台使用嵌入式arm-Linux系统在内核重要功能上与Linux操作系统没本质区别。Video4Linux(简V4L)是Linux中关于视频设备内核驱动,它为针对视频设备应用程序编程提供一系列接口函数,这些视频设备涉及现今市场上流行TV卡、视频捕获卡和USB摄像头等。ov511驱动,2.4内核中就有,因此咱们只需重新编译内核,将下边选项都选上,然后重新烧写内核就可以了。也就是直接静态加载。

(1)在armlinuxkernel目录下makemenuconfig。

(2)一方面(*)选取Multimediadevice->下Videoforlinux。加载video4linux模块,为视频采集设备提供编程接口;

(3)然后在usbsupport->目录下(*)选取supportforusb和usbcameraov511support。这使得在内核中加入了对采用OV511接口芯片USB数字摄像头驱动支持。

(4)保存配备退出。

(5)makedep;makezImage就生成了带有ov511驱动内核。

接下来就通过uboot将内核烧到flash里去。这时你将摄像头插上,系统就会提示发现摄像头-ov511+,这阐明驱动正常。:-),驱动加载就成功了。5.2安装jpeg库在地址/graphics/jpeg/jpegsrc.v6b.tar.gz中下载jpeg库压缩包。

#tar-zxvfjpegsrc.v6b.tar.gz//解压库文献

#cdjpeg-6b

#./configure--prefix=/usr/local/jpeg6--enable-shared//生成MAKEFILE文献#make//编译安装文献#mkdir/usr/local/jpeg6#mkdir/usr/local/jpeg6/include#mkdir/usr/local/jpeg#mkdir/usr/local/jpeg/lib#mkdir/usr/local/jpeg/bin#mkdir/usr/local/jpeg/man#mkdir/usr/local/jpeg/man/man1//建立生成安装文献目录#makeinstall-lib/生成安装文献#makeinstall//开始安装文献设计过程6.1硬件设计系统主体设计思想是将视频前端和嵌入式Web服务器整合在一起,摄像头通过USB接口和嵌入式系统板USBHOST相连,摄像头采集来视频信号通过压缩后,通过内部总线传送到内置Web服务器,客户端采用浏览器/服务器构造(即B/S构造),可以通过IE浏览器访问视频Web服务器,以便查看所监控视频画面,并且,顾客还可以控制平台对镜头动作或对系统进行配备控制。网络视频采集系统是由视频监控终端和视频监控中心构成,终端使用嵌入式系统加上USB摄像头,在Linux操作系统上运营USB摄像头驱动和相应视频采集解决传播程序,得到视频监控画面,并画面通过网络传播,监控中心运营监控软件端,通过Internet浏览器来浏览终端送来监控画面,其硬件连接图如下所示:网络视频采集硬件连接图从图中可以看出,PC机某些可以直接采用IE浏览器,不需要在PC机上运营其她软件,重要设计工作是开发板端设计。视频监控终端重要有两个某些构成,硬件某些涉及摄像头和开发平台选取;软件某些涉及系统级软件(BootLoader,嵌入式操作系统,USB驱动程序)与顾客级软件(应用程序)。6.2软件设计Video4linux为应用程序提供了一系列接口函数,通过这些函数,可以执行打开、读写、关闭等基本操作。设备驱动提供了read、write、open、close等函数详细实现,在内核这些函数都可以调用。视频采集流程图如下所示:视频采集流程图运用V4L编写视频采集程序重要代码如下,下列代码包括采集编码程序某些核心函数。程序中定义数据构造struct_v4l_struct{intfd;//保存打开视频文献设备描述符structvideo_capabilitycapability;structvideo_picturepicture;structvideo_mmapmmap;structvideo_mbufmbuf;unsignedchar*map;//用于指向图像数据指针intframe_current;intframe_using[VIDEO_MAX_FRAME];//这两个变量用于双缓冲};typedefstruct_v4l_structv4l_device;这些数据构造都是由Video4Linux支持,它们用途如下:*video_capability包括摄像头基本信息,例如设备名称、支持最大最小辨别率、信号源信息等;*voide_picture包括设备采集图像各种属性,如brightness(亮度)、hue(色调)、contrast(对比度)、whiteness(色度)、color(深度)等;*video_mmap用于内存映射;*voido_mbuf运用mmap进行映射帧信息,事实上是输入到摄像头存储器缓冲中帧信息,涉及size(帧大小)、frames(最多支持帧数)、offsets(每帧相对基址偏移)。程序中用到重要系统调用函数有:open("/dev/voideo0",intflags)、close(fd)、mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset)、munmap(void*start,size_tlength)和ioctl(intfd,intcmd,…)。前面提到Linux系统中把设备当作设备文献,在顾客空间可以通过原则I/O系统调用函数操作设备文献,从而达到与设备通信交互目。固然,在设备驱动中要提供对这些函数相应支持。这里阐明一下ioctl(intfd,intcmd,…)函数,它在顾客程序中用来控制I/O通道,其中,fd代表设备文献描述符,cmd代表顾客程序对设备控制命令,省略号普通是一种表达类型长度参数,也可没有。(2)采集程序实现过程一方面打开视频设备,摄像头在系统中相应设备文献为/dev/video0,采用系统调用函数grab_fd=open("/dev/video0",O_RDWR),grab_fd是设备打开后返回文献描述符(打开错误返回-1),后来系统调用函数就可使用它来对设备文献进行操作了。接着,运用ioct1(grab_fd,VIDIOCGCAP,&grab_cap)函数读取structvideo_capability中关于摄像头信息。该函数成功返回后,这些信息从内核空间拷贝到顾客程序空间grab_cap各成员分量中,使用printf函数就可得到各成员分量信息,例如printf("maxheight=%d",grab_fd.maxheight)获得最大垂直辨别率大小。不规则用ioct1(grab_fd,VIDIOCGPICT,&grab_pic)函数读取摄像头缓冲中voideo_picture信息。在顾客空间程序中可以变化这些信息,详细办法为先给分量赋新值,再调用VIDIOCSPICTioct1函数,例如:grab_fd.depth=3;if(ioct1(grab_fd,VIDIOCSPICT,&grab_pic)<0){perror("VIDIOCSPICT");return-1;};完毕以上初始化设备工作后,就可以对视频图像截取了,有两种办法:一种是read()直接读取;此外一种mmap()内存映射。Read()通过内核缓冲区来读取数据;而mmap()通过把设备文献映射到内存中,绕过了内核缓冲区,最快磁盘访问往往还是慢于最慢内存访问,因此mmap()方式加速了I/O访问。此外,mmap()系统调用使得进程之间通过映射同一文献实现共享内存,各进程可以像访问普通内存同样对文献进行访问,访问时只需要使用指针而不用调用文献操作函数。由于mmap()以上长处,因此在程序实现中采用了内存映射方式,即mmap()方式。运用mmap()方式视频裁取详细进行操作如下。①先使用ioct1(grab_fd,VIDIOCGMBUF,&grab_vm)函数获得摄像头存储缓冲区帧信息,之后修改voideo_mmap中设立,例如重新设立图像帧垂直及水平辨别率、彩色显示格式。可运用如下语句grab_buf.height=240;grab_buf.width=320;字串8grab_buf.format=VIDEO_PALETTE_RGB24;②接着把摄像头相应设备文献映射到内存区,详细使用grab_data=(unsignedchar*)mmap(0,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grad_fd,0)操作。这样设备文献内容就映射到内存区,该映射内容区可读可写并且不同进程间可共享。该函数成功时返回映像内存区指针,挫败时返回值为-1。下面对单帧采集和持续帧采集进行阐明:*单帧采集。在上面获取摄像头存储缓冲区帧信息中,最多可支持帧数(frames值)普通为两帧。对于单帧采集只需设立grab_buf.frame=0,即采集其中第一帧,使用ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf)函数,若调用成功,则激活设备真正开始一帧图像截取,是非阻塞。接着使用ioct1(grab_fd,VIDIOCSYNC,&frame)函数鉴定该帧图像与否截取完毕,成功返回表达截取完毕,之后就可把图像数据保存成文献形式。测试与实现(1)仔细检查设备连接,打开电源;(2)在PC机上浏览器中地址栏输入开发板地址,网页自动跳到开发板首页;(3)在页面上可见摄像头采集到视频信息。经验证,本次设计基本达到设计规定。设计心得本次课程设计通过运用嵌入式技术,图形解决技术等,完毕了网络视频采集过程,进一步熟悉了交叉编译开发办法,在开发过程中,遇到诸多问题,如驱动无法加载,程序调试出错等,通过重新编译开发板内核、安装图形解决库等,解决了各种问题,在解决问题过程中,咱们对嵌入式开发过程多了某些细节结识,为后来持续学习巩固了基本。在设计过程中,咱们分工合伙,一起进步,不只从理论上对嵌入式有了更深结识,同步从实践中验证了学习理论知识,对嵌入式有了更深一步结识。源程序清单#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<sys/ioctl.h>#include<sys/mman.h>#include<errno.h>#include<linux/videodev.h>#include<jpeglib.h>#include<unistd.h>#include<math.h>#include<errno.h>#include<string.h>#include<signal.h>#include<pthread.h>#include<sys/time.h>#include<sys/mman.h>#include<getopt.h>#defineWIDTH640#defineHEIGHT480#defineDEFAULT_DEVICE"/dev/v4l/video1"intwrite_jpeg(char*filename,unsignedchar*buf,intquality,intwidth,intheight,intgray){structjpeg_compress_structcinfo;structjpeg_error_mgrjerr;FILE*fp;inti;unsignedchar*line;intline_length;if(NULL==(fp=fopen(filename,"w"))){fprintf(stderr,"grab:can'topen%s:%s\n",filename,strerror(errno));return-1;}cinfo.err=jpeg_std_error(&jerr);jpeg_create_compress(&cinfo);jpeg_stdio_dest(&cinfo,fp);cinfo.image_width=width;cinfo.image_height=height;cinfo.input_components=gray?1:3;cinfo.in_color_space=gray?JCS_GRAYSCALE:JCS_RGB;jpeg_set_defaults(&cinfo);jpeg_set_quality(&cinfo,quality,TRUE);jpeg_start_compress(&cinfo,TRUE);line_length=gray?width:width*3;for(i=0,line=buf;i<height;i++,line+=line_length)jpeg_write_scanlines(&cinfo,&line,1);jpeg_finish_compress(&(cinfo));jpeg_destroy_compress(&(cinfo));fclose(fp);/////////////////////////////////////////////////////////////////////charfn1[30]="/var/www/pic001.jpg";charfn2[30]="/var/www/pic002.jpg";if(NULL==(fp=fopen(fn1,"r"))){fclose(fp);remove(fn1);}rename(fn2,fn1);/////////////////////////////////////////////////////////////////////return0;}//这个函数很通用,它作用是把buf中数据压缩成jpeg格式。struct_v4l_struct{intfd;//保存打开视频文献设备描述符structvideo_capabilitycapability;structvideo_picturepicture;structvideo_mmapmmap;structvideo_mbufmbuf;unsignedchar*map;//用于指向图像数据指针intframe_current;intframe_using[VIDEO_MAX_FRAME];//这两个变量用于双缓冲};typedefstruct_v4l_structv4l_device;externintv4l_open(char*,v4l_device*);externintv4l_close(v4l_device*);externintv4l_get_capability(v4l_device*);externintv4l_get_picture(v4l_device*);externintv4l_get_mbuf(v4l_device*);externintv4l_set_picture(v4l_device*,int,int,int,int,int);externintv4l_grab_picture(v4l_device*,unsignedint);externintv4l_mmap_init(v4l_device*);externintv4l_grab_init(v4l_device*,int,int,int);externintv4l_grab_frame(v4l_device*,int);externintv4l_grab_sync(v4l_device*);intv4l_open(char*dev,v4l_device*vd){dev=DEFAULT_DEVICE;if((vd->fd=open(dev,O_RDWR))<0){perror("v4l_open");return-1;}if(v4l_get_capability(vd))return-1;if(v4l_get_picture(vd))return-1;//这两个函数就是即将要完毕获取设备信息函数return0;}intv4l_get_capability(v4l_device*vd){if(ioctl(vd->fd,VIDIOCGCAP,&(vd->capability))<0){perror("v4l_get_capability:");return-1;}return0;}intv4l_get_picture(v4l_device*vd){if(ioctl(vd->fd,VIDIOCGPICT,&(vd->picture))<0){perror("v4l_get_picture:");return-1;}return0;}intv4l_get_mbuf(v4l_device*vd){if(ioctl(vd->fd,VIDIOCGMBUF,&(vd->mbuf))<0){perror("v4l_get_mbuf:");return-1;}return0;}intv4l_set_picture(v4l_device*vd,intbr,inthue,intcol,intcont,intwhite){/*if(br)*/vd->picture.brightness=25000;/*if(hue)*/vd->picture.hue=25000;/*if(col)*/vd->picture.colour=65535;/*if(cont)*/vd->picture.contrast=30000;/*if(white)*/vd->picture.whiteness=25000;if(ioctl(vd->fd,VIDIOCSPICT,&(vd->picture))<0){perror("v4l_set_picture:");return-1;}return0;}intv4l_grab_picture(v4l_device*vd,unsignedintsize){if(read(vd->fd,&(vd->map),size)==0)return-1;return0;}intv4l_mmap_init(v4l_device*vd){if(v4l_get_mbuf(vd)<0)return-1;if((vd->map=mmap(0,vd->mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED,vd->fd,0))<0){perror("v4l_mmap_init:mmap");return-1;}return0;}intv4l_grab_init(v4l_device*vd,intwidth,intheight,intpal){vd->mmap.width=width;vd->mmap.height=height;pal=vd->picture.palette;vd->mmap.format=pal;vd->frame_current=0;vd->frame_using[0]=FALSE;vd->frame_using[1]=FALSE;returnv4l_grab_frame(vd,0);}//真正获得图像函数externintv4l_grab_frame(v4l_device*,int);intv4l_grab_frame(v4l_device*vd,intframe){if(vd->frame_using[frame]){fprintf(stderr,"v4l_grab_frame:frame%disalreadyused.\n",frame);return-1;}vd->mmap.frame=frame;if(ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->mmap))<0){perror("v4l_grab_frame");return-1;}vd->frame_using[frame]=TRUE;vd->frame_current=frame;return0;}//在截取图像后还要进行同步操作,就是调用externintv4l_grab_sync(v4l_device*);该函数如下intv4l_grab_sync(v4l_device*vd){if(ioctl(vd->fd,VIDIOCSYNC,&(vd->frame_current))<0){perror("v4l_grab_sync");}vd->fram

温馨提示

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

评论

0/150

提交评论