ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:194.44KB ,
资源ID:7661185      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7661185.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式课程设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式课程设计.docx

1、嵌入式课程设计 课 程 设 计题目:嵌入式应用专业:电子信息工程学号:.姓名:.指导老师:.时间:. 目 录一、设计课题2二、设计目的2三、设计任务及原理2四、总体方案设计及工作流程3五、各环节实现分析说明4六、调试过程及调试记录11七、总结体会14一、设计课题:基于S3C2440的视频采集及其传输二、设计目的:1进一步巩固嵌入式系统的基本知识;2掌握嵌入式应用系统的基本结构;3掌握嵌入式系统开发环境建立和使用;4掌握嵌入式系统中V4L的驱动结构;5掌握JPEG图片格式和RGB格式之间的编解码;6掌握以太网的Socket程序的设计调试;7学会查阅有关专业资料及设计手册;三、设计任务及原理:1掌

2、握嵌入式系统的Linux开发环境建立和使用;2掌握Linux下驱动、应用程序的设计和调试;2.1 对进行OV9650驱动程序的设计,通过camera接口进行图像获取2.2 实现YUV422视频格式的压缩与转换2.3 socket通信进行图片传输,将本地图片传输到PC端3掌握基于Frambuffer的应用程序设计,将采集的图片显示在本地LCD屏。 总体要求如上述第2点所述,TQ2440采集图像,经过格式转换,在TQ2440平台的LCD上进行显示,同时将采集的图像压缩成,通过以太网将图片传送到电脑平台。通过电脑平台的操控,可控制嵌入式平台图像的采集参数。4控制图像采集的主要参数有:VIDIOCSW

3、IN:设置捕捉源的大小VIDIOCSCAPTURE:设置目标图像大小(不得超过源大小)VIDIOCCAPTURE:设置采集启动停止 5编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;设计成果应包括各阶段的屏幕截图、运行结果、现象说明和原理分析。四、总体方案设计及工作流程本次课程设计要求是基于S3C2440的视频采集及其传输,硬件环境由现成设备搭建无需自己设计,主要包括摄像头、TQ2440实验平台以及PC机。软件设计包括开发环境搭建、驱动程序设计、应用程序设计及最终调试这几个环节。其中驱动程序设计主要有:1、OV9650配置的实现.2、TQ2440摄像头C通道采集的实现

4、.3、OV9650源数据的DMA操作.4、V4L结构及参数的实现。运用开发设计包含:1、YUV格式数据的获取.2实现YUV数据到RGB的转换并显示3、同时实现YUV数据的压缩保存为jpej图片.4利用socket编程实现ARM和PC机图片传输。系统实现工作流程图如下:五、各环节实现分析说明1、硬件及开发环境搭建 硬件连接结构camera控制器:Preview通道可以将YCbCr4:2:2格式的图像转换为RGB(16bit或24bit)格式的数据,并存放于 为Preview DMA分配的内存中,最大分辨率为640*480。主要用于本地液晶屏显示。如果将Preview DMA的内存和Framebu

5、ffer内存重叠的话,就可以实现采集直接输出到液晶屏上了。Codec通道可以输出YCbCr4:2:0或YCbCr4:2:2格式到为Codec DMA分配的内存中。最大分辨率为4096*4096。主要用于图像的编解码处理。2、驱动及应用软件开发2.1基于V4L2视频驱动主要涉及到以下几个方面2.1.1、摄像头 要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。2.1.2、 Camera解码器、控制器 如果摄像头是模拟量输出的,要熟悉解码器的配置。最后数字视频信号进入camera控制器后,还要熟悉camera控制器的操作。2.1.3、V4L2的API和数据结构 编写驱

6、动前要熟悉应用程序访问V4L2的方法及设计到的数据结构。2.1.4、V4L2的驱动架构 最后编写出符合V4L2规范的视频驱动。视频驱动的整体框架见下图:(1)、V4L2 驱动注册、注销函数 (2)、struct video_device 的构建 (3)、Video 核心层的实现2.2应用软件操作流程( 1 )打开设备文件 int fd = open(Devicename,mode); Devicename : /dev/video0 、 /dev/video1 Mode : O_RDWR | O_NONBLOCK 如果使用非阻塞模式调用视频设备,则当没有可用的视频数据时,不会阻塞,而立刻返回。

