嵌入式课程设计报告Word文档下载推荐.docx

上传人:b****5 文档编号:17019211 上传时间:2022-11-27 格式:DOCX 页数:14 大小:36.11KB
下载 相关 举报
嵌入式课程设计报告Word文档下载推荐.docx_第1页
第1页 / 共14页
嵌入式课程设计报告Word文档下载推荐.docx_第2页
第2页 / 共14页
嵌入式课程设计报告Word文档下载推荐.docx_第3页
第3页 / 共14页
嵌入式课程设计报告Word文档下载推荐.docx_第4页
第4页 / 共14页
嵌入式课程设计报告Word文档下载推荐.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

嵌入式课程设计报告Word文档下载推荐.docx

《嵌入式课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计报告Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。

嵌入式课程设计报告Word文档下载推荐.docx

PC机操作系统REDHATLINUX9.0、MINICOM、AMR-LINUX开发环境。

四、设计方案

本次课程设计采用arm10开发平台。

该平台采用Samsung公司的处理器S3C2410。

该处理器内部集成了ARM公司ARM920T处理器核的32位微控制器,资源丰富,带独立的16KB的指令Cache和16KB数据Cache、LCD控制器、RAM控制器、NAND闪存控制器、3路UART、4路DMA、4路带PWM的Timer、并行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)在armlinux的kernel目录下makemenuconfig。

(2)首先(*)选择Multimediadevice->

下的Videoforlinux。

加载video4linux模块,为视频采集设备提供编程接口;

(3)然后在usbsupport->

目录下(*)选择supportforusb和usbcameraov511support。

这使得在内核中加入了对采用OV511接口芯片的USB数字摄像头的驱动支持。

(4)保存配置退出。

(5)makedep;

makezImage就生成了带有ov511驱动的内核。

接下来就通过uboot将内核烧到flash里去。

这时你将摄像头插上,系统就会提示发现摄像头-ov511+,这说明驱动正常。

:

-),驱动加载就成功了。

5.2安装jpeg库

在地址ftp:

//

#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编写的视频采集程序重要代码如下,下列代码包含采集编码程序一些关键函数。

(1)程序中定义的数据结构

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;

字串8

grab_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>

stdlib.h>

sys/types.h>

sys/stat.h>

fcntl.h>

sys/ioctl.h>

sys/mman.h>

errno.h>

linux/videodev.h>

jpeglib.h>

unistd.h>

math.h>

string.h>

signal.h>

pthread.h>

sys/time.h>

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));

}

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(&

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(&

fclose(fp);

/////////////////////////////////////////////////////////////////////

charfn1[30]="

/var/www/pic001.jpg"

;

charfn2[30]="

/var/www/pic002.jpg"

if(NULL==(fp=fopen(fn1,"

r"

))){

remove(fn1);

rename(fn2,fn1);

return0;

//这个函数很通用,它的作用是把buf中的数据压缩成jpeg格式。

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"

}

if(v4l_get_capability(vd))return-1;

if(v4l_get_picture(vd))return-1;

//这两个函数就是即将要完成的获取设备信息的函数

intv4l_get_capability(v4l_device*vd)

if(ioctl(vd->

fd,VIDIOCGCAP,&

(vd->

capability))<

0){

perror("

v4l_get_capability:

"

intv4l_get_picture(v4l_device*vd)

fd,VIDIOCGPICT,&

picture))<

v4l_get_picture:

intv4l_get_mbuf(v4l_device*vd)

fd,VIDIOCGMBUF,&

mbuf))<

v4l_get_mbuf:

intv4l_set_picture(v4l_device*vd,intbr,inthue,intcol,intcont,intwhite)

/*if(br)*/vd->

picture.brightness=25000;

/*if(hue)*/vd->

picture.hue=25000

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 社交礼仪

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1