资源描述
内蒙古工业大学信息工程学院
嵌入式系统综合设计说明书
题 目: 电子相框
学生姓名: 郭伟
组 别: 第四组
学 院: 信息工程学院
班 级: 计07-3
指导教师: 刘志强 王小强 邢文朋 郭文茂
二O一O 年 十二 月 十三 日
目录
设计任务与要求 1
设计功能 1
设计思路 1
软件设计 2
源程序清单与注释 2
图片特效函数文件清单 2
Main文件程序清单 4
调试过程 6
实验步骤 6
出现问题 6
解决方法 6
体会 7
设计任务与要求
设计功能
该课程设计的主要内容是:在linux(ubuntu版本)嵌入式系统下利用C语言开发一个具有多样式动态特效的电子相框,要求对图片或文字的效果处理。
设计思路
在应用程序中,先用 FrameBuffer设备(/dev/fb0)映射到进程地址空间(即:锁定屏幕各像素点),再进行 mmap 系统调用进行地址映射(在屏幕上打点),随后用 memset 将屏幕清空。通过freetype库中函数的font可设置和控制字体样式,采用jpeg-8算法解压缩图片。采用C语言的过程设计方法来实现流程的控制和实现图片特效设计。使用回调函数实现图片的动态循环调用,并利用双缓存技术实现图片显示的优化,以提高效率,消除图片显示时因为不同步所导致的抖动现象。
软件设计
源程序清单与注释
图片特效函数文件清单
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include "common.h"
#define DEBUG 0
#if DEBUG
#endif
//点到圆
int display_jpeg4(char *filename, fb_info fb_inf)
{
fb_info jpeg_inf;
u8_t *buf24 = decode_jpeg(filename, &jpeg_inf);
u8_t * scale_buf = scale24(buf24, fb_inf, jpeg_inf);
u32_t *buf32 = rgb24to32(scale_buf, fb_inf);
int i;
int j;
int k;
int x=fb_inf.w/2;
int y=fb_inf.h/2;
int r=0;
for(i = 0; i < fb_inf.h; ++i){
for (j = 0; j < fb_inf.w; ++j){
fb_pixel(fb_inf, j, i, 0x050505);
}
}
while(r<=fb_inf.h/2){
for(i=x+r;i>=x;i--){
for(j=y;j>=y-r;j--){
k=(x-i)*(x-i)+(y-j)*(y-j);
if(r*r>=k){
fb_pixel(fb_inf,i, j, buf32[i + j * fb_inf.w]);}
}
}
for(i=x-r;i<=x;i++){
for(j=y;j>=y-r;j--){
k=(x-i)*(x-i)+(y-j)*(y-j);
if(r*r>=k){
fb_pixel(fb_inf,i, j, buf32[i + j * fb_inf.w]);}
}
}
for(i=x-r;i<=x;i++){
for(j=y;j<=y+r;j++){
k=(x-i)*(x-i)+(y-j)*(y-j);
if(r*r>=k){
fb_pixel(fb_inf,i, j, buf32[i + j * fb_inf.w]);}
}
}
for(i=x+r;i>=x;i--){
for(j=y;j<=y+r;j++){
k=(x-i)*(x-i)+(y-j)*(y-j);
if(r*r>=k){
fb_pixel(fb_inf,i, j, buf32[i + j * fb_inf.w]);}
}
}
r=r+2;
usleep(2000);
}
usleep(1000);
free(buf24);
free(scale_buf);
free(buf32);
return 0;
}
//由两边向中间靠拢
int display_jpeg12(char *filename,fb_info fb_inf)
{
fb_info jpeg_inf;
u8_t *buf24=decode_jpeg(filename,&jpeg_inf);
u8_t *scale_buf=scale24(buf24, fb_inf,jpeg_inf);
u32_t *buf32=rgb24to32(scale_buf,fb_inf);
int i,j,k;
int a=fb_inf.h/2;
int b=fb_inf.w/2;
for(i= 0; i < fb_inf.h; ++i){
for (j = 0; j < fb_inf.w; ++j){
fb_pixel(fb_inf, j, i, 0x050505);
}
}
//fb_pixel(fb_inf,b,a,buf32[b+a*fb_inf.w]);
for(k=a;k>0;k--)
{
for(j=b-k;j<b+k;j++) fb_pixel(fb_inf,j,a-k,buf32[j+(a-k)*fb_inf.w]);
for(i=a-k;i<a+k;i++) fb_pixel(fb_inf,b+k,i,buf32[b+k+i*fb_inf.w]);
for(j=b+k;j>=b-k;j--) fb_pixel(fb_inf,j,a+k-1,buf32[j+(a+k-1)*fb_inf.w]);
for(i=a+k-1;i>=a-k;i--) fb_pixel(fb_inf,b-k,i,buf32[b-k+i*fb_inf.w]);
usleep(1000);
}
free(buf24);
free(scale_buf);
free(buf32);
return 0;
}
Main文件程序清单
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "common.h"
int main(int argc, char *argv[])
{
char * filename;
void * node;
char fullname[256];
if (argc < 2)
argv[1] = "test.jpg";
fb_info fb_inf;
if (init_fb(&fb_inf) < 0){
fprintf(stderr, "Error initial framebuffer\n");
return 1;
}
#if 1 if (init_ft("mao.ttf", 0) != 0){
fprintf(stderr, "Error initial font\n") ;
return 1;
}
#endif
init_link("image");
node = get_first_node();
int count=0;
while(node)
{
node = get_next(node);
filename = get_node_name(node);
strcpy(fullname, "image/");
switch(count%2) {
case 1:
display_jpeg_su1(strcat(fullname,filename), fb_inf);
break;
case 2:
display_jpeg_su2(strcat(fullname,filename), fb_inf);
break;
count++;
if(count ==10) count = 0;
}
munmap(fb_inf.fbmem, fb_inf.w * fb_inf.h * fb_inf.bpp / 8);
return 0;
}
调试过程
实验步骤
进入linux环境,并启动一个终端实例:
1. 将文件freetype-2.3.11.tar.bz2解压,在终端中输入命令,使其转换到刚被解压的目录下,输入命令./configure,检查文件是否缺失,然后输入make命令。
2. 将文件jpegsrc.v8.tar.gz解压,在终端中输入命令,使其转换到刚被解压的目录下,输入命令./configure,检查文件是否缺失,然后输入make命令。
3. 将文件src-teach.tar.gz解压,在终端中输入命令。
4. 修改src-teach文件夹中的文件disp-jpeg.c的内容,将设计的图片特效函数添加进去。使其转换到刚被解压的目录下,输入命令source dpf.sh创建一个新进程,然后输入命令make(使GCC编译器对MAKEFILE文件进行编译、链接处理)并回车。输入./main即可执行程序。
出现的问题
1 在显示时还能看到上一种效果的痕迹 2.程序运行中出现段错误,是由于超出屏幕可显示范围。
3.回调函数问题的理解及运用。
解决的方法
1.在每个显示后加刷黑屏
2.出现段错误的原因是程序中所要打印的像素点超出了图片的像素范围。浮点数错误重要是因为所定义的数据类型在程序执行中产生了越界问题。
3.回调函数实际上就是在调用某个函数(通常是API函数)时,将自己一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数。
体会
通过本次实习,让我真正的认识到合作和分工的重要性。在实习的过程中,在大家的共同努力下实现了一个又一个的效果,,我们感觉到很欣慰,展现在我们面前的劳动成果有:圆形,百叶窗,三角形等。通过这次实习,我们熟悉了LINUX下的编程,熟悉了嵌入式开发的过程,也复习了C语言的一些知识,真是不虚此行。用 C语言(高级语言中的较低端语言) 写的程序执行速度很快。 C 是所有版本的UNIX上的系统语言。通过对回调函数的使用,流程控制语句以及一些数学函数的使用,初步掌握了用C语言对一些几何图形的画法。对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核心的执行时间减少到最低限度。
通过本次实验让我们懂了很多,许多以前学的东西得到了应用,加深了了解
懂得了所学在实际中的应用,我们学的还是有用的。加强了我们的信心 。这次实训值了,很有意义。
9
展开阅读全文