7、 ( 2 )取得设备的 capability struct v4l2_capability capability ; int ret = ioctl(fd, VIDIOC_QUERYCAP, &capability); 看看设备具有什么功能,比如是否具有视频输入特性。 ( 3 )选择视频输入 struct v4l2_input input ; 初始化 input int ret = ioctl(fd, VIDIOC_QUERYCAP, &input); 一个视频设备可以有多个视频输入。如果只有一路输入,这个功能可以没有。 ( 4 )检测视频支持的制式 v4l2_std_id std; do r

8、et = ioctl(fd, VIDIOC_QUERYSTD, &std); while (ret = -1 & errno = EAGAIN); switch (std) case V4L2_STD_NTSC: / case V4L2_STD_PAL: / ( 5 )设置视频捕获格式struct v4l2_format fmt; fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY; fmt.fmt.pix.height = height; fmt.fmt.pix.width =

9、width; fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; ret = ioctl(fd, VIDIOC_S_FMT, &fmt); if(ret) perror(VIDIOC_S_FMTn); close(fd); return -1; ( 6 )向驱动申请帧缓存 struct v4l2_requestbuffers req; if (ioctl(fd, VIDIOC_REQBUFS, &req) = -1) return -1; v4l2_requestbuffers 结构中定义了缓存的数量,驱动会据此申请对应数量的视频缓存。多个缓存可以用于建立 F

10、IFO ,来提高视频采集的效率。 ( 7 )获取每个缓存的信息,并 mmap 到用户空间 typedef struct VideoBuffer void *start; size_t length; VideoBuffer; VideoBuffer* buffers = calloc( req.count, sizeof(*buffers) ); struct v4l2_buffer buf; for (numBufs = 0; numBufs req.count; numBufs+) / 映射所有的缓存 memset( &buf, 0, sizeof(buf) ); buf.type = V

