成绩
生 实 习 报 告
实 习 名 称 专业生产实习—-—-
嵌入式平台开发
院 部 名 称 信息技术学院 专 业 通信工程 班 级 09通信工程(1) 学 生 姓 名 方照 学 号 0905103068 实 习 地 点 工科楼A101 指 导 教 师 梁俊 陈传军
实习起止时间:2012年7月2日至2012年7月27日
金陵科技学院教务处制
学
前言
嵌入式作为现今的热门领域,涵盖了微电子技术,信息电子信息技术计算机软件和硬件等多项技术领域的应用计算机软件和硬件等多项技术领域的应用计算机软件和硬件等多项技术领域的应用计算机软件和硬件等多项技术领域的应用。大到航空航天石油化工能源控制核电站以及机器人系统核电站以及机器人系统核电站,小到日常使用的智能手机数字电视掌上电脑,嵌入式技术正在我们的生活中占据着越来越重要的地位中.
业内人士认为,目前嵌入式行业至少存在30-50万的人才缺口,仅北京市场嵌入式软件开发人员的需求就已经超过了5万人,而且还在持续增加,这主要有两方面的原因:一是与目前我们高校的专业设置有关,我国高校的计算机教育普遍以应用软件为主,很少涉及嵌入式软件的课程,因此企业很难招聘到马上可以投入嵌入式软件开发的实战型人才;二是嵌入式领域门槛相对较高,知识要求比较全面,而且需要一定的实验环境(开发板和工具软件)和有经验的人进行指导。
江苏嵌入式软件公共技术中心(简称苏嵌),是面向全社会开展嵌入式技术系列培训课程的专业服务机构,座落于南京工业大学国家科技园,由国内外知名IT 企业机构、江苏省软件行业协会、南京工业大学等知名院校负责协助实施。得到了江苏省电子协会、江苏省高等学校教育技术研究会等大力支持。目前已经成长为华东地区规模最大,最具专业的嵌入式教育培训机构
苏嵌拥有核心技术人员博士以上学历12人,硕士学历近20人,同时汇聚了30多名来自于南大、东大、中兴等科研院校的一线研发主力作为专家师资团队,聘请了龙芯、Redhat、中兴、华为、电信、ARM等各大公司的技术负责人和项目经理作为中心的技术顾问。
嵌入式技术凝聚了计算机和信息技术的精华,嵌入式技术人才是具备透视计算机和信息技术奥秘的高级专业人才。作为江苏较早开展嵌入式技术教育的研究机构,苏嵌将嵌入式技术人才的培养做为自己的终身事业,把最新的技术发展和行业需求结合起来,为广大学员提供最完善、最有效的技术咨询和培训服务。凭着多年的技术积累和教学经验,凭着雄厚的师资、优越的课程体系和严格的教学管理,苏嵌正成为江苏嵌入式技术高级专业人才的摇篮。
一、实习目的
1、巩固在书本上学到的理论知识,生产实习是作为本学科的一门实践性的课程,将理论知识与实践生产相结合,加深对理论知识的理解。 2、获得在书本上不易了解和不易学到的生产现场的实际知识,培养发现问题解决问题的能力,使之在实践中得到提高和锻炼。
二、实习时间
四周,共计二十六天
制表人:方照 时间 7月2日
实习内容
嵌入式开发概述及开发工具的使用 嵌入式开发脚本-shell编程
7月3日 实验:开发工具使用,shell编程实验 7月4日 嵌入式C语言高级开发讲解 7月5日 实验:嵌入式C语言开发实训编程 7月6日 嵌入式C语言高级开发讲解 7月7日 作业:完成train1、train2 7月8日 作业:完成train4、train5 7月9日 考试:第一阶段考试 7月10日
嵌入式Linux文件编程 嵌入式Linux进程控制编程
7月11日 实验:嵌入式Linux文件编程与进程控制实训编程 7月12日
嵌入式Linux多线程编程 嵌入式Linux网络编程
7月13日 实验:嵌入式Linux多线程编程与网络实训编程 7月14日 作业:编程实现服务器-客户端通信
7月15日 作业:编程实现客户端-服务器-客户端聊天室
7月16日 嵌入式GUI-QT
7月17日 实验:嵌入式GUI-QT实训开发 7月18日 嵌入式ARM编程
7月19日 实验:嵌入式ARM裸机实训开发 7月20日 嵌入式ARM编程
7月23日 实验:嵌入式ARM裸机实训开发 7月24日 嵌入式开发平台的搭建及测试 7月25日 实验:嵌入式ARM裸机实训开发 7月26日
嵌入式Linux驱动开发 嵌入式项目开发流程介绍
7月27日 考试:最后阶段考试
三、实习地点
金陵科技学院江宁校区工科楼A101
四、实习单位
江苏嵌入式软件公共技术中心
五、实习内容
1、安装Linux:
在PC机中安装Vmware 6.0,再装入Linux 镜像并安装。
2、练习Linux相关命令:
gedit、vim 打开文本编译器,文件不存在时新建文件 tar –xvzf 解压压缩文件 tar –cvzf 压缩文件 cp 复制文件
mv 剪切文件,可重命名,可隐藏文件 mkdir 创建文件夹
touch 创建不打开文件文件 cat 查看文件内容 ls 查看当前目录下内容
chmod 加减文件属性,w/4 ,r/2, x/1 VI三种模式:
命令行模式:ESC键 插入模式:A或I键 底行模式:shift + :
w 保存 q 退出 yy复制 p粘贴 delete 删除语句 ./文件名 执行 gcc编译 rm 删除文件 rm –f 强制删除文件
3、编译器 gcc
源程序-预处理-编译-汇编-链接-可执行文件 预处理:头文件展开、宏替换 编译:将.C文件编译成.O文件
gcc -o编译中 链接成可执行文件,默认a.out gcc -c编译中 预处理、编译、汇编,生成.o目标文件 gcc –e编译中 预处理,生成.i文件 gcc –wall 编译后生成所有的警告信息
gcc –static 连接时装载静态链接库文件,生成.a文件
gcc –O 对程序优化编译、链接,整个源代码会在这过程中进行优化处理 gcc –g 产生调试工具gdb
4、静态库与动态库
动态库只有在使用其程序执行时才被链接使用,而不是将需要的部分直接编译进可执行文件中,并且一个动态库可以被多个程序使用,可称为共享库;
静态库将会整合到程序中,在程序执行时不用加载静态库。从而可知,连接到静态库会使得程序臃肿,并难以升级,但可能会比较容易部署。而链
接到动态库会使得程序轻便易于升级,但难以部署。
5、创建静态库并使用静态库 gcc –c 源文件.c
ar rcs 目标文件1 目标文件2 gcc –O file file.c –L. -lname
6、调试器 gdb
gdb是GNU发布的一款功能强大的程序调试工具 gdb主要完成下面三个方面的功能: 1)、启动被调试程序
2)、让被调试的程序在指定的位置停住
3)、当程序被停住时,可以检查程序状态-变量值 run(r) 开始运行程序
next(n) 单步运行程序(不进入子程序) step(s) 单步运行程序(进入子程序) conutinue(c) 继续运行程序 print(p) 变量名 查看指定变量值 finish 运行程序 直到当前函数结束 watch 变量名 对指定变量进行监控 quit(q) 退出gdb
7、工程管理器 make
工程管理器 顾名思义,是指管理较多的文件 make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动妨碍西安更新过的文件而减少编译的工作量,同时,它通过读入makefile文件的内容来执行大量的编译工作。
makefile是make读入的唯一配置文件。一个makefile中常包含如下内容: A,需有make工具创建的目标体(target),通常是目标文件或可执行文件;
B,要创建的目标体所依赖的文件 。 makefile格式: target:depend_files 运行command命令创建目标体target,target依赖于文件:depend_files 在makefile中,规则的顺序是很重要的,因为,makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在makefie中的目标可能会有很多,但是第一条规则重点目标将被确立为最终的目标。 makefile中把那些没有任何依赖只有执行冬菇总的目标称为“伪目标” 例: .PHONY:clean clean: rm –f hello main.o func1.o func2.o “.PHONY”将“clean”目标声明为伪目标 8、C基础 1)基本数据类型 类型标识符 名 字 char 字符型 取值范围 ASCII字符代码 unsigned char 无符号字符型 0至255 signed char 有符号字符型 -27 ~ 27-1 int 整型 -231~ 231-1 0 ~ 2^16-1 unsigned int 无符号整型 signed int 有符号整型 同int float double 浮点 10^-38~10^38 10^-38~10^38 双精度型 2)移植性 在嵌入式开发中,考虑到代码的移植性,对于有符号(signed)与无符号(unsigned)一定要留心系统默认的是无符号还是有符号; 为了解决此问题,通常使用typedef来重新指定声明无符号还是有符号; typedef int sig_int; typedef unsigned int un_int; 3)声明与定义 定义:创建一个变量,为其分配内存空间,并为它取名字(变量名),一个变量只能定义一次; 声明:告知编译器,这个名字(变量名)已经匹配在一块内存上了,但是并未为其分配内存; 4)关键字 register:请求编译器尽可能地将变量存在CPU内部寄存器中; 使用注意: register修饰变量的类型必须是CPU所接受的; register变量可能不是在内存中存储,所以不能使用&来获取变量的地址 static: 全局静态变量:作用范围局限于它的源文件,即只有本文件内的代码才可以访问它,变量名在其他文件内不可见 局部静态变量:局限于特定函数,但出作用域并不释放,在函数体内的静态变量的值也能够维持 静态函数:作用范围仅限于它的源文件,即只有本文件内才能够调用,函数名在其他文件不可见 存放位置:程序开始时,存放在全局数据区,结束时释放空间,默认初始化值是0,使用时可改变其值; const: const给读代码的人传达非常有用的信息。比如一个函数的参数是const char *,你在调用这个函数时就可以放心地传给它char *或const char *指针,而不必担心指针所指的内存单元被改写。 尽可能多地使用const限定符,把不该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。 const对编译器优化是一个有用的提示,编译器也许会把const变量优化成常量 volatile的作用: ① 不会在两个操作之间把volatile变量缓存存在寄存器中。 ② 不做常量合并、常量传播等优化 ③ 对volatile 变量的读写不会被优化掉 使用volatile的情况: ① 中断服务程序中修改的供其它程序检测变量 ② 多任务环境下各任务间共享的标志 ③ 对存储器映射寄存器的读写 extern:表明变量或函数的定义在别的文件中,下面用到的这些变量或是函数是外来的,不是本文件定义的,提编译器遇到此变量或函数时,在其他模块中寻找定义。 struct: 在网络协议、通信控制、嵌入式系统的C/C++编程中,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。 union: 当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联 合体; 当多种类型,多个对象,多个事物只取其一时,我们也可以使用联合体来发挥其长处。 5)内存管理: 内存分配方式有三种: ① 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。 ② 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 ③ 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 9、系统调用 在Linux中,程序的运行空间分为内核空间和用户空间,逻辑上相互隔离。 用户进程在通常情况下不允许访问内核数据,也无法使用内核函数。 所谓系统调用是指操作系统提供给用户的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得造作系统内核提供的服务。 10、用户编程接口(API) 系统调用并不是直接与程序员进行交互的,它仅仅是一个通过软件中断机制向内核提交请求,以获得内核服务的接口。在实际使用中程序员调用的通常是用户编程接口——API。系统命令相对API更高的一层,它实际上一个可执行程序,它的内部引用了用户编程接口(API)来实现相应的功能。 11、库函数 C库函数的文件操作是独立具体的操作系统平台的,不管是DOS、Windows、 Linux还是在VxWorks中都是这些函数。 12、Linux进程间通信(IPC)由一下几个部分发展而来: 1)、UNIX进程间通信 2)、基于System V进程间通信 3)、POSIX进程间通信 进程间通信方式: 管道、信号、消息队列、共享内存、信号量、套接字 13、进程控制编程 Linux系统是一个多进程的系统,它的进程间具有并行性、互不干扰等特点。每个进程都是一个独立的运行单位,拥有个子独立的权力和责任,各进程都运行在独立虚拟地址空间,发生异常互不影响。Linux中的进程包括“数据段”“代码段”“堆栈段”。标识进程的唯一数字:PID。 14、Linux多线程编程 线程由进程创建,线程间使用相同的地址空间,线程间通信就很方便线程间彼此切换所需要的时间远远小于进程间切换所需时间。 15、Linux网络程序设计 1)、TCP/IP协议,分为三个部分: ① Internet协议(IP) ② 传输控制协议(TCP)和用户数据报协议(UDP) ③ 处于TCP和UDP之上的一组应用协议。 2)、Linux TCP/IP四层概念模型: 应用层、传输层、网际层、网络接口层 3)、服务器模型: 循环服务器:服务器在同意时刻只可以响应一个客户端的请求。 并发服务器:服务器在同一个时刻可以响应多个客户端的请求。 4)、多路复用I/O 阻塞函数字啊完成其指定的任务以前不允许程序继续向下执行 16、ARM裸机开发实战 ARM系列处理器并广泛使用的有:ARM7、ARM9、ARM9E、ARM10、ARM11、SecurCore、Cortex、Xscale、Intel系列。 ARM的工作模式为: 用户(usr)、系统(sys)、快中断(fiq)、中断(irq)、管理(svc)、中止(sbt)、未定义(und)。 CPSR: 程序状态寄存器 N Z C V 保留 I F T M4 M3 M2 M1 M0 31:N=1结果为负,N=0 为正或0 30:Z=1 结果为0,Z=0 结果不为0 29:C=1 进位 ,C=0借位 28:V:溢出保护位,V=1结果溢出,V=0 结果未溢出 27~8:保留 7:I=1:禁止IRQ 6:F=1:禁止FIQ 5:T=0:处理器处于ARM状态,T=1:处理器处于Thumb状态 4~0:M4~M0: 0b10000 usr 0b10001 fiq 0b10010 irq 0b10011 svc 0b10111 abt 0b11011 und 0b11111 sys ARM指令集与Thumb指令集的关系: ARM指令集支持ARM核所有的特性,具有高效、快速的特点; Thumb指令集具有灵活、小巧的特点。 ARM寻址方式有: 寄存器寻址、立即寻址、寄存器移位寻址、寄存器间接寻址、基址寻址、多寄存器寻址、堆栈寻址、块拷贝寻址、相对寻址 六、实习总结 学习嵌入式是我的梦想,我很羡慕能够在嵌入式方面独档一面的高手, 希望有一天我也能像他们那样自信自如的在嵌入式这片热土上挥洒着自己的青春和浪漫。带着无比豪迈的心情和缤纷的梦想来到苏嵌学习嵌入式,在新的老师、新的同学和新的环境中,我开始了我的嵌入式学习,开始了新一轮的拼搏。 在苏嵌短暂的一个月,我们从LINUX基础入手,强化了C语言编程,学习了LINUX系统编程和网络编程。时间虽短,但成长很快,无论是理论知识还是实践能力都得到了大幅度的提高。在这里将理论和实践相结合,相互促进,相互补充,使得学习更加透彻。通过用不同方法实现同一个项目,不断深入,层层推进,学以致用! 在苏嵌的这个暑假,我过得充实而快乐。在这里有着同学间的探讨、师生间的互动和魔鬼般的训练!在我丰富多彩的人生路上留下了永远亮丽与难忘的记忆! 在为期一个月的嵌入式培训实习中,我们在老师们的帮助下度过了一段难忘的时光,本次实习我们不仅仅学到了知识,也在老师们的言传身教中学会了如何做人,如何做一个有益与自身有益于社会的人。 本次实习给我最大的影响可谓是,我的逻辑思维能力得到了很大的改善。嵌入式设计本来就是一种很严密的学问,它需要一个不断反复不断纠正不断改进的过程。通过本次实习,我第一次对团队协作的理念有了更深层次的了解,同时这也将对我未来的人生产生重要的影响。 一个月的时间在人的一生中并不算太长,但一个月的时间却有可能改变人的 一生。每天,我们吃完早饭就去教室,我们在老师们的帮助下,在和老师们的互动中,学习和运用着我们每天所学的知识。 梁老师生动的授课以及热心尽职的实验演示让我在轻松获取知识的同时,也能学到他们做人的一些价值取向。纵观世界,有知识的人多不胜数,但若没有良好的思想道德,最后也不过是为祸人间。所以我们以后无论是否会有惊天成就,莫要为损人不利己的事情,亦是有利于国家的,亦是无愧于此生。 其实实习的作用蛮多的,我也蛮喜欢实习的,但做任何事情都需要用心尽力去完成。也唯有如此,实习带给我们的作用就会很大,我们学到的东西也会比较多。还有就是团队的力量,一个人很难做成大事,但是一群人就相对容易一些了。所以在以后的日子里,我们做事不能独行,更需认真! 最后想以一句俗语的话作为结尾:少往外求,内观自己,一切随缘,用心去做。 因篇幅问题不能全部显示,请点此查看更多更全内容