实习报告

发布时间:2016-04-07 20:36:30   来源:文档文库   
字号:

苏州大学计算机科学与技术学院

位:

华祥信息科技有限公司

间:

2015.7.132015.11.30

级:

卓越工程师班

号:

1227403042

名:

单位指导教师:

2015年12月1日

1. 前言

1) 实习来源

校园招聘会

2) 时间

2015年7月13日至2015年11月30日

3) 任务

嵌入式开发

4) 效果

实习氛围良好,在公司四个多月中学到了很多知识。

2. 实习目的

(1)掌握嵌入式微处理器的结构与原理

(2)熟悉并掌握嵌入式Linux操作系统的操作

(3)熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。

3. 实习内容

1) 实习岗位

嵌入式软件开发助理工程师

2) 采用技术

Linux操作系统嵌入式开发

3) 工作量描述

工作量适中,基本可以在当天完成。

4) 合作方式及效果

小组分工合作,能够及时高效地完成任务

5) 解决的问题

i) 主要内容

来到华祥科技,主要实习方向为嵌入式开发,细化为LCD驱动开发。

所谓嵌入式系统是一台特殊用途的计算机,该计算机由它控制的设备完全封装。驱动这些系统的软件称为嵌入式软件。通用个人计算机可以执行多个任务,接受新的任务,并可由用户编程;而嵌入式系统有特定的需求,只能执行有限数量的预定义任务,嵌入式系统的优势在于,它们可以进行优化来进一步改善性能,并可以减小规模和成本。由于存在这些优势,嵌入式系统的使用越来越普及,因而使日常生活的各个方面(包括通讯、娱乐和工业控制系统)得到充分的改善。

为了成功的进行嵌入式开发,我们做了如下准备:C语言的强化,linux系统下的操作。

(1)linux常用命令:

cd【目录】: 切换到指定的目录,可以是相对路径或者是绝对路径。绝对路径是以“ / ”开头,从目录的最顶层开始列出目录路径。相对路径不用“ / ”开头,只列出当前工作目录以下的目录路径。

ls【选项】【文件目录列表】:显示指定工作目录中所包含的内容的指令是ls,要说明的是ls命令列出文件的名字,而不是文件的内容。

mkdir【选项】 路径: “路径”可以是一系列,此时若路径中的目录不存在,则系统自动创建那些不存在的目录。

Pwd:显示的是当前工作目录的绝对路径。

cp【选项】源文件 目标文件或目标目录

mv【选项】 文件列表 目录

rm【选项】 文件列表:可从文件系统中删除文件及整个目录。

cat【选项】文件列表:用来将几个文件的内容相连接,并显示到终端上。

Clear:清除屏幕上的信息。

kill进程号:删除执行中的进程。

tar [选项] 文件或者目录:文件打包解包。

ifconfig网络接口【选项】【地址】:配置网络接口的地址、网络掩码等。

gcc[选项]要编译的文件 [选项] [目标文件]:编译可执行文件。

(2)在VMware中安装Linux,New—>Virtual Machine…->选择“custom”下一步->下一步,出现的界面中选择安装路径,必须注意待安装盘有足够的空间。因为后面安装的RedHat系统是桌面版本,它对内存还是有一定的要求,在机器内存较大的情况下,尽可能给RedHat多分配一些内存,此处分配的内存是256MB。下面可以选择默认选择,最后单击Close,此时虚拟机已经建立起来了。

接下来光盘配置使用我们下载的RedHatiso文件,单击OK按钮。下面就可以启动安装RedHat系统了。首先进行语言的选择,选择中文,并单击前进按钮。接下来选择时区,此处选择上海时区,单击前进按钮。在进行用户帐户和主机命名设置时,我用“zxy”作为登录名且同时作为这台计算机的名称。安装向导的最后一步将用户安装过程中所做过的配置信息再次反馈给用户,确认信息。最后点击“安装”即可。

准备工作做好之后,开始进行嵌入式开发,以下是开发过程中所做的练习。

作业(大小端)

#include<stdio.h>

typedef union tag_MYUNION

{char ch[4];

int value;

}MYUNION;

int main()

{MYUNION myunion;

myunion.value=0x12345678;

if(myunion.ch[0]==0x12)

printf("big endian\n");

else myunion.ch[0]==0x78;

printf("little endian\n");

return 0;}

