基于某嵌入式系统地工程实训报告材料.docx
- 文档编号:29678202
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:36
- 大小:181.69KB
基于某嵌入式系统地工程实训报告材料.docx
《基于某嵌入式系统地工程实训报告材料.docx》由会员分享,可在线阅读,更多相关《基于某嵌入式系统地工程实训报告材料.docx(36页珍藏版)》请在冰豆网上搜索。
基于某嵌入式系统地工程实训报告材料
等级:
工程实践训练
项目名称物联网应用
专业班级自动化1301
姓名黄奎伦
学号201301020129
指导教师汪超,谢一峰(粤嵌)
2016年12月24日
心得体会22
电气信息学院工程实践训练评分标准23
第1章实训目的与任务
1.1工程实践训练目的
本次自动化工程实践训练第一部分是实训装置的使用说明,讲述了系统的组成、硬件的特点和技术指标、软件的使用介绍。
第二部分是实训项目部分,叙述了实训的原理、步骤及注意事项等。
通过对实训装置各个仪表的原理、工作情况及实验原理、软硬件的详细介绍,通过实际操作让我们对复杂过程控制系统实训装置有一个充分的认识,又有益于我们对工业生产现场控制系统的了解。
培养学生的工程实践能力,进一步提高学生分析和解决实际问题的能力。
1.2实训项目要求
轻松的益智游戏对缓解生活压力调节情绪具有重要的意义。
《2048》这款小游戏是一款流行的数字游戏,游戏设计初衷是一款益智类的游戏,其特点在于轻松,简单,有趣。
因此,开发要求做到各项功能要完备、操作要简便、易学易用。
所以本周的工程实训要求自己设计一个2048小游戏,以及学习关于嵌入式的基本入门知识。
第2章知识点总结
2.1嵌入式系统
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁减,以适应应用系统对功能、可靠性、成本、体积和功耗等有严格要求的专用计算机系统。
2.2Linux操作系统介绍
Linux是一套免费使用和自由传播的类UNIX操作系统,其创始人为美国著名黑客--林纳斯·托瓦兹。
它能运行主要的UNIX工具软件、应用程序和网络协议,且支持32位和64位硬件,是一个性能稳定的多用户网络操作系统。
操作系统:
操作系统是计算机系统中最基本的系统软件,它用于有效地管理系统资源,并为用户使用计算机提供了便利的环境。
ubuntu是一个基于linux的免费开源桌面PC操作系统。
2.3交叉开发
一般来说,研发嵌入式产品,由于从产品成本及功能专用性角度出发考虑。
嵌入式产品一般只有程序的运行环境,而并没有程序的编译开发环境。
所以,我们一般在通用电脑上用各种编译开发软件把程序编译调试好后,再下载到开发板或相关产品上去运行。
这个过程,我们称之为交叉开发。
2.4SecureCRT的设置与连接
(1)获取连接上的端口号
用串口线连接好开发板后,启动开发板。
在设备管理器中,查找识别出的端口。
若不能正确识别端口(有感叹号),则需要安装驱动。
(2)SecureCRT的设置
点击快速连接,并进行设置
a.协议:
Serial
b.端口:
你电脑识别出的端口号
c.波特率:
115200
d.把数据流控制中的RTS/CTS(R)勾去掉
其它保持默认设置
2.5C程序的交叉编译及运行
由于ARM处理器与Inter处理器其设计架构有本质区别。
所以要在arm开发板上运行的程序,则必须要用专用的编译器来编译。
(1)在文本编辑软件中编写好C源代码文件,并保存到共享文件夹中。
===>hello.c
(2)在Ubuntu系统的共享目录中,用arm-linux-gcc编译器对hello.c进行编译,使生成一个可执行程序。
arm-linux-gcchello.c–ohello
===>hello
(3)下载到开发板中
rz
(4)运行hello这个程序
chmod+xhello
./hello
2.6函数的定义
返回类型函数名(输入参数列表)
{
函数语句;//指令序列
。
。
。
}
"返回类型":
函数返回值(return语句后面那个表达式值的类型)一般是"单值"类型,函数也可以没有返回值(void)
"函数名":
C语言标识符。
把一个名字与特定的功能模块相关联
"输入参数列表":
功能模块的输入。
格式如下:
参数类型参数名1,参数类型2参数2,……函数也可以没有参数。
主调函数:
调用其他函数的函数
被调函数:
被别人调用的函数
“实际参数”:
在函数调用过程中,主调函数传递给被调函数的输入参数值,我们称之为“实际参数”,简称”实参”。
“形式参数”:
函数定义时,参数列表中的参数。
我们称之为”形式参数”,简称”形参”。
2.7Linux文件IO函数
#include
#include
#include
open用来打开一个文件
intopen(constchar*pathname,intflags)
pathname:
要打开或创建的文件名(带路径名)
flags:
打开标志。
告诉系统,是以何种方式打开这个文件
O_RDONLY:
readonly
O_WRONLY:
writeonly
O_RDWR:
read/write
以上三个标志选其一。
返回值:
如果成功返回文件描述符(>0,后续所有对文件的操作都必须
通过它,因为它代表这个文件。
)
失败返回-1,并且errno被设置。
2.8LCD显示原理
屏幕由y行且每行x个像素点的矩阵组成;在屏幕上显示图像,就是给每个像素点显示一种颜色。
颜色值,可以量化:
Color=xGreen+yBlue+zRed
我们向屏幕设备文件/dev/fb0中写入各点颜色值就可以让屏幕显示相应的图片了
第3章2048游戏的设计流程图
N
Y
N
Y
第4章相关的c语言游戏程序
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineLCD_WIDTH800
#defineLCD_HEIGHT480
#defineLCD_BYTESPERPIXEL4//每个像素点占几个字节
#defineLCD_SIZE(LCD_WIDTH*LCD_HEIGHT*LCD_BYTESPERPIXEL)
#defineMATRIX_X00//整个棋盘的左上角顶点的x轴坐标
#defineMATRIX_Y00//整个棋盘的左上角顶点的y轴坐标
#definePIECE_SIZE100//棋子的像素点大小
#defineBOARDSIZE4//整个棋盘的大小BORADSIZE*BOARDSIZE
#defineMOVE_LEFT1
#defineMOVE_RIGHT2
#defineMOVE_UP3
#defineMOVE_DOWN4
unsignedcharbmpdata[LCD_SIZE];//读bmp图片数据临时数组
intgame_over=0;//游戏结束的标志,1表示游戏结束
//0表示游戏不结束
//棋盘矩阵
intmatrix[BOARDSIZE][BOARDSIZE]=
{
0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0
};
int*plcd=NULL;//指向framebuffer(屏幕显存第一个点的内存)
/*
lcd_draw_point:
在屏幕坐为(x,y)这个点,填充color这个颜色值。
@x:
x轴坐标
@y:
y轴坐标
@color:
要填充的辨色值
返回值:
无返回值。
*/
voidlcd_draw_point(intx,inty,intcolor)
{
int*p=plcd;
if(x>=0&&x { *(p+LCD_WIDTH*y+x)=color; } } /* lcd_draw_dect: 在屏幕上画一个矩形,并且用 color这种颜色填充该矩形。 @x0: 该矩形的左上角的那个点x轴坐标 @y0: 该矩形的左上角的那个点y轴坐标 @w: 该矩形的宽 @h: 该矩形的高 @color: 该矩形要填充的辨色值 返回值: 无返回值。 */ voidlcd_draw_dect(intx0,inty0,intw,inth,intcolor) { if(x0>=0&&x0+w<=LCD_WIDTH&&y0>=0&&y0+h<=LCD_HEIGHT&&w>=0&&h>=0) { inti,j; for(i=x0;i { for(j=y0;j { LCD_draw_point(i,j,color); } } } else { printf("drawdectfailed! x0=%dy0=%dw=%dh=%d\n",x0,y0,w,h); } } //将所有的图片名保存到一个数组中 constchar*bmpfiles[]= { "military_font_7_2.bmp",//2 "military_font_7_4.bmp",//4 "military_font_7_8.bmp",//8 "military_font_7_16.bmp",//16 "military_font_7_32.bmp", "military_font_7_64.bmp", "military_font_7_128.bmp", "military_font_7_256.bmp", "military_font_7_512.bmp", "military_font_7_1024.bmp", "military_font_7_2048.bmp", "military_font_7_4096.bmp", "military_font_7_8192.bmp", "military_font_7_16384.bmp", "military_font_7_32768.bmp", "military_font_7_65536.bmp", }; /* get_bmpfiles_index: 根据你要显示的数字(2,4,8,,16,...) 返回你对应的文件名的下标 返回值: 返回x对应的文件名在数组bmpfiles的下标 */ intget_bmpfiles_index(intx) { } /* draw_bmp_byname: 把一张bmp图片显示在屏幕上特定的位置 @bmpfile: 要显示的bmp图片的文件名 @x0: 在屏幕上显示的左上角顶点的x轴坐标 @y0: 在屏幕上显示的左上角顶点的y轴坐标 @w: 位图宽度 @h: 位图高度 返回值: 无返回值. */ voiddraw_bmp_byname(constchar*bmpfile,intx0,inty0,intw,inth) { intfd; intx,y; fd=open(bmpfile,O_RDONLY); if(fd==-1) { perror("openbmpfileerror: "); return; } lseek(fd,54,SEEK_SET); read(fd,bmpdata,w*h*3); close(fd); inti=0; for(y=0;y { unsignedcharr,g,b; intcolor; for(x=0;x { b=bmpdata[i++]; g=bmpdata[i++]; r=bmpdata[i++]; color=(r<<16)|(g<<8)|b; lcd_draw_point(x0+x,y0+(h-1-y),color); } } } /* draw_matrix: 把棋盘矩阵在屏幕上显示出来 */ voiddraw_matrix() { inti,j; for(i=0;i { for(j=0;j { intx0,y0; x0=185;//棋盘矩阵左上角那个点的x轴坐标 y0=25;//棋盘矩阵左上角那个点的y轴坐标 if(matrix[i][j]==0) { lcd_draw_dect(x0+j*110,y0+i*110,PIECE_SIZE,PIECE_SIZE, 0xb4eeb4);//如果此处元素的值为0,那么 //就显示 } else { intf_index=get_bmpfiles_index(matrix[i][j]); draw_bmp_byname(bmpfiles[f_index], x0+j*110,y0+i*110, PIECE_SIZE,PIECE_SIZE); } } } } /* get_zero_num: 求棋盘矩阵里面有多少个0 返回值: 返回棋盘矩阵中0的个数 */ intget_zero_num() { } /* set_matrix: 给棋盘矩阵第z个0的位置,填充一个 值s */ voidset_matrix(intz,ints) { } /* init_matrix: 初始化棋盘矩阵 在任意x个位置,填充x个数字(2,4,8) */ voidinit_matrix() { /* step1: 随机产生x个数字,并填充到棋盘矩阵中去 */ //规则x>=1,x<=3 intx=(random()%3)+1; inti; for(i=0;i { intpos=(random()%get_zero_num())+1; ints[]={2,4,8,2}; ints_i=(random()%3); set_matrix(pos,s[s_i]);//给棋盘矩阵第pos个0的位置,填充一个值s[s_i] } /* step2: 绘制棋盘矩阵 */ draw_matrix(); } /* get_finger_direction: 获取手指在触摸屏上面的滑动方向 返回值: MOVE_LEFT: 手指向左移动 MOVE_RIGHT: 手指向右移动 MOVE_UP: 手指向上移动 MOVE_DOWN: 手指向下移动 */ intget_finger_direction() { intret; intfd=open("/dev/event0",O_RDONLY); if(fd==-1) { perror("openeventfailed: "); return-1; } structinput_eventev; intx1=-1;//在滑动过程中第一个点的x轴坐标 intx2;//在滑动过程中最后一个点的x轴坐标 inty1=-1;//在滑动过程中第一个点的y轴坐标 inty2;//在滑动过程中最后一个点的y轴坐标 while (1) { ret=read(fd,&ev,sizeof(ev)); if(ret! =sizeof(ev)) { continue; } if(ev.type==EV_ABS&&ev.code==ABS_X)//是x轴坐标 { if(x1==-1)//x1重来没有赋过值,那么肯定是第一个点 { x1=ev.value; } x2=ev.value; } if(ev.type==EV_ABS&&ev.code==ABS_Y)//是y轴坐标 { if(y1==-1)//y1重来没有赋过值,那么肯定是第一个点 { y1=ev.value; } y2=ev.value; } if(ev.type==EV_ABS&&ev.code==ABS_PRESSURE//手指弹起,再计算滑动方向 &&ev.value==0)//触摸屏压力值为0,pressup { intx_cz;//x轴的位移 inty_cz;//y轴的位移 intabs_x; intabs_y; x_cz=x2-x1; y_cz=y2-y1; abs_x=abs(x_cz); abs_y=abs(y_cz); if((x_cz>30)&&(abs_x>2*abs_y)) { close(fd); returnMOVE_RIGHT; } elseif((x_cz<-30)&&(abs_x>2*abs_y)) { close(fd); returnMOVE_LEFT; } elseif((y_cz>30)&&(abs_y>2*abs_x)) { close(fd); returnMOVE_UP; } elseif((y_cz<-30)&&(abs_y>2*abs_x)) { close(fd); returnMOVE_DOWN; } else { x1=y1=-1; continue; } } } close(fd); } /* change_matrix: 根据手指滑动(direction), 变换棋盘矩阵 */ intchange_matrix() { intdirection=get_finger_direction(); if(direction==MOVE_LEFT) { fin_left(); } elseif(direction==MOVE_RIGHT) { fin_right(); } elseif(direction==MOVE_UP) { fin_up(); } else { fin_down(); } } /* fin_left: 手指左划后棋子移动及合并的方式 */ voidfin_left() { //intfin=get_finger_direction(); inti,j;//i为矩阵行下标,j为矩阵列下标 intvalue,save_zero; for(i=0;i { value=0; save_zero=0; for(j=0;j { if(matrix[i][j]==0) continue; if(value==0) { value=matrix[i][j]; } else { if(value==matrix[i][j])//合并 { matrix[i][save_zero++]=value*2; value=0; } else { matrix[i][save_zero++]=value; value=matrix[i][j]; } } matrix[i][j]=0; } if(value! =0) matrix[i][save_zero]=value; } } /* fin_right: 手指上划后棋子移动及合并的方式 */ voidfin_right() { inti,j;//i为矩阵行下标,j为矩阵列下标 intvalue; intsave_zero; for(i=0;i { value=0; save_zero=BOARDSIZE-1; for(j=BOARDSIZE-1;j>=0;j--) { if(matrix[i][j]==0) { continue; } if(value==0) { value=matrix[i][j]; } else { if(value==matrix[i][j]) { matrix[i][save_zero--]=2*value; value=0; } else { matrix[i][save_zero--]=value; value=matrix[i][j]; } } matrix[i][
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 嵌入式 系统 工程 报告 材料