11、4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = numBufs; if (ioctl( fd, VIDIOC_QUERYBUF, &buf) = -1) / 获取到对应 index 的缓存信息,此处主要利用 length 信息及 offset 信息来完成后面的 mmap 操作。 return -1; buffersnumBufs.length = buf.length; / 转换成相对地址 buffersnumBufs.start = mmap(NULL, buf.length, PROT_READ

12、| PROT_WRITE, MAP_SHARED, fd, buf.m.offset); if (buffersnumBufs.start = MAP_FAILED) return -1; ( 8 )开始采集视频 int buf_type= V4L2_BUF_TYPE_VIDEO_CAPTURE ; int ret = ioctl(fd, VIDIOC_STREAMON, &buf_type); ( 9 )取出 FIFO 缓存中已经采样的帧缓存 struct v4l2_buffer buf; memset(&buf,0,sizeof(buf); buf.type=V4L2_BUF_TYPE_V

13、IDEO_CAPTURE; buf.memory=V4L2_MEMORY_MMAP; buf.index=0;/ 此值由下面的 ioctl 返回 if (ioctl(fd, VIDIOC_DQBUF, &buf) = -1) return -1; 根据返回的 buf.index 找到对应的 mmap 映射好的缓存,取出视频数据。 ( 10 )将刚刚处理完的缓冲重新入队列尾,这样可以循环采集 if (ioctl(fd, VIDIOC_QBUF, &buf) = -1) return -1; ( 11 )停止视频的采集 int ret = ioctl(fd, VIDIOC_STREAMOFF, &

14、buf_type); ( 12 )关闭视频设备 close(fd); 2.3、JPEG编解码基本过程2.3.1、JPEG编码过程:a、RGB格式转换为YUV格式b、将图像8*8分块c、离散余弦变换(DCT)d、量化(quantization)e、Z字形编码(zigzag scan)f、使用行程长度编码(RLE)对交流系数(AC)进行编码g、熵编码2.3.2、JPEG解码的主要过程:a、读入文件的相关信息b、MCU中颜色分量(Y,U,V)的解码c、直流系数的差分编码d、反量化e、反Zig-zag编码f、反离散余弦变换f、YCrCb向RGB转换。2.4、socket编程socket是网络编程的一种

15、接口,它是一种特殊的I/O,用socket函数建立一个Socket连接,此函数返回一个整型的socket描述符,随后进行数据传输。通常socket分为三种类型:流式socket、数据报socket、原始socket。Socket编程流程图:本地地址绑定Bind六、调试过程及调试记录1、环境搭建:(1)如图所示搭建硬件连接:(2)、pc机安装Ubuntu,交叉编译等相关环境的搭建.(3)、TQ2440开发板内核移植,内核版本为。交叉编译环境的安装配置步骤:a、将交叉编译器的压缩包(arm-linux-gcc-4.4.3.tar.gz)拷贝到linux环境下b、解压缩:tar -zvxf arm-

16、linux-gcc-4.4.3.tar.gzc、进入解压文件opt/FriedlyARM/toolschain/4.4.3/bin目录,复制目录路径d、添加环境变量,进入/etc目录,打开profile(vim profile)末尾添加export PATH=$PATH:opt/FriedlyARM/toolschain/4.4.3/bin保存退出e、执行source profilef、用arm-linux-gcc -v指令查看是否配置成功内核移植:a、解压b、c、执行make menuconfig进行相应配置d、make生成zImagee、将zImage下载到开发板2、驱动的挂载 编译驱动模

17、块:进入驱动模块所在目录,执行make生成cam_ov9650.ko,将cam_ov9650.ko通过超级终端发送到开发板上。 通过超级终端进入cam_ov9650.ko所在目录,执行insmod cam_ov9650.ko将驱动模块挂载上去。3、应用程序编译执行及socket服务建立 进入应用程序所在目录,执行make生成名为test的可执行文件,同样用超级终端发送到开发板。编译socket客户端、服务端程序,将客户端可执行文件发送至开发板上test所在目录。将ubuntu的IP地址改为和开发的IP地址在同一网段内ifconfig eth0 192.168.1.22。4、启动系统 在ubun

18、tu下运行socket服务端执行./server,开发板上运行test执行./test。5、调试过程中遇到的问题及解决 (1)调试过程中,第一次编译内核时出错。经查发现交叉编译器没有搭建,搭建交叉编译器后再次编译内核成功。(2)内核移植成功后,在挂载驱动时发现不能挂载,请教同学后,做出了如下修改:目录linux-2.6.25.8/include/asm-arm# vi elf.h 添加#define R_ARM_V4BX 40目录opt/EmbedSky/linux-2.6.25.8/arch/arm/kernel# vim module.c(134行添加如下代码) case R_ARM_V4

19、BX: *(u32 *)loc &=0xf000000f; *(u32 *)loc |=0x01a0f000; break;修改后再次编译移植成功挂载驱动。 (3)网络编程过程中未将机子与开发板的IP地址绑定一致,导致无法成功连接。后来经过认真分析网络传输过程找到了错误并成功调试。七、心得体会 这次的课程设计一开始是先将老师给的材料学习一遍做到能够基本的懂得大致的步骤和原理。首先是驱动程序的设计,然后是视频编解码及Socket编程的实现,最后是软硬件的调试。通过这次的课程设计掌握了嵌入式开发环境的搭建,对交叉编译器建立、内核移植等相关环境建立、移植操的作更加熟练,对整个嵌入式系统开发流程也有了较好的把握。学会了驱动模块编写的基本框架以及socket网络编程的相关认识,系统和软件调试查错能力也得到极大的提升。虽说过程中也暴露出一些问题比如说某些知识掌握不牢、范一些低级错误等,但好在都能及时发现并改正记下以避免下次出现同样问题。

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

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