您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 嵌入式linux系统移植和简单驱动讲稿
1 嵌入式linux系统移植和简单驱动 文件状态: [ ] 草稿 [ ] 正式发布 [ √ ] 正在修改 文件标识:北航科技园嵌入式技术中心 嵌入式linux系统移植和简单驱动 当前版本:0.1 作 者: 蒙洋 博 客: 进度记录 GNUtools完成 Bootloader部分还有待丰富内容 完成日期:2010‐8‐30 2 嵌入式Linux开发环境搭建 内容提纲 `嵌入式linux开发介绍 `嵌入式系统简介 `嵌入式linux系统构成 `嵌入式linux系统开发移植主要工作 `嵌入式Linux开发环境的搭建 `搭建嵌入式Linux开发环境的主要工作 `嵌入式Linux交叉开发环境硬件基本组成 `为什么需要交叉编译? `gnu工具链简介 `安装交叉编译工具,开源的gcc的编译 `主机、目标机通讯及为提供开发效率辅助方法介绍 `主机端需要什么 `目标机端需要什么 GNU Tools建立和开发环境 GUN Tools是Linux环境下的主要开发工具,掌握这些开发工具的使用是嵌入式Linux开发人员所必须的技能,必须的! 这一讲我们将花费很长的时间来介绍GUN Tools开发工具中的核心软件及其调试工具,为后面的驱动和应用的开发打下坚实的基础。我们这里只是涉及到了在嵌入式开发经常用的工具软件,更多的参数和功能大家可以参考手册。我这里是抛砖引玉,希望能发现几块好玉,呵呵! 1、GUN Tools简介 嵌入式软件开发与普通的软件开发没有什么不同,但是由于嵌入式系统的可配置性和定制性,需要开发者对嵌入式系统的每个环节要十分的了解(举例在PC下写应用不需要了解系统的很多机制)。为了更好的进行嵌入式linux开发至少要了解如下4类开发工具: 编译工具:源程序—》可执行程序,GCC 调试工具:debug源程序,包括c代码和汇编代码,GDB 软件工程工具:用于大型项目的管理,make,CVS(注) 其他工具:连接器,格式转换的工具 注:CVS: 全称是Current Version Control. CVS是一种GNU 软件包.由Intersolv公司开发,昀新的版本是1.10.8.它是一种基于RCS系统的维护工具.它明确的将源文件的存储和用户的工作空间独立开来,有在一定的模式上扩展了RCS的恢复提交功能. 并使其有利与并行开发. 2、GCC和GNUTools工具集介绍 在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux 程序员面临的首要问题都是如何灵活运用C编译器。目前Linux 下昀常用的C语言编译器是 3 GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。昀值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal等。 GNU Tools工具集 Gcc:符合ISO标准的C编译器 G++:符合ISO标准的C++编译器 GNU binutils是一组二进制工具集。包括:addr2line、ar、as、gprof、ld、nm、objcopy、 objdump、ranlib、size、strings、 strip. 这里归纳他们的常用法。 arar用于建立、修改、提取档案文件(archive)。archive是一个包含多个被包含文件的单一文件(也称之为库文件),其结构保证了可以从中检索并得到原始的被包含文件(称之为archive中的member)。member的原始文件内容、模式(权限)、时间戳、所有着和组等属性都被保存在 archive中。member被提取后,他们的属性被恢复到初始状态。 ar可以主要用于创建C库文件 多说没用,大家可以参考数据手册。举个简单的例子: 建立程序add.c int Add(int a,int b) { int result; result=a+b; return result; } 建立程序minus.c 4 int Minus(int a ,int b) { int result; result=a‐b; return result; } 执行命令: gcc –c add.c minus.c ‐c的含义是只编译生成object文件,生成add.o和minus.o ar rv libtest.a add.o minux.o 生成一个libtest.a的库文件 将libtest.a文件拷贝到/usr/lib/下,下面我们编写一个测试程序来验证一下我的库文件是否好用。 建立test_ar.c文件用于测试 #includestdio.h int main(int argc,char *argv[]) { int a=10; int b=9; printf(a=%d\t b=%d\n,a,b); int sum=Add(a,b); printf(a+b=%d\n,sum); int cha=Minus(a,b); printf(a‐b=%d\n,cha); return 0; } 5 这个程序调用了我们自己做的库文件中的函数Add()和Minus(),编译测试程序,命令如下: gcc ‐o test_ar test_ar.c ‐ltest ‐ltest就是链接刚才的生成库文件,这样就可以使用库文件中的函数了,编译生成test_ar可执行文件,运行结果如下: t : 显示archive中member的内容,若不指定member,则列出所有。 v : 与t结合使用时,显示member的详细信息。 r :将参数“member…”指定的文件列表插入归档文件。 nmnm用来列出目标文件中的符号,可以帮助程序员定位和分析执行程序和目标文件中的符号信息和它的属性。 如果没有目标文件作为参数传递给nm, nm假定目标文件为a.out. 这里用一个简单的示例程序来介绍nm的用法: 通过如下的命令可以查看nm的帮助 nm ‐h 还是利用刚才我们那个ar的测试例子,来分析nm的功能,执行如下的命令,相应的输出结果如下: #gcc –c test_ar.c 产生test_ar.o文件 # nm test_ar.o U Add 说明没有定义Add()函数 00000000 T main 说明定义了main()函数 U Minus 说明没有定义Minus()函数 U printf 说明没有定义printf()函数,实际printf函数定义在libc.a # nm add.o 00000000 T Add 说明定义了Add()函数 # nm minus.o 00000000 T Minus 说明定义了Minus()函数 objcopyobjcopy可以将一种格式的目标文件转化为另外一种格式的目标文件. 它使用GNU BFD库进行读/写目标文件.使用BFD, objcopy就能将原格式的目标文件转化为不同格式的目标文件. 以我们在nm中使用的test_ar.o目标文件和test_ar可执行为例: a=10 b=9 a+b=19 a‐b=1 6 #filetest_ar.otest_arfile命令用来判别文件类型, 输出如下: test_ar.o: ELF 32‐bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped test_ar: ELF 32‐bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped 现在运行objcopy来改变test_ar的文件类型: 原先它是ELF格式的可执行程序, 现将它转换为srec格式. srec格式文件是Motolora S‐Record格式的文件, 主要用来在主机和目标机之间传输数据. #objcopy-Osrectest_arts_objcopy#filets_objcopyts_objcopy:MotorolaS-Record;binarydataintextformat执行完后,生成一个ts_objcopy文件,查看其文件格式发生了变化。 注意objcopy的格式, ‐O指定输出文件类型; 输入文件名和输出文件名位于命令末尾. objdumpobjdump用来显示目标文件的信息. 可以通过选项控制显示那些特定信息. objdump一个昀大的用处恐怕就是将C代码反汇编了. 在嵌入式软件开发过程中, 也可以用它查看执行文件或库文件的信息. 下面我们用上文提到的test_ar可执行文件和ts_objcopy可执行文件为例, 介绍objdump的简单用法: # objdump ‐f test_ar test_ar: file format elf32‐i386 architecture: i386, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x08048310 # objdump ‐f ts_objcopy ts_objcopy: file format srec architecture: UNKNOWN!, flags 0x00000000:‐f : 显示目标文件的头文件概要信息. 生成反汇编代码,比如前面的add.o文件: #objdump-dadd.o 7 add.o:fileformatelf32-i386Disassemblyofsection.text:00000000Add:0:55push%ebp1:89e5mov%esp,%ebp3:83ec10sub$0x10,%esp6:8b450cmov0xc(%ebp),%eax9:034508add0x8(%ebp),%eaxc:8945fcmov%eax,0xfffffffc(%ebp)f:8b45fcmov0xfffffffc(%ebp),%eax12:c9leave13:c3ret‐d : 显示目标文件中机器指令使用的汇编语言. 只反汇编那些应该含有指令机器码的节(显示.text段); 如果用‐D, 则反
本文标题:嵌入式linux系统移植和简单驱动讲稿
链接地址:https://www.777doc.com/doc-616309 .html