作业二(多线程)

#include types.h>

#include <unistd.h>

#include <stdio.h>

int main()

{

pid_t pid;

char *message;

int n;

printf("fork program starting\n");

pid = fork();

switch(pid)

{

case -1:

perror("fork failed");

exit(1);

case 0:

message="child:";

n =100;

break;

default:

sleep(1);

message="parent:";

n =100;

break;

}

for(n=1;n<100;n+=2)

{

printf("%s",message);

printf("%d,%d\n",n,n+1);

sleep(1);

}

exit(0);

}

作业三(大小字母输出及ASC码)

#include types.h>

#include <unistd.h>

#include <stdio.h>

int main()

{

pid_t pid;

char *message;

int n;

printf("fork program starting\n");

pid = fork();

switch(pid)

{

case -1:

perror("fork failed");

exit(1);

case 0:

message="child:";

n =100;

break;

default:

sleep(1);

message="parent:";

n =100;

break;

}

for(n=1;n<100;n+=2)

{

printf("%s",message);

printf("%d,%d\n",n,n+1);

sleep(1);

}

exit(0);

}

作业四(字母排序)

#include<stdio.h>

#include<string.h>

int main()

{

int j=65;

int i;

char a[27];

char *b;

char readbuf[27]={0};

char readbuf1[27]={0};

for(i=0;i<26;i++)

{ a[i]=j;

j++;

}

a[i]='\0';

FILE *fp;

FILE *fp1;

FILE *fp2;

fp=fopen("zmpx.txt","w");

char *buf=a;

if(fp==NULL)

{ printf("file open failed.\n");

return 0;

}

fwrite(buf,strlen(buf),1,fp);

fclose(fp);

fp=fopen("zmpx.txt","r");

if(fp==NULL)

{

printf("file open failed.\n");

return 0;

}

fread(readbuf,strlen(buf),1,fp);

fp1=fopen("zhengxu.txt","w");

fwrite(readbuf,strlen(buf),1,fp1);

fclose(fp1);

fp=fopen("zmpx.txt","r");

if(fp==NULL)

{

printf("file open failed.\n");

return 0;

}

fread(readbuf,strlen(buf),1,fp);

for(i=0;i<26;i++)

{ fseek(fp,(-i-1),SEEK_END);

fread(b,1,1,fp);

readbuf1[i]=*b;}

fp2=fopen("daoxu.txt","w");

fwrite(readbuf1,strlen(buf),1,fp2);

fclose(fp2);

}

当然,嵌入式开发仅仅学习C语言是远远不够的。于是在我们已有的单片机基础之上,又深入学习了汇编语言。从而,嵌入式开发的准备工作,我们已基本完成

在接下来的时间里,我们开始接触TQ2440开发板。刚接触开发板,我们自己对照使用手册开始接线。然后安装USB驱动,虚拟光驱,还有像Source Insight 3.5;CodeWarrior for ARM;SecureCRT Developer Suite;TFTP Server以及DNW这些软件。

首先我们做的有

1.SecureCRT的设置。

2.设置DNW软件。

3.安装USB下载驱动安装完毕USB下载驱动后,打开DNW软件,就可以在DNW软件的顶上看到USB连接OK的字样同时可以在“设备管理器”看到刚刚安装的USB驱动此时就可以使用USB下载u-boot、操作系统和文件系统了。

4.安装GIVEIO驱动,

Step 1:首先打开PC的“控制面板”界面,双击“添加硬件”图标,进入到添加硬件的界面。

Step 2:然后点击“下一步”继续。系统会自动搜索硬件的。

Step 3:过一会完成搜索,进入到下面第二图的界面,选择“是,我已 经连接了此硬件”。

Step 4:然后点击“下一步”继续出现“安装向导”,这里选择“安装我手动从列表选择的硬件(高级)”选项。

Step 5:然后点击“下一步”继续。在硬件列表中找到“端口(COM和LPT)”选项,然后点击“下一步”继续。

Step 6:点击“从磁盘安装”选项后继续。

Step 7:从“磁盘安装”界面中选择“浏览”选项。

Step 8:然后定位到刚才的GIVEIO目录下面,找到“GIVEIO.inf”文件,点击“打开”继续。

Step 9:然后回到“从磁盘安装”界面,点击“确定”继续回到驱动设备安装的界面,选择“giveio”设备后,点击“下一步”继续出现“向导准备安装您的硬件”界面中:。

