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

下载本文档

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

文档简介

1、 嵌入式课程设计报告一、课程设计目的1.1 掌握linux开发环境的搭建; 1.2巩固嵌入式交叉编译的开发思想;1.3掌握嵌入式gui软件设计技。,.2、 课程设计要求输入信号为 1 路 av 视频信号,要求系统能对 1 路输入信号进行实时采集,数字化 处理,压缩,存储,要保证一定的录像质量. 根据设计题目的要求,选择确定 arm 芯片型号,视频采集芯片型号,完成系统硬件设 计和程序设计.3、 课程设计内容设计原理 arm10 系列微处理器为低功耗的 32 位 risc 处理器,最适合用于对价位和功耗要 求较高的消费类应用.arm10 系列微处理器的主要应用领域为:工业控制,internet

2、设备,调制解 调器设备,移动电话等多种多媒体和嵌入式应用. 视频监控系统总体设计 首先需要对系统进行总体规划,将系统划分成几个功能模块,确定各个模块的实现 方法.整个视频监控系统采用 c/s 结构,从主体上分为两部分:服务器端和客户端.服 务器端主要包括 s3c4510 平台上运行的采集,压缩,传输程序,客户端是 pc 机上运行 的接收,解压,回放程序.视频监控终端从摄像头捕获实时的视频信息,压缩之后通过 以太网传输到视频监控服务器上.视频图像采集和打包发送在服务器端完成,图像的接收 解包和回放将在客户端完成. 采集图像 数据压缩 打包发送 接收系统的硬件设计 系统采用模块化设计方案,主要包括

3、以下几个模块:主控制器模块,储存电路模块, 外围接口电路模块,电源和复位电路,s3c4510 主控器模块 主控器模块是整个系统的核心,采用的 s3c4510b 处理器.samsung 公司的 s3c45 10b 是基于以太网应用系统的高性价比 16/32 位 risc 微控制器,内含一个由 arm 公司设计的 16/32 位 arm7tdmi risc 处理器核,arm7tdmi 为低功耗,高性能的 16/32 核,系统存储电路模块 主控器还需一些外围存储单元如 nand flash,和 sdram.nand flash 中包含 lin ux 的 bootloader,系统内核,文件系统,应用

4、程序以及环境变量和系统配置文件等;s dram 读写速度快,系统运行时把它作为内存单元使用. 外围电路模块 外围电路主要是以下几个电路,复位电路图,电源电路图以及 jtag 电路,三、课程设计设备及工具硬件:up-netarm2410-s嵌入式实验仪、pc机、ov511摄像头;软件:pc机操作系统redhat linux 9.0、minicom、amr-linux开发环境。四、设计方案本次课程设计采用arm10开发平台。该平台采用samsung公司的处理器s3c2410。该处理器内部集成了arm公司 arm920t处理器核的32位微控制器,资源丰富,带独立的16kb的指令cache和16kb数

5、据cache、lcd控制器、ram控制器、nand 闪存控制器、3路uart、4路dma、4路带pwm的timer、并行i/o口、8路10位adc、touch screen接口、i2c接口、i2s接口、2个usb接口控制器、2路spi,主频最高可达203mhz。在处理器丰富资源的基础上,还进行了相关的配置和扩展,平台配置了16mb 16位的flash和64mb 32位的sdram。通过以太网控制器芯片dm9000e扩展了一个网口,另外引出了一个host usb接口。通过在usb接口上外接一个带usb口的摄像头,将采集到的视频图像数据放入输入缓冲区中。然后,对缓冲区中的视频数据进行压缩成帧,并把

6、每一帧图片在网页中显示出来,每秒钟刷新两次,得到一个动态的视频界面,然后通过局域网访问该主机的网页,得到网络视频信息。本次课程设计主要是完成得到视频图片及网页刷新的过程。本次设计要求在局域网环境中进行。五、开发环境配置5.1 摄像头驱动加载在linux下,设备驱动程序可以看成linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件实现了的细节,使得应用程序可以像操作普通文件一样来操作外部设备,可以使用和操作文件中相同的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和i/o控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。本系统平台使用的嵌入式arm-linux

7、系统在内核主要功能上与 linux操作系统没本质区别。video4linux(简v4l)是linux中关于视频设备的内核驱动,它为针对视频设备的应用程序编程提供一系列接口函数,这些视频设备包括现今市场上流行的tv卡、视频捕捉卡和usb摄像头等。ov511的驱动,2.4的内核中就有,所以我们只需重新编译内核,将下边的选项都选上,然后重新烧写内核就可以了。也就是直接静态加载。(1)在arm linux的kernel目录下make menuconfig。(2)首先(*)选择multimedia device-下的video for linux。加载video4linux模块,为视频采集设备提供编程接

