硬件综合课程设计论文Word文档格式.docx
《硬件综合课程设计论文Word文档格式.docx》由会员分享,可在线阅读,更多相关《硬件综合课程设计论文Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
学生进行分组并选定课程设计题目,教师指导学生根据选定题目准备资料;
2.2012年6月6日~2012年6月8日,设计小组进行总体方案设计和任务分工;
每人完成自己承担的程序模块并通过独立编译;
3.2012年6月11日~2012年6月12日,设计小组将各模块集成为一个完整的系统,教师检查完成情况,并作相应指导;
4.2012年6月13日~2012年6月14日,设计小组准确完成系统的设计、编译与运行,并撰写课程设计报告;
5.2012年6月15日,验收、修订课程设计报告、答辩及总结。
四、基本要求
1.学生查阅相关资料,在师指导和自学两种方法下学习具体课题中涉及到的新知识,熟练掌握待设计的系统所涉及到的所有知识点。
2.学生在老师的指导下,能够写出相应的源程序代码,采用结构化、模块化程序设计方法,功能要完善,界面要美观。
3.所设计的系统原则上要能够运行无误,结果准确。
学生能够最终将系统所要实现的功能演示出来。
4.最后经验收合格后,按要求写出课程设计报告,并于设计结束后1周内提交。
教研室主任签名:
年月日
目录
一概述1
1.1简介1
1.2课程设计的目的1
1.3课程设计的要求2
1.4背景知识2
二总体方案设计5
2.1总体设计思路5
2.2算法设计思想5
2.3程序流程图6
2.4程序设计特点7
三详细设计8
3.1算法描述8
3.1.1解码并识别图片8
3.1.2像素点的显示10
3.1.3图片显示方式11
3.1.4主函数设计13
四程序的调试与运行结果说明14
4.1Linux系统的常用命令说明14
4.2代码调试15
4.3运行步骤结果16
4.3.1运行步骤16
4.3.2运行结果17
五课程设计总结20
参考文献22
一概述
1.1简介
嵌入式Linux是以Linux为基础的嵌入式作业系统,它被广泛应用在移动电话、个人数字助理(PDA)、媒体播放器、消费性电子产品以及航空航天等领域中。
嵌入式系统出现于60年代晚期,它最初被用于控制机电电话交换机,如今已被广泛的应用于工业制造、过程控制、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品等众多领域。
计算机系统核心CPU,每年在全球范围内的产量大概在二十亿颗左右,其中超过80%应用于各类专用性很强的嵌入式系统。
一般的说,凡是带有微处理器的专用软硬件系统都可以称为嵌入式系统。
嵌入式linux是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。
嵌入式linux既继承了Internet上无限的开放源代码资源,又具有嵌入式操作系统的特性。
嵌入式Linux的特点是版权费免费;
购买费用媒介成本技术支持全世界的自由软件开发者提供支持网络特性免费,而且性能优异,软件移植容易,代码开放,有许多应用软件支持,应用产品开发周期短,新产品上市迅速,因为有许多公开的代码可以参考和移植,实时性能RT_LinuxHardhatLinux等嵌入式Linux支持,实时性能稳定性好安全性好。
Linux操作系统具有相当多的优点,他的内核稳定、功能强大、支持多种硬件平台、源代码完全开放,可裁减和低成本的特性非常适合于嵌入式应用,并且Linux本身直接提供完整的TCP/IP协议,可非常方便地进行网络应用。
但Linux内核本身不具备强实时性,且内核体积较大,而且嵌入式系统的硬件资源有限,因此把Linux用于嵌入式系统,必须对Linux进行实时化和嵌入式化,即通过配置内核,裁减shell和嵌入式C库对系统定制,使整个系统能够存放到容量较小的FLASH中,Linux的动态模块加载,使Linux的裁减极为方便,高度模块化的部件使添加非常容易。
1.2课程设计的目的
1.3课程设计的要求
本次课程设计的目标是JPEG图片的动态显示,JPEG是JointPhotographicExpertsGroup(联合图像专家组)的缩写,文件后辍名为"
.jpg"
或"
.jpeg"
,是最常用的图像文件格式,由一个软件开发联合会组织制定,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。
尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。
但是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。
熟练掌握待设计的系统所涉及到的所有知识点。
所以我们得查阅相关资料,在老师指导和自学两种方法下学习具体课题中涉新的知识点主要包括,在Linux环境下运行C语言,包括编译、调试、运行,以及在试验箱上运行得到一致的试验结果。
熟练运用MakeFile文件提高编译效率。
设计过程中有以下要求:
1.能够写出相应的源程序代码,采用结构化、模块化程序设计方法,功能要完善,界面要美观。
2.所设计的系统原则上要能够运行无误,结果准确。
3.掌握Linux系统下的编程,包括对I/O函数的使用;
4.熟练掌握JPEG压缩的原理和源码包的使用。
5.掌握LCD显示原理、JPEG压缩原理;
6.了解Linux下jpeg源码包的安装和使用。
1.4背景知识
(1)LCD显示原理
LCD为英文LiquidCrystalDisplay的缩写,即液晶显示器,是一种数字显示技术,可以通过液晶和彩色过滤器过滤光源,在平面面板上产生图象。
与传统的阴极射线(CRT)相比,LCD占用空间小,低功耗,低辐射,无闪烁,降低视觉疲劳。
液晶的物理特性是:
当通电时导通,排列变的有秩序,使光线容易通过;
不通电时排列混乱,阻止光线通过。
让液晶如闸门般地阻隔或让光线穿透。
从技术上简单地说,液晶面板包含了两片相当精致的无钠玻璃素材,称为Substrates,中间夹著一层液晶。
当光束通过这层液晶时,液晶本身会排排站立或扭转呈不规则状,因而阻隔或使光束顺利通过。
大多数液晶都属于有机复合物,由长棒状的分子构成。
在自然状态下,这些棒状分子的长轴大致平行。
将液晶倒入一个经精良加工的开槽平面,液晶分子会顺着槽排列,所以假如那些槽非常平行,则各分子也是完全平行的。
LCD技术是把液晶灌入两个列有细槽的平面之间。
这两个平面上的槽互相垂直(相交成90度)。
也就是说,若一个平面上的分子南北向排列,则另一平面上的分子东西向排列,而位于两个平面之间的分子被强迫进入一种90度扭转的状态。
由于光线顺着分子的排列方向传播,所以光线经过液晶时也被扭转90度。
但当液晶上加一个电压时,分子便会重新垂直排列,使光线能直射出去,而不发生任何扭转。
LCD是依赖极化滤光器(片)和光线本身。
自然光线是朝四面八方随机发散的。
极化滤光器实际是一系列越来越细的平行线。
这些线形成一张网,阻断不与这些线平行的所有光线。
极化滤光器的线正好与第一个垂直,所以能完全阻断那些已经极化的光线。
只有两个滤光器的线完全平行,或者光线本身已扭转到与第二个极化滤光器相匹配,光线才得以穿透。
LCD正是由这样两个相互垂直的极化滤光器构成,所以在正常情况下应该阻断所有试图穿透的光线。
但是,由于两个滤光器之间充满了扭曲液晶,所以在光线穿出第一个滤光器后,会被液晶分子扭转90度,最后从第二个滤光器中穿出。
另一方面,若为液晶加一个电压,分子又会重新排列并完全平行,使光线不再扭转,所以正好被第二个滤光器挡住。
总之,加电将光线阻断,不加电则使光线射出。
然而,可以改变LCD中的液晶排列,使光线在加电时射出,而不加电时被阻断。
(2)JPEG图像压缩原理
JPEG(JointPhotographicExpertsGroup)是一个由ISO和IEC两个组织机构联合组成的一个专家组,负责制定静态的数字图像数据压缩编码标准,这个专家组开发的算法称为JPEG算法,并且成为国际上通用的标准,因此又称为JPEG标准。
JPEG是一个适用范围很广的静态图像数据压缩标准,既可用于灰度图像又可用于彩色图像。
JPEG专家组开发了两种基本的压缩算法,一种是采用以离散余弦变换(DiscreteCosineTransform,DCT)为基础的有损压缩算法,另一种是采用以预测技术为基础的无损压缩算法。
使用有损压缩算法时,在压缩比为25:
1的情况下,压缩后还原得到的图像与原始图像相比较,非图像专家难于找出它们之间的区别,因此得到了广泛的应用。
例如,在VCD和DVD-Video电视图像压缩技术中,就使用JPEG的有损压缩算法来取消空间方向上的冗余数据。
为了在保证图像质量的前提下进一步提高压缩比,近年来JPEG专家组正在制定JPEG2000标准,这个标准中将采用小波变换(Wavelet)算法。
JPEG压缩是有损压缩,它利用了人的视角系统的特性,使用量化和无损压缩编码相结合来去掉视角的冗余信息和数据本身的冗余信息。
(3)Linux下源码包的安装和使用
a.解开软件包查看帮助文档按说明将源码包安装好。
b.编译安装软件的条件;
首先我们在Linux系统中至少得把开发工具安装上,比如
gcc;
perl;
python;
glibc;
gtk;
make;
automake等开发工具或基础包;
还要安装一些相应的开发包,一般是文件名包括dev的,比如kernel-devel;
还有一些开发库,比如以lib开头的;
如果您在编译软件时,有时提示缺少什么东西之类的,大多少的是这些开发工具和开发库等;
从光盘中找出安装就是了;
有时光盘没有提供,请用google搜索相应的软件包,有时可能也会用到源码包编译安装所依赖的包;
有时本来系统中已经安装了所依赖的包,但系统提示找不到应该怎么办?
这时需要我们设置PKG_CONFIG_PATH的环境变量就行了;
#exportPKG_CONFIG_PATH=/usr/lib/pkgconfig或
#exportPKG_CONFIG_PATH=/usr/local/lib/pkgconfig
然后我们再来运行编译的./configure;
makeinstall
c.编译安装软件的方法;
大多以tar.gz和tar.bz2打包软件,大多是通过./configure;
makeinstall来安装的;
有的软件是直接make;
makeinstall;
我们可以通过./configure--help来查看配置软件的功能;
大多软件是提供./configure配置软件的功能的;
少数的也没有,如果没有的就不
用./configure;
直接make;
makeinstall就行了;
./configure比较重要的一个参数是--prefix,用--prefix参数,我们可以指定软件安装目录;
当我们不需要这个软件时,直接删除软件的目录就行了。
二总体方案设计
2.1总体设计思路
本系统设计要求完成一个在系统运行的开发板或实验箱上显示JPEG格式图片的动态显示设计,即当程序运行时可看到若干图片动态的切换出现。
因为显示的是jpeg格式的图片,我们不由想到JPEG格式的图片在显示过程中必定经过解码识别图片、像素点显示、图片显示这几个过程。
当文件在Linux操作系统下运行,在PC机上成功运行后,在Makefile文件中将模式改为RAM-Linux-gcc模式,将PC机与RAM实验箱连接,连接成功后,将需要运行的代码以及运行需要的图片下载到RAM实验箱上。
这时将在RAM实验箱上运行,可以看到JPEG格式的图片以动态的形式显示。
2.2算法设计思想
本次课程设计利用C语言实现其功能。
程序包含几个部分:
解码并识别图片、像素点的显示、图片显示方式以及主函数设计部分。
其中解码并识别图片用于识别不同位素的图片并相互转换。
像素点的显示部分用于显示图片。
程序要求实现连续以不同的方式显示JPEG格式的图片,即若干图片以不同的方式切换出现。
在此次设计中,我们设计了四种不同的方式显示图片,在主函数中我们直接调用图片显示函数,既isplay-jpeg()函数。
在我们设计时我们主要利用for循环控制像素点来实现图片的显示。
部分代码如下:
inti,j;
for(j=0;
j<
new_jpeg.w;
++j){
for(i=0;
i<
new_jpeg.h;
++i){
fb_pixel(pfb_inf,j,i,buf16[j+i*new_jpeg.w]);
当改变其中w和h时,宽和高改变了,像素点的显示方式也改变了,继而图片的显示方式也就发生变化。
所以为了以不同方式显示图片,只需要更改交换for循环中i,j两个变量,并适时做出相应的代码更改即可。
2.3程序流程图
图2-1程序主流程图
主流程图所示的是我们整个程序的详细流程,直接在主函数中调用相应的函数,以不同的方式显示图片。
2.4程序设计特点
本程序的主要特点是高度模块化,形式固定,灵活性较小,可变化性也比较小,要有改变只需改变display-jpeg这个模块,图片的显示方式变有所改变。
程序比较简单,易于理解,使人一目了然。
本设计完成了一个在系统运行的开发板或实验箱上显示JPEG格式图片的动态显示设计,当程序运行时可看到若干图片以不同的方式动态切换出现。
改变程序运行环境后便可以在实验箱上运行,在实验箱上便可以看到实验结果。
三详细设计
3.1算法描述
该程序设计利用C语言完成一个在系统运行的开发板或实验箱上动态显示JPEG格式图片,即当程序运行时可看到若干图片动态的切换出现。
设计过程中用到两种模式,即在Makefile文件中修改模式,Makefile文件部分代码如下:
CC=gcc
#CC=arm-linux-gcc
CFLAGS=-Wall-g-c-I/home/akaedu/jpeg-8b/
#-I../freetype-2.3.11/include
LDFLAGS=-L/home/akaedu/jpeg-8b/.libs/-ljpeg
#-L../freetype-2.3.11/objs/.libs-lfreetype-lpthread
当在虚拟机上运行时,模式为CC=gcc。
而当在实验箱上运行时,模式改为CC=arm-linux-gcc。
这时,虚拟机上不能正常执行。
3.1.1解码并识别图片
这部分包含图片RGB的各种位素的转换,包括24位与32位间的转换以及24位与16位之间的转化等。
分别以不同的位素显示图片,并且识别不同位素的JPEG格式的图片。
(1)24位转换为32位,代码如下:
u32_t*rgb24to32(u8_t*buf24,fb_infojpeg_inf)
{
intw=jpeg_inf.w;
inth=jpeg_inf.h;
u32_t*buf=malloc(w*h*4);
if(buf==NULL)returnNULL;
inti;
for(i=0;
w*h;
*((u8_t*)&
buf[i]+2)=buf24[i*3+0];
buf[i]+1)=buf24[i*3+1];
buf[i]+0)=buf24[i*3+2];
buf[i]+3)=0x00;
}
return(u32_t*)buf;
}
(2)24位转换为16位,代码如下:
u16_t*rgb24to16(u8_t*buf24,fb_infojpeg_inf)
u16_t*buf16=NULL;
u8_tr24,g24,b24;
u8_tr16,g16,b16;
u16_trgb16;
inti;
if((buf16=malloc(jpeg_inf.w*jpeg_inf.h*2))==NULL)
returnNULL;
for(i=0;
i<
jpeg_inf.w*jpeg_inf.h;
i++){
r24=buf24[i*3+0];
g24=buf24[i*3+1];
b24=buf24[i*3+2];
r16=r24>
>
3;
g16=g24>
2;
b16=b24>
rgb16=b16|(g16<
<
5)|(r16<
11);
buf16[i]=rgb16;
returnbuf16;
3.1.2像素点的显示
像素点的显示方式关系着图片以哪一种的方式出现,该实验的像素点的显示方式代码如下:
intfb_pixel(fb_info*pfb_inf,intx,inty,u16_tcolor)
u8_t*pos=(u8_t*)fb_inf.fbmem+(fb_inf.w*y+x)*fb_inf.bpp/8;
switch(fb_inf.bpp){
case32:
/*32bits*/
*(pos+3)=color>
24;
case24:
/*24bits*/
*(pos+2)=color>
16;
case16:
/*16bits*/
*(pos+1)=color>
8;
case8:
/*8bits*/
*pos=color;
return0;
default:
return-1;
return-1;
u16_t*pos=(u16_t*)(pfb_inf->
fbmem)+(pfb_inf->
w*y+x);
*pos=color;
return0;
/*paintinghorizontal*/
intfb_pixel_row(fb_info*pfb_inf,intx,inty,intlen,u32_tcolor)
for(i=x;
len;
i++){
fb_pixel(pfb_inf,x+i,y,color);
intfb_test(void)
printf("
FramebufferTest\n"
);
fb_infofb_inf;
if(init_fb(&
fb_inf)<
0)
FramebufferTestfb_pixel\n"
fb_pixel_row(&
fb_inf,0,200,1280,0xF800);
munmap(fb_inf.fbmem,fb_inf.w*fb_inf.h*fb_inf.bpp/8);
3.1.3图片显示方式
该程序是以不同的显示方式分别动态显示JPEG格式的图片,包括从左向右显示,从上到下显示,从中间向左右两边显示以及从中间到上下两边四种显示方式。
图片显示的代码如下:
1.第一种显示方式(从左向右):
intdisplay_jpeg(char*filename,fb_info*pfb_inf)
fb_infooriginal_jpeg;
/*originalsize*/
fb_infonew_jpeg;
new_jpeg=*pfb_inf;
/*screensize*/
u8_t*buf24=decode_jpeg(filename,&
original_jpeg);
u8_t*scale_buf=scale24(buf24,new_jpeg,original_jpeg);
u16_t*buf16=rgb24to16(scale_buf,new_jpeg);
inti,j;
}
usleep(400);
free(buf24);
free(scale_buf);
free(buf16);
当./main执行程序后,可以看到图片从左向右渐渐显示出来。
2.第二种显示方式(从上到下):
功能代码如下:
fb_pixel(pfb_inf,i,j,buf16[i+j*new_jpeg.h]);
当./main执行程序后,可以看到图片从左向右渐渐显示出来,逐渐覆盖之前的图片。
3.第三种显示方式(从中间向左右两边):
inti,j,k;
for(j=new_jpeg.w/2,k=new_jpeg.w/2;
--k,++j){
new