Step 10:点击“下一步”继续然后出现驱动未经过微软认证的界面,点击“仍然继续”选项继续

Step 11:点击“完成”选项后就完成驱动安装了。

Step 12:在“设备管理器”中您可以看到新安装的驱动。

5.TFTP代理软件设置

至此,软件安装,设置基本完成。

接下来就是烧写驱动代码和图片代码。由于代码过于庞大,仅截图一段,仅供参考。

/**************************************************************

在LCD屏幕上指定坐标点画一个指定大小的图片

**************************************************************/

void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[])

{

int x,y;

U32 c;

int p = 0;

for( y = y0 ; y < l ; y++ )

{

for( x = x0 ; x < h ; x++ )

{

c = bmp[p+1] | (bmp[p]<<8) ;

if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) )

LCD_BUFFER[y0+y][x0+x] = c ;

p = p + 2 ;

}

}

}

/**************************************************************

**************************************************************/

void Lcd_TFT_Init(void)

{

Lcd_Init();

Lcd_PowerEnable(0, 1);

Lcd_EnvidOnOff(1); //turn on vedio

Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) );

#define LCD_BLANK 12

#define C_UP ( LCD_XSIZE_TFT - LCD_BLANK*2 )

#define C_RIGHT ( LCD_XSIZE_TFT - LCD_BLANK*2 )

#define V_BLACK ( ( LCD_YSIZE_TFT - LCD_BLANK*4 ) / 6 )

Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE_TFT - LCD_BLANK ), ( LCD_YSIZE_TFT - LCD_BLANK ),0x0000); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*0), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*1),0x001f); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*1), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*2),0x07e0); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*2), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*3),0xf800); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*3), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*4),0xffe0); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*4), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*5),0xf81f); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*5), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*6),0x07ff); //fill a Rectangle with some color

Glib_Line( LCD_BLANK,LCD_BLANK, (LCD_XSIZE_TFT-LCD_BLANK), (LCD_YSIZE_TFT-LCD_BLANK), 0x0000 ) ;

Glib_Line( LCD_BLANK,(LCD_YSIZE_TFT-LCD_BLANK), (LCD_XSIZE_TFT-LCD_BLANK), LCD_BLANK, 0x0000 ) ;

Glib_Line( (LCD_XSIZE_TFT/2),(LCD_BLANK*2 + V_BLACK*0), (LCD_XSIZE_TFT/2), (LCD_BLANK*2 + V_BLACK*6), 0x0000 ) ;

}

void Lcd_TFT_Test( void )

{

Uart_Printf("\nTest TFT LCD!\n");

Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) ) ; //clear screen

Uart_Printf( "\nDisplay Black! Press any key to continue!\n" );

Uart_Getch() ; //wait uart input

Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x1f) ) ; //clear screen

Uart_Printf( "Display White! Press any key to continue!\n" );

Uart_Getch() ; //wait uart input

Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x1f) ) ; //clear screen

Uart_Printf( "Display Blue! Press any key to continue!\n" );

Uart_Getch() ; //wait uart input

Lcd_ClearScr( (0x00<<11) | (0x3f<<5) | (0x00) ) ; //clear screen

Uart_Printf( "Display Green! Press any key to continue!\n" );

Uart_Getch() ; //wait uart input

Lcd_ClearScr( (0x1f<<11) | (0x00<<5) | (0x00) ) ; //clear screen

Uart_Printf( "Display Red! Press any key to continue!\n" );

Uart_Getch() ; //wait uart input

/* Lcd_ClearScr( (0x00<<11) | (0x3f<<5) | (0x1f) ) ; //clear screen

Uart_Printf( "LCD clear screen is finished! press any key to continue!\n" );

Uart_Getch() ; //wait uart input

Lcd_ClearScr( (0x1f<<11) | (0x00<<5) | (0x1f) ) ; //clear screen

Uart_Printf( "LCD clear screen is finished! press any key to continue!\n" );

Uart_Getch() ; //wait uart input

Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x00) ) ; //clear screen

Uart_Printf( "LCD clear screen is finished! press any key to continue!\n" );

Uart_Getch() ; //wait uart input

*/

Lcd_ClearScr(0xffff); //fill all screen with some color

#define LCD_BLANK 12

