1、基于某嵌入式系统地工程实训报告材料等级:工程实践训练项目名称 物联网应用 专业班级 自动化1301 姓 名 黄奎伦 学 号 * 指导教师 汪超,谢一峰(粤嵌) 2016年12月24日心得体会 22电气信息学院工程实践训练评分标准 23第1章 实训目的与任务1.1 工程实践训练目的本次自动化工程实践训练第一部分是实训装置的使用说明,讲述了系统的组成、硬件的特点和技术指标、软件的使用介绍。第二部分是实训项目部分,叙述了实训的原理、步骤及注意事项等。通过对实训装置各个仪表的原理、工作情况及实验原理、软硬件的详细介绍,通过实际操作让我们对复杂过程控制系统实训装置有一个充分的认识,又有益于我们对工业生产
2、现场控制系统的了解。培养学生的工程实践能力,进一步提高学生分析和解决实际问题的能力。1.2 实训项目要求 轻松的益智游戏对缓解生活压力调节情绪具有重要的意义。2048这款小游戏是一款流行的数字游戏,游戏设计初衷是一款益智类的游戏,其特点在于轻松,简单,有趣。因此,开发要求做到各项功能要完备、操作要简便、易学易用。所以本周的工程实训要求自己设计一个2048小游戏,以及学习关于嵌入式的基本入门知识。第2章 知识点总结2.1 嵌入式系统嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁减,以适应应用系统对功能、可靠性、成本、体积和功耗等有严格要求的专用计算机系统。2.2 Linux操作系统介绍
3、Linux是一套免费使用和自由传播的类UNIX操作系统,其创始人为美国著名黑客 -林纳斯托瓦兹。它能运行主要的UNIX工具软件、应用程序和网络协议,且支持32位和64位硬件,是一个性能稳定的多用户网络操作系统。 操作系统:操作系统是计算机系统中最基本的系统软件,它用于有效地管理系统资源,并为用户使用计算机提供了便利的环境。 ubuntu是一个基于linux的免费开源桌面PC操作系统。2.3 交叉开发 一般来说,研发嵌入式产品,由于从产品成本及功能专用性角度出发考虑。嵌入式产品一般只有程序的运行环境,而并没有程序的编译开发环境。 所以,我们一般在通用电脑上用各种编译开发软件把程序编译调试好后,再
4、下载到开发板或相关产品上去运行。 这个过程,我们称之为交叉开发。2.4 SecureCRT的设置与连接(1)获取连接上的端口号 用串口线连接好开发板后,启动开发板。在设备管理器中,查找识别出的端口。 若不能正确识别端口(有感叹号),则需要安装驱动。(2)SecureCRT的设置 点击快速连接,并进行设置 a.协议: Serial b.端口: 你电脑识别出的端口号 c.波特率: 115200 d.把数据流控制中的RTS/CTS(R)勾去掉 其它保持默认设置2.5 C程序的交叉编译及运行由于ARM处理器与Inter处理器其设计架构有本质区别。所以要在arm开发板上运行的程序,则必须要用专用的编译器
5、来编译。(1)在文本编辑软件中编写好C源代码文件,并保存到共享文件夹中。= hello.c(2)在Ubuntu系统的共享目录中,用arm-linux-gcc编译器对hello.c进行编译,使生成一个可执行程序。 arm-linux-gcc hello.c o hello= hello(3)下载到开发板中 rz(4)运行hello这个程序 chmod +x hello ./hello2.6 函数的定义返回类型 函数名(输入参数列表) 函数语句;/指令序列 。 返回类型:函数返回值(return语句后面那个表达式值的类型)一般是单值类型,函数也可以没有返回值(void) 函数名:C语言标识符。把一
6、个名字与特定的功能模块相关联 输入参数列表:功能模块的输入。格式如下:参数类型 参数名1 , 参数类型2 参数2,函数也可以没有参数。主调函数:调用其他函数的函数被调函数:被别人调用的函数 “实际参数”: 在函数调用过程中,主调函数传递给被调函数的输入参数值,我们称之为“实际参数”,简称”实参”。“形式参数”: 函数定义时,参数列表中的参数。我们称之为”形式参数”,简称”形参”。 2.7 Linux文件IO函数#include #include #include open用来打开一个文件 int open(const char *pathname, int flags) pathname: 要
7、打开或创建的文件名(带路径名) flags: 打开标志。告诉系统,是以何种方式打开这个文件 O_RDONLY : read only O_WRONLY : write only O_RDWR : read/write 以上三个标志选其一。返回值: 如果成功返回文件描述符(0,后续所有对文件的操作都必须 通过它,因为它代表这个文件。) 失败返回-1, 并且errno被设置。2.8 LCD显示原理 屏幕由y行且每行x个像素点的矩阵组成;在屏幕上显示图像,就是给每个像素点显示一种颜色。 颜色值,可以量化: Color = xGreen + yBlue + zRed 我们向屏幕设备文件 /dev/fb
8、0 中写入各点颜色值就可以让屏幕显示相应的图片了第3章 2048游戏的设计流程图 N Y N Y 第4章 相关的c语言游戏程序#include #include #include #include #include /*perror, errno ,.*/#include /*abs的头文件*/#include /*printf*/#include #include #include #include /*time */#include #define LCD_WIDTH 800#define LCD_HEIGHT 480#define LCD_BYTESPERPIXEL 4 /每个像素点占几
9、个字节#define LCD_SIZE (LCD_WIDTH * LCD_HEIGHT *LCD_BYTESPERPIXEL)#define MATRIX_X0 0 /整个棋盘的左上角顶点的x轴坐标#define MATRIX_Y0 0 /整个棋盘的左上角顶点的y轴坐标#define PIECE_SIZE 100 /棋子的像素点大小#define BOARDSIZE 4 / 整个棋盘的大小BORADSIZE * BOARDSIZE#define MOVE_LEFT 1#define MOVE_RIGHT 2#define MOVE_UP 3#define MOVE_DOWN 4unsigned
10、 char bmpdataLCD_SIZE ; /读bmp 图片数据临时数组 int game_over = 0;/游戏结束的标志,1表示游戏结束 /0表示游戏不结束/棋盘矩阵int matrixBOARDSIZEBOARDSIZE = 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:要填充的辨色值 返回值: 无返回值。*/void lcd_dra
11、w_point(int x, int y, int color) int *p = plcd; if (x = 0 & x =0 & y =0 & x0+w=0 & y0+h=0 & h=0) int i,j; for(i=x0;ix0+w;i+) for(j=y0;jy0+h;j+) LCD_draw_point(i,j,color); else printf(draw dect failed!x0=%d y0=%d w=%d h=%dn,x0,y0,w,h); /将所有的图片名保存到一个数组中const char * bmpfiles = military_font_7_2.bmp, /
12、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
13、_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的下标*/int get_bmpfiles_index(int x)/* draw_bmp_byname:把一张bmp图片显示在屏幕上特定的位置 bmpfile:要显示的bmp图片的文件名 x0: 在屏幕上显示的左上角顶点的x轴坐标 y0: 在屏幕上
14、显示的左上角顶点的y轴坐标 w: 位图宽度 h: 位图高度 返回值: 无返回值.*/void draw_bmp_byname(const char *bmpfile, int x0, int y0, int w, int h) int fd; int x, y; fd = open(bmpfile, O_RDONLY); if (fd = -1) perror(open bmpfile error:); return ; lseek(fd, 54, SEEK_SET); read(fd, bmpdata, w*h*3); close(fd); int i = 0; for (y = 0; y
15、h; y+) unsigned char r,g ,b; int color; for (x = 0; x w; x+)/已知图片色深为24位 b = bmpdatai+; g = bmpdatai+; r = bmpdatai+; color = (r 16) | (g 8) | b; lcd_draw_point(x0+ x, y0 + (h -1 - y) ,color); /* draw_matrix:把棋盘矩阵在屏幕上显示出来*/void draw_matrix() int i, j; for (i = 0; i BOARDSIZE; i+) for (j = 0; j = 1,x
16、= 3 int x = (random() % 3) + 1; int i; for(i = 0; i 30) & (abs_x 2 * abs_y) close(fd); return MOVE_RIGHT; else if(x_cz 2 * abs_y) close(fd); return MOVE_LEFT; else if(y_cz 30) & (abs_y 2 * abs_x) close(fd); return MOVE_UP; else if(y_cz 2 * abs_x) close(fd); return MOVE_DOWN; else x1 = y1 = -1; conti
17、nue; close(fd);/* change_matrix:根据手指滑动(direction), 变换棋盘矩阵*/int change_matrix() int direction = get_finger_direction(); if (direction = MOVE_LEFT) fin_left(); else if (direction = MOVE_RIGHT) fin_right(); else if (direction = MOVE_UP) fin_up(); else fin_down(); /* fin_left:手指左划后棋子移动及合并的方式*/void fin_l
18、eft() /int fin = get_finger_direction(); int i, j;/i为矩阵行下标,j为矩阵列下标 int value, save_zero; for(i = 0; i BOARDSIZE; i+) value = 0; save_zero= 0; for(j = 0; j BOARDSIZE ; j+) if (matrixij = 0) continue; if (value = 0) value = matrixij; else if (value = matrixij)/合并 matrixisave_zero+ = value * 2; value =
19、 0; else matrixisave_zero+ = value; value = matrixij; matrixij = 0; if (value != 0) matrixisave_zero = value; /* fin_right:手指上划后棋子移动及合并的方式*/void fin_right() int i, j;/i为矩阵行下标,j为矩阵列下标 int value; int save_zero; for(i = 0; i = 0 ; j-) if(matrixij = 0) continue; if(value = 0) value = matrixij; else if(value = matrixij) matrixisave_zero- = 2 * value; value = 0; else matrixisave_zero- = value; value = matrixij; matrixij
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1