毕业实习报告书
课题名称: 基于Linux的嵌入式学习
系 (部): 信息工程系
专业班级: 计算机科学与技术 学生姓名: 学 号: 完成日期:
实习类型 组 别 实习人姓毕业实习 实习地点 实习课题 基于Linux的嵌入式学习 名 指导教师 实 习 成 绩 - 同组人员 实习日期 指导教师评语 指导教师签名:______________ _______年 ____ 月____日 2
一、实习目的
学习和了解了嵌入式在生活中的重要作用和发展过程,熟练掌握ARM硬件体系结构,熟悉Linux下的嵌入式编程流程,积累自己的软件编写经验,能够参与并实现一个真实和完整的嵌入式项目,为今后的学习和将从事的技术工作打下坚实的基础。
二、实习单位及实习岗位简介
北京亚嵌科技有限责任公司是国内最早开展嵌入式教育培训的机构,是中国嵌入式教育的创立者和领航者,开创了国内嵌入式教育的先河。亚嵌(AKAE)发源于1998年在清华大学成立的AKA组织(www.aka.org.cn),秉承AKA“自由、协作、创造”的技术理念和核心价值,始终致力于嵌入式技术的人才培养、项目研发、技术推广和咨询服务工作。
嵌入式技术凝聚了计算机和信息技术的精华,嵌入式技术人才是具备透视计算机和信息技术奥秘的高级专业人才。作为国内最早开展嵌入式技术教育的研究机构,亚嵌(AKAE)将嵌入式技术人才的培养作为自己的终身事业,把最新的技术发展和行业需求结合起来,为广大学员提供最完善、最有效的技术咨询和培训服务。凭着多年的技术积累和教学经验,凭着雄厚的师资、优越的课程体系和严格的教学管理,学员的就业率一直保持在 100%。已为国内外各大公司和科研院所培养嵌入式技术人才上千名,真正成为国内嵌入式技术高级专业人才的摇篮。
三、实习内容
1. Linux操作和编程基础
主要介绍Linux(Ubuntu)的基本命令和基础编程知识,包括Linux的文件操作和目录操作命令,VI编辑器,GCC编译器,GDB调试器和Make项目管理工具等知识以及基本的命令按下ESC键,跳转到下一个单词的第一个字母,在命令模式输入w或W。跳转到当前单词的最后一个字母,在命令模式输入e或E。跳转到当前单词的第一个字母,在命令模式输入b或B,屏幕向前翻滚半屏,在命令模式输入Ctrl + u,屏幕向后翻滚半屏,在命令模式输入Ctrl + d,屏幕向前翻滚一屏,在命令模式输入Ctrl + f,相当于Page Up,幕向后翻滚一屏,在命令
3
模式输入Ctrl + b,相当于PageDn,按下V,然后上下移动光标选中要删除的行,再按下d。直接在命令模式下,删除当前光标下的5行,按下5dd。 2. 嵌入式C语言编程基础
在开始的时候主要学习了c语言的基本语法,如,数据类型,运算符的详解,分支结构,循环结构,分支结构包括逻辑表达式,if语句,if/else语句,布尔代数,循环语句包括while语句,do/while语句,for语句,空语句。接着有学习了数组,包括一维数组,多维数组指针数组,接着又学习了字符串的操作,包括字符串的复制,字符串的拼接,在接着有学习了复杂数据类型结构体,联合和枚举,定义新的数据类型,使用联合体可以节省空间,可以使用联合体来构造混合的数据结构,或添加标记字段,并且学习了简单的函数,包括自定义函数,函数的定义及调用,函数的声明,包括形参实参的传递,还包括返回值,并且了解了局部变量和全局变量的存储位置,接着又学习了递归函数实现汉诺塔模型,进一步加深了对递归函数的理解,接着有学习了位操作,包括移位运算,最后学习了c语言中最重要的部分指针,接着学习了取地址和间接寻址,并且学习了对指针的赋值int*p,p=&i;指针可以作为参数进行传递,指针可以作为返回值,用const 保护实际参数,指针可以用于数组处理,用printf和puts函数写字符串,用scanf 和gets 函数读取字符串,字符串比较函数,字符串拷贝函数,strcmp.,strcpy,strncpy,l连接函数strncat,分隔strtok,接着又简单的学习了汇编以及汇编和c的关系。接着又讲了多目标文件的链接,以及静态库,共享库,接着又讲了makefile 的隐含规则和模式规则。Make ,以及make clean 接着有学习了预处理,包括宏定义,带参数的宏,以及#运算符和##运算符的应用。高级指针包括指向指针的指针,指向指针的指针数组,指向数组的指针,与多维数组,回调函数,函数接口,以及文件操作。包括文件的打开关闭,格式化的输入输出,字符的输入输出,字符串的输入输出、以记录为单位的输入输出。 3. Linux上C强化编程训练
主要包括整数算法训练,递归和栈编程训练,位操作训练,指针训练,字符串训练和常用C库函数编程接口实践,强化了对Linux下基本编程开发的理解和编码调试的能力。
主要包括函数的调用,以及编码风格的规范,整数算法训练,递归和栈编程训练,
4
汉诺塔的练习,位操作训练,了解了结构体的对其,指针训练,掌握了地址和值得学习,字符串训练,主要包括,字符串的连接,空格的去处,讲解了状态机的编程思
想,在此过程中,对常用的循环语句进行了强化训练,是自己的逻辑能力得到了一定程度的提高,增强了对Linux下基本编程开发的理解和编码调试的能力,使自己更加深刻的理解了c语言的相关知识,加深了对知识点的应用,为以后的学习打下了基础。
4. Linux环境高级编程及项目开发编程实践
主要包括系统编程(信号/系统调用/管道/FIFO/消息队列/共享内存等),文件I/O编程(文件描述符/文件读写接口/原子操作/阻塞与非阻塞IO等,多任务和多线程编程(进程标识/ 用户标识/fork与vfork/多线程概念/线程同步等),网络编程(网络基本概念/套接口编程/网络字节次序/Client/Server结构/UDP编程);掌握Linux下Socket编程的开发流程,熟悉网络编程的调用接口函数和相关数据结构,使学员初步具备在Linux上进行系统编程开发的能力。同时综合之前所学内容和编程技术,以小组为单位进行一个团队合作项目的开发,考核内容包括文件I/O编程,多线程编程,网络编程和项目文档编写。 5.字节排序
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据 存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大 端字节序的。因而对int、uint16、uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序。通常我们认为,在空中传输的字节 的顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络 字节序转换为主机字节序。 6. TCP/IP协议基础
TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、网络层(Network)和链路层(Link)四层,传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台
5
计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。类型字段有三种值,分别对应IP、ARP、RARP。帧末尾是CRC校验码。以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。ifconfig命令的输出中也有TU:1500。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度,IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。对于IPv4,4位版本字段是4。4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。8位TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),还有一个位总是0。总长度是整个数据报(包括IP首部和IP层payload)的字节数。每传一个IP数据报,16位的标识加1,可用于分片和重新组装数据报。3位标志和13位片偏移用于分片。TTL(Time to live)是这样用的:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。然后是校验和,只校验IP首部,数据的校验由更高层协议负责。IPv4的IP地址长度为32位。 7.代码优化
入式系统对应用软件的质量要求更高,因而在嵌入式开发中尤其须注意对代
码进行优化,尽可能地提高代码的效率,减少代码的大小。虽然现代C和C++编译 器都提供了一定程度的代码优化,但大部分由编译器执行的优化技术仅涉及执行速度和代码大小的平衡,不可能使程序既快又小,因而必须在编写嵌入式软
6
件时采取 必要的措施。 (1)提高代码的效率
switch-case语句。在程序中经常会使用switch-case语 句,每一个由机器语
言实现的测试和跳转仅仅是为了决定下一步要做什么,就浪费了处理器时间。为了提高速度,可以把具体的情况按照它们发生的相对频率排序。 即把最可能发生的情况放在第一,最不可能发生的情况放在最后,这样会减少平均的代码执行时间。
全局变量。使用全局变量比向函数传递参数更加有效率,这样做去除了函数
调用前参数入栈和函数完成后参数出栈的需要。当然,使用全局变量会对程序有一些负作用。 (2)减小代码的大小
嵌入式系统编程应避免使用标准库例程,因为很多大的库例程设法处理所有
可能的情况,所以占用了庞大的内存空间,因而应尽可能地减少使用标准库例程。 (3)避免内存泄漏
用户内存空间(堆)为RAM中全局数据和任务堆栈空间都分配后的剩余空
间,为了使程序能有足够的内存运行,必须在申请的内存不用后及时地将其释放,以确 保再次申请时能有空间。如果程序中存在内存泄漏(即申请内存后没有及时释放)的情况,程序最终会因为没有足够的内存空间而无法运行。
四、实习总结
在亚嵌学习过程中,我学到很多的知识,对很多知识有了更进一步的了解,现在对于我们每个人来说,需要的已经不再仅仅是放在桌面上处理文档,进行工业管理和生产控制的计算机“机器”任何一个普通的人都可能拥有从小到大的各种嵌入式技术的电子产品,小到MP3\\PDA等微型数字化产品,大到网络家电,智能家电等,各种各样的新型嵌入式系统设备在应用数量上已经远远超过了通用计算机,在工业和服务领域,使用嵌入式技术的数字机床、智能工具、工业机器人、服务机器人、正在逐渐的改变着传统的工业生产和服务方式。而ARM芯片凭借强大的处理能力和极低的功耗,非常适合这些场合。所以现在越来越多的公司在产品选型的时候考虑到使用ARM处理器,从这个角度来说,对于我们在校大学生来说,如能掌握了嵌入式开发技术,对于寻找一份好的工作也十分有利。
7
经过在北京亚嵌这段时间培训,感觉到自己原先的学习不扎实,嵌入式的学习虽然难,但主要的还是基础知识,基础掌握不牢,提高无从谈起,以后尽量使自己的学习踏实,虚心向别人学习。今后我回更加下力去学习钻研,希望有朝一日能在嵌入式领域有自己的一席之地。
五、参考文献
[1]亚嵌就业班培训教材
[2]王世江著inux私房菜 基础学习篇(第二版).人民邮电出版社.2007年9月 [3]王世江著Linux私房菜 服务器架设篇(第二版)机械工业出版社.2008年1 月
[4] W.Richard Steven,Stephen A.Rago著 UNIX环境高级编程(第二版) 人民
邮电出版社.2010年11月
[5]Jon Bentley著 编程珠玑(第二版) 中国电力出版社.2004年4月
8
因篇幅问题不能全部显示,请点此查看更多更全内容