#define C_UP ( LCD_XSIZE_TFT - LCD_BLANK*2 )

#define C_RIGHT ( LCD_XSIZE_TFT - LCD_BLANK*2 )

#define V_BLACK ( ( LCD_YSIZE_TFT - LCD_BLANK*4 ) / 6 )

Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE_TFT - LCD_BLANK ), ( LCD_YSIZE_TFT - LCD_BLANK ),0x0000); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*0), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*1),0x001f); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*1), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*2),0x07e0); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*2), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*3),0xf800); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*3), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*4),0xffe0); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*4), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*5),0xf81f); //fill a Rectangle with some color

Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*5), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*6),0x07ff); //fill a Rectangle with some color

Glib_Line( LCD_BLANK,LCD_BLANK, (LCD_XSIZE_TFT-LCD_BLANK), (LCD_YSIZE_TFT-LCD_BLANK), 0x0000 ) ;

Glib_Line( LCD_BLANK,(LCD_YSIZE_TFT-LCD_BLANK), (LCD_XSIZE_TFT-LCD_BLANK), LCD_BLANK, 0x0000 ) ;

Glib_Line( (LCD_XSIZE_TFT/2),(LCD_BLANK*2 + V_BLACK*0), (LCD_XSIZE_TFT/2), (LCD_BLANK*2 + V_BLACK*6), 0x0000 ) ;

#if(LCD_Type == LCDW43)

Uart_Printf( "Press any key to continue!\n" );

Uart_Getch() ; //Any Key To Next

Paint_Bmp(0, 0, 480, 272, TQ_LOGO_480272);

#elif(LCD_Type == VGA)

Uart_Printf( "Press any key to continue!\n" );

Uart_Getch() ; //Any Key To Next

Paint_Bmp(0, 0, 640, 480, TQ_LOGO_640480);

#endif

Uart_Printf("LCD Test Complete!\n");

Uart_Printf("Press any key to quit!\n");

Uart_Getch();

}

//*************************************************************

插入组号“3”的代码。

Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x1f) );

Glib_FilledRectangle(170,46,310,66,0xf800);

Glib_FilledRectangle(290,46,310,146,0xf800);

Glib_FilledRectangle(170,126,310,146,0xf800);

Glib_FilledRectangle(290,146,310,226,0xf800);

Glib_FilledRectangle(170,206,310,226,0xf800);

由于插入图片的代码过于庞大在此就补贴出了。

插入图片的具体方法是:1.将已有图片用PS等软件转换成像素为480*272大小的BMP文件。

2.用BMP图片转换软件将BMP图文件转换成.c文件。

3.讲图文件代码插入图片显示代码段中。

4.保存,编译,测试,运行成功。

至此项目开发内容基本完成,接下来是完成项目的文档,包括:

①项目计划

②概要设计说明

③需求规格说明

④详细设计说明

⑤测试问题跟踪

在项目验收过后,四个多月的实习内容,圆满结束。

ii) 主要事件列表

嵌入式技术发展现在及未来。

实习任务布置。

配置环境。

实习嵌入式硬件平台环境熟悉。

强化C语言基础。

在虚拟机中安装Linux操作系统。

熟悉Linux操作系统。

学习Linux命令。

熟悉Linux程序设计。

了解多进程模式下的程序设计。

学习在Linux下如何创建进程、结束进程。

学习进程间多种通信机制及如何选择通信方式。

了解多线程模式下的程序设计。

线程的创建与取消。

线程的同步与互斥。

经典硬件平台。

ADS的使用。

汇编语言基本结构。

ARM的寻址方式。

ARM指令集——数据处理指令、跳转指令、程序状态指令加载存储指令协处理指令、异常中断指令、信号量操作指令

伪操作和宏指令——宏定义(MACROMEND)、符号定义伪操作、数据定义伪操作(申请内存)、汇编控制伪操作

ARM汇编伪指令(读取内存地址)——ADRADRLLDRNOP

C语言与汇编混合编程——ATPCS规则、CARM汇编程序间的相互调用

裸机硬件的控制——裸板开发环境搭建

软件控制硬件的编程原理——LED

LCD驱动原理

PWM驱动原理

嵌入式Linux下驱动开发——驱动程序的注册和注销、设备的打开和释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理

TFT LCD驱动开发

6) 存在的问题