8、口;(3)然后在usb support-目录下(*)选择support for usb和usb camera ov511 support。这使得在内核中加入了对采用ov511接口芯片的usb数字摄像头的驱动支持。(4)保存配置退出。(5)make dep;make zimage就生成了带有ov511 驱动的内核。接下来就通过uboot将内核烧到flash里去。这时你将摄像头插上,系统就会提示发现摄像头-ov511+,这说明驱动正常。:-),驱动加载就成功了。5.2 安装jpeg库在地址ftp:/# tar -zxvf jpegsrc.v6b.tar.gz /解压库文件# cd jpeg-6b#

9、 ./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 /建立生成安装文件的目录#make install -lib /生成安

10、装文件#make install /开始安装文件6、 设计过程6.1 硬件设计系统的主体设计思想是将视频前端和嵌入式web服务器整合在一起,摄像头通过usb接口和嵌入式系统板的usb host相连,摄像头采集来的视频信号经过压缩后,通过内部总线传送到内置的web服务器,客户端采用浏览器/服务器结构(即b/s结构),可以通过ie浏览器访问视频web服务器,以便查看所监控的视频画面,而且,用户还可以控制平台对镜头的动作或对系统进行配置控制。网络视频采集系统是由视频监控终端和视频监控中心组成,终端使用嵌入式系统加上usb摄像头,在linux操作系统上运行usb摄像头的驱动和相应的视频采集处理传输程序

11、,得到视频监控画面,并画面通过网络传输,监控中心运行监控软件端,通过internet浏览器来浏览终端送来的监控画面,其硬件连接图如下所示:网络视频采集硬件连接图从图中可以看出,pc机部分可以直接采用ie浏览器,不需要在pc机上运行其他的软件,主要设计工作是开发板端的设计。视频监控终端主要有两个部分组成,硬件部分包括摄像头和开发平台的选择;软件部分包括系统级软件(boot loader,嵌入式操作系统,usb驱动程序)与用户级软件(应用程序)。6.2 软件设计video4linux为应用程序提供了一系列的接口函数,通过这些函数,可以执行打开、读写、关闭等基本操作。设备驱动提供了read、writ

12、e、open、close等函数的具体实现,在内核这些函数都可以调用。视频采集流程图如下所示:视频采集流程图利用v4l编写的视频采集程序重要代码如下,下列代码包含采集编码程序一些关键函数。(1) 程序中定义的数据结构struct _v4l_struct int fd; / 保存打开视频文件的设备描述符 struct video_capability capability;struct video_picture picture; struct video_mmap mmap; struct video_mbuf mbuf; unsigned char *map; / 用于指向图像数据的指针 in

13、t frame_current; int frame_usingvideo_max_frame; / 这两个变量用于双缓冲 ; typedef struct _v4l_struct v4l_device; 这些数据结构都是由video4linux支持的,它们的用途如下:*video_capability包含摄像头的基本信息,例如设备名称、支持的最大最小分辨率、信号源信息等;*voide_picture包含设备采集图像的各种属性,如brightness(亮度)、hue(色调)、contrast(对比度)、whiteness(色度)、color(深度)等;*video_mmap用于内存映射;*vo

14、ido_mbuf利用mmap进行映射的帧信息,实际上是输入到摄像头存储器缓冲中的帧信息,包括size(帧的大小)、frames(最多支持的帧数)、offsets(每帧相对基址的偏移)。程序中用到的主要系统调用函数有:open(/dev/voideo0,int flags)、close(fd)、mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset)、munmap(void *start,size_tlength)和ioctl(int fd,int cmd,)。前面提到linux系统中把设备看成设备文件,在用户空

15、间可以通过标准的i/o系统调用函数操作设备文件,从而达到与设备通信交互的目的。当然,在设备驱动中要提供对这些函数的相应支持。这里说明一下ioctl(int fd,int cmd,)函数,它在用户程序中用来控制i/o通道,其中,fd代表设备文件描述符,cmd代表用户程序对设备的控制命令,省略号一般是一个表示类型长度的参数,也可没有。(2)采集程序实现过程首先打开视频设备,摄像头在系统中对应的设备文件为/dev/video0,采用系统调用函数grab_fd =open (/dev/video0,o_rdwr),grab_fd是设备打开后返回的文件描述符(打开错误返回-1),以后的系统调用函数就可使

16、用它来对设备文件进行操作了。接着,利用ioct1(grab_fd,vidiocgcap,&grab_cap)函数读取struct video_capability中有关摄像头的信息。该函数成功返回后,这些信息从内核空间拷贝到用户程序空间grab_cap各成员分量中,使用 printf函数就可得到各成员分量信息,例如printf(maxheight=%d,grab_fd.maxheight)获得最大垂直分辨率的大小。不规则用ioct1(grab_fd,vidiocgpict,&grab_pic)函数读取摄像头缓冲中voideo_picture信息。在用户空间程序中可以改变这些信息,具体方法为先给