i) 一个进程一旦调用exec类函数,系统就把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,如何让自己的程序启动另一程序的同时自己仍继续运行?解决方法是结合fork与exec的使用,从终端读入命令并执行,执行完成后父进程继续等待从终端读入命令。

ii) ADS如何调试?AXD是调试器设置,debug—>打开AXD调试界面,选择option->config target选项,选ARMUL(模拟调试器),然后选择确定,进入调试界面。ARMUL是虚拟调试环境(虚拟开发板),如果用开发板真实环境调试,则需要使用JTAG连开发板后,在此处选H-JTAG,用file—>lode image项,加载刚才编译所得的.axf调试文件,execute->run to cousor 项.使程序进入用户主程序。

iii) 改变CPSP寄存器值,初始化堆栈指针寄存器SP等操作无法使用C语言实现,必须使用汇编完成。为编程简洁,有时需要在C源代码中实现上述操作,如何实现在C中嵌入少量汇编代码?内嵌的汇编不能直接引用C的变量定义,必须通过ATPCS进行,语法格式如下:

__asm{

//内嵌汇编

}

iv) 对于不支持中断的设备,如何读写?不支持中断的设备读写时需要轮询设备状态,以及是否需要继续进行数据传输。例如,打印机支持中断,则可按照中断方式进行。模块在使用中断前要先请求一个中断通道(或者 IRQ中断请求),并在使用后释放它。通过request_irq()函数来注册中断,free_irq()函数来释放。

4. 自我评价

在为期四个多月的实习过程中,我学到了很多在课堂上根本就学不到的知识,真是受益非浅。

苏州华祥创立于2012年,总部位于江苏省苏州工业园区,主要从事嵌入式公共技术的研发与应用设计,服务于众多企业的智能产品开发,是嵌入式系统与传感网领域的高科技研发型企业。公司依托苏州大学飞思卡尔嵌入式研发中心的技术积累与持续的前沿技术研究,实现产学研一体化。公司与飞思卡尔半导体密切合作,为飞思卡尔芯片的应用提供设计方案与技术服务。

刚开始在华祥科技里实习第一个体会到的就是一个字——“累”,但后来慢慢的习惯下来,因为刚从校园里走出来,没有经历过工作的艰辛和困难,但是我并没有后退,而是勇敢地面对现实,向困难中挑战。实习磨炼了我的意志,锻炼了我的能力,让我学会如何面对逆境。

在实习过程中还学会了很多东西:

首先,第一个是懂得了什么叫做团队精神,一个班组要团结,不然的话就有可能导致事情的失败。

其次,我学会了沟通,学会处理好身边的人际关系,学会在苦中作乐的技巧,我的工作是比较枯燥的,每天都反复的做哪份工作,如果没有同身边的同事沟通,处理好身边的人际关系,一个人是很孤独,同时在一个工位上工作时间长了,前后工位之间将免不了有磨擦出现,处理不好,将影响我们的工作质量。这就让我懂得了人际关系的重要性,一个好的人缘将会给我们的工作带来了无限的方便和欢乐。

其三在工作中学会了研究。在工作中,方法中的正确和方便性非常重要,直接影响到代码实现的正确与否,在自己的岗位上做熟了,对自己所做的工作也仔细研究起来,细心分析其方法,代码的缺点,自己优化出一个更加便捷简单的代码来提高自己,真正充分体现出大学生的不同之处,体现了大学生的风采。

回想自己在这期间的工作学习情况,不尽如意。对此我思考过,学习经验自然是一个因素,然而更重要的是心态的转变没有做到位。现在发现了这个不足之处,应该还算是及时吧,因为我明白了何谓工作。在接下来的日子里,我会朝这个方向努力,我相信自己能够改变自身的不足

对于我来说,这是我第一次走进公司,也是我第一次真正体验一份工作和感受企业文化。感谢华祥科技,让我在这次实习中学到了很多东西。也感谢在我实习帮助我很多的校内指导老师和企业指导老师,我从你们的身上学到了很多东西。

5. 阅读内容清单

《C程序设计语言》

Linux编程技术详

《嵌入式Linux C语言应用程序设计》

Linux设备驱动 第三版

嵌入式设计及Linux驱动开发指南

unix环境高级编程》

本文来源:https://www.2haoxitong.net/k/doc/31a0c0d8915f804d2a16c156.html

《实习报告.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式