17、分量赋新值,再调用vidiocspict ioct1函数,例如:grab_fd.depth=3;if(ioct1(grab_fd,vidiocspict,&grab_pic)0)perror(vidiocspict);return -1;完成以上初始化设备工作后,就可以对视频图像截取了,有两种方法:一种是read()直接读取;另外一种 mmap()内存映射。read ()通过内核缓冲区来读取数据;而mmap()通过把设备文件映射到内存中,绕过了内核缓冲区,最快的磁盘访问往往还是慢于最慢的内存访问,所以mmap ()方式加速了i/o访问。另外,mmap()系统调用使得进程之间通过映射同一文件实现

18、共享内存,各进程可以像访问普通内存一样对文件进行访问,访问时只需要使用指针而不用调用文件操作函数。因为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

19、;接着把摄像头对应的设备文件映射到内存区,具体使用grab_data=(unsigned char*) mmap(0,grab_vm.size,prot_read|prot_write,map_shared,grad_fd,0)操作。这样设备文件的内容就映射到内存区,该映射内容区可读可写并且不同进程间可共享。该函数成功时返回映像内存区的指针,挫败时返回值为-1。下面对单帧采集和连续帧采集进行说明:*单帧采集。在上面获取的摄像头存储缓冲区帧信息中,最多可支持的帧数(frames的值)一般为两帧。对于单帧采集只需设置 grab_buf.frame=0,即采集其中的第一帧,使用ioctl(grab_

20、fd,vidiocmcapture,&grab_buf) 函数,若调用成功,则激活设备真正开始一帧图像的截取,是非阻塞的。接着使用ioct1(grab_fd,vidiocsync,&frame) 函数判定该帧图像是否截取完毕,成功返回表示截取完毕,之后就可把图像数据保存成文件的形式。7、 测试与实现(1)仔细检查设备的连接,打开电源;(2)在pc机上的浏览器中地址栏输入开发板地址,网页自动跳到开发板的首页;(3)在页面上可见摄像头采集到的视频信息。经验证,本次设计基本达到设计要求。8、 设计心得本次课程设计通过运用嵌入式技术,图形处理技术等,完成了网络视频的采集过程,进一步熟悉了交叉编译的开发

21、方法,在开发的过程中,遇到很多问题,如驱动无法加载,程序调试出错等,通过重新编译开发板内核、安装图形处理库等,解决了多个问题,在解决问题的过程中,我们对嵌入式的开发过程多了一些细节的认识,为以后的持续学习巩固了基础。在设计过程中,我们分工合作,一起进步,不只从理论上对嵌入式有了更深的认识,同时从实践中验证了学习的理论知识,对嵌入式有了更深一步的认识。9、 源程序清单#include #include #include #include #include #include #include #include #include #include #include #include #include

22、 #include #include #include #include #include #include #define width 640#define height 480#define default_device /dev/v4l/video1int write_jpeg(char *filename,unsigned char *buf,int quality,int width, int height, int gray)struct jpeg_compress_struct cinfo;struct jpeg_error_mgr jerr;file *fp;int i;uns

23、igned char *line;int line_length;if (null = (fp = fopen(filename,w)fprintf(stderr,grab: cant open %s: %sn,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_co

24、mponents = 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 fd=open(dev,o_rdwr)fd, vidiocgcap, &(vd-capability) fd, vid

25、iocgpict, &(vd-picture) fd, vidiocgmbuf ,&(vd-mbuf) 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)fd,&(vd-map),size)=0)retu

26、rn -1; return 0; int v4l_mmap_init(v4l_device *vd) if (v4l_get_mbuf(vd) map = mmap(0, vd-mbuf.size, prot_read|prot_write, map_shared, vd-fd, 0) mmap.width = width;vd-mmap.height = height;pal= vd-picture.palette;vd-mmap.format=pal;待添加的隐藏文字内容3vd-frame_current = 0; vd-frame_using0 = false;vd-frame_usin

27、g1 = false;return v4l_grab_frame(vd, 0); /真正获得图像的函数 extern int v4l_grab_frame(v4l_device *, int); int v4l_grab_frame(v4l_device *vd, int frame) if (vd-frame_usingframe) fprintf(stderr, v4l_grab_frame: frame %d is already used.n, frame);return -1;vd-mmap.frame = frame;if (ioctl(vd-fd, vidiocmcapture,

28、 &(vd-mmap) frame_usingframe = true;vd-frame_current = frame;return 0;/在截取图像后还要进行同步操作,就是调用 extern int v4l_grab_sync(v4l_device *); 该函数如下 int v4l_grab_sync(v4l_device *vd)if (ioctl(vd-fd, vidiocsync, &(vd-frame_current) frame_usingvd-frame_current = false;return 0;int v4l_close(v4l_device *vd) close(vd-fd);return 0;/该函数返回 0 说明你想要获取的图像帧已经获取完毕。 /图像的位置,存在 vd.map+vd.mbuf.offsetsvd.frame_current 处。其中 vd.frame_curr

温馨提示

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

评论

0/150

提交评论