第9章基于ARM9和Linux嵌入式系统设计.ppt
《第9章基于ARM9和Linux嵌入式系统设计.ppt》由会员分享,可在线阅读,更多相关《第9章基于ARM9和Linux嵌入式系统设计.ppt(136页珍藏版)》请在三一办公上搜索。
1、第9章 基于ARM9和Linux嵌入式系统设计,9.1 嵌入式Linux的开发环境9.2 Linux开发工具的使用9.3 GNU make命令和makefile 文件9.4 嵌入式Linux引导程序9.5 嵌入式Linux 下程序调试应用举例,9.1 嵌入式Linux的开发环境,9.1.1 嵌入式Linux开发环境建立嵌入式Linux 开发环境有几个方案:(1)在WINDOWS 下安装Linux虚拟机后,目前大多情况下使用VWare软件;(2)直接安装 Linux 操作系统。,9.1.2 嵌入式Linux开发的一般过程,1.了解硬件;2.准备需要使用的Linux工具以及其他工具;3.安排内存地
2、址;4.编写启动代码和机器相关代码;5.编写驱动程序;6.C库、GUI和系统程序的移植;7.调试.,9.2 Linux开发工具的使用 9.2.1 Linux开发工具GNU gcc的使用,1.GCC简介 GCC是GNU Compiler Collection的简称,GCC是Linux平台下最常用的编译程序,是Linux平台编译器的事实标准。GCC支持的体系结构有40余种,常见的有x86系列、Arm、PowerPC等。同时,GCC还能运行在不同的操作系统上,如Linux、Solaris、Windows等。GCC除了支持C语言外,还支持多种其他语言,例如C+、Ada、Java、Objective-C
3、、Fortram、Pascal等。,2.GCC常用模式及选项gcc最基本的用法是:gcc options file.其中option是以“-”开始的各种选项,file是相关的文件名。在使用gcc的时,必须给出必要的选项和文件名。gcc的整个编译过程分别是:预处理、编译,汇编和链接。,例如,$gcc-o hello hello.c gcc编译器就会生成一个hello的可执行文件。在hello.c的当前目录下执行./hello。gcc编译器生成的目标文件默认格式为elf(executive linked file)格式,是Linux系统所采用的可执行链接文件的通用文件格式。elf格式由若干个段(s
4、ection)组成,由标准c源代码生成的目标文件中包含以下段:.text(正文段)包含程序的指令代码。.data(数据段)包含固定的数据,如常量,字符串等。.bss(未初始化数据段)包含未初始化的变量和数组等。GCC常用两种模式:编译模式和编译连接模式。,例:假设全部的源代码都在一个文件test.c中。$gcc-o test 此命令是把源文件test.c直接编译成可执行程序test。$gcc-c test.c 此命令是把源文件test.c编译成不可执行目标文件test.o。默认情况下,生成的目标文件名为test.o,但也可以为输出文件指定名称,如下所示:$gcc-c test.c o myte
5、st.o 此命令是把源文件test.c编译成不可执行目标文件mytest.o。下面的命令将同时编译3个源文件,即first.c、second.c和 third.c,然后将它们连接成一个可执行程序test。命令如下:$gcc-o test first.c second.c third.c,3其他常用选项的使用$gcc test.c I./inc-o test此命令告诉GCC包含文件存放在./inc 目录下,在当前目录的上一级。如果在编译时需要的包含文件存放在多个目录下,可使用多个-I 来指定各个目录。如:$gcc test.c I./inc I././inc2-o test此命令指出了另一个包含
6、子目录inc2,较之前目录它还要在再上两级才能找到。另外,还可在编译命令行中定义符号常量。可简单的在命令行中使用-D选项即可,如下例所示:$gcc D TEST_CONFIGURATION test.c-o test上面的命令与在源文件中加入下列命令是等效的:#define TEST_CONFIGURATION,3其他常用选项的使用$gcc test.c I./inc-o test 此命令告诉GCC包含文件存放在./inc 目录下,在当前目录的上一级。若在编译时需要的包含文件存放在多个目录下,可使用多个-I 来指定各个目录:$gcc test.c I./inc I././inc2-o test
7、 上面命令告诉GCC包含文件存放在./inc 目录下,在当前目录的上一级。若在编译时需的包含文件存放在多个目录下,可使用多个-I 来指定各个目录:$gcc test.c I./inc I././inc2-o test 这里指出了另一个包含子目录inc2,较之前目录它还要在再上两级才能找到.另外,我们还可以在编译命令行中定义符号常量。为此,我们可以简单的 在命令行中使用-D选项即可,如下例所示:$gcc-DTEST_CONFIGURATION test.c-o test 上面的命令与在源文件中加入下列命令是等效的:#define TEST_CONFIGURATION,4.警告功能 当GCC在编译
8、过程中检查出错误,则中止编译;但检测到警告时却能继续编译生成可执行程序。在众多的警告选项之中,最常用的是-Wall选项。该选项能发现程序中一系列的常见错误警告,举例如下:$gcc-Wall test.c-o test 该选项相当于同时使用了下列所有的选项:unused-function:遇到仅声明过但尚未定义的静态函数时发出警告。unused-label:遇到声明过但不使用的标号的警告。unused-parameter:从未用过的函数参数的警告。,9.2.2 GDB调试器简介 Linux系统中包含了GNU 调试程序gdb,用来调试C和 C+程序的调试器。gdb 提供如下功能:运行程序,设置所有
9、的能影响程序运行的参数和环境。控制程序在指定的条件下停止运行。当程序停止时,可以检查程序的状态。修改程序的错误,并重新运行程序。动态监视程序中变量的值。可以单步执行代码,观察程序的运行状态。,1gdb的启动在终端窗口中,有两种方法运行gdb,即在终端窗口的命令行中直接输入gdb命令或gdb filename命令运行gdb。方法1:先启动gdb后执行file filename命令。即gdbfile filename执行上述两条命令就可启动gdb,并装入可执行的程序filename。方法2:启动gdb的同时装入可执行的程序。即gdb filename其中,filename是要调试的可执行文件。这和
10、启动gdb后执行file filename命令效果完全一样。启动gdb后,就可以使用gdb的命令调试程序。,2gdb的基本命令gdb中的命令分为以下几类:工作环境相关命令、设置断点与恢复命令、源代码查看命令、查看运行数据相关命令及修改运行参数命令。gdb的命令可以通过help命令进行查找命令所属的种类(class),可以从相关class找到相应命令。如下所示:(gdb)help 此命令可列出命令的种类。(gdb)help data 此命令查找data类种的命令,并列出data类种的所有命令。(gdb)help call 此命令查找call命令。直接键入“help command”来查看命令。,
11、(1)工作环境相关命令,(2)设置断点与恢复命令,(3)gdb中源码查看相关命令,(4)gdb中查看运行数据相关命令,(5)其他gdb命令 run命令:执行当前被调试的程序。kill命令:停止正在调试的应用程序。watch命令:设置监视点,监视表达式的变化。awatch命令:设置读写监视点。当要监视的表达式被读或写时将应用程序挂起。它的语法与watch命令相同。rwatch命令:设置读监视点,当监视表达式被读时将程序挂起,等侍调试。此命令的语法与watch相同。,info break命令:显示当前断点列表,包括每个断点到达的次数。info files命令:显示调试文件的信息。info func
12、命令:显示所有的函数名。info local命令:显示当前函数的所有局部变量的信息。info prog命令:显示调试程序的执行状态。Shell命令:执行Linux Shell命令。make命令:不退出gdb而重新编译生成可执行文件。Quit命令:退出gdb。,(6)gdb中修改运行参数相关命令gdb可修改运行时的参数,并使该变量按照用户当前输入的值继续运行。方法为:在单步执行的过程中,键入命令:set 变量设定值在此之后,程序就会按照该设定的值运行了。特别注意,在gcc编译选项中一定要加入”-g”。只有在代码处于“运行”或“暂停”状态时才能查看变量值,设置断点后程序在指定行之前停止。,9.3
13、GNU make命令和makefile 文件 显式规则 隐晦规则 文件指示。其包括3个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。注释。Makefile中只有行注释,用“#”字符在Makefile中的命令,必须要以Tab键开始。,GNU的make工作时的执行步骤如下:1.读入所有的Makefile。2.读入被include的其它Makefile。3.初始化文件中的变量。4.推导隐晦规则,并分析所有规则。5.为所有的目标文件创建
14、依赖关系链。6.根据依赖关系,决定哪些目标要重新生成。7.执行生成命令。,9.3.1 Makefile文件的规则 1Makefile书写规则 Makefile文件含有一系列的规则,规则内容:一个目标(target),即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如clean。一个或多个依赖文件(dependency)列表,通常是编译目标文件所需要的其他文件。一系列命今(command),是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行起始字符必须为TAB字符。,Makefile规则的一般形式如下:target:
15、dependency dependency(tab)例如:有以下的Makefile文件:test:prog.o code.ogcc o test prog.o code.oprog.o:prog.c prog.h code.hgcc c prog.c o prog.ocode.o:code.c code.hgcc c code.c o code.oclean:rm f*.o,一般情况下,调用make命令可输入:#make targettarget是Makefile文件中定义的目标之一,如果省略target,make就将生成Makefile文件中定义的第一个目标。对于上面Makefile的例子,
16、单独的一个make命令等价于:#make test因为test是Makefile文件中定义的第一个目标,make首先将其读入,然后从第一行开始执行,把第一个目标test作为它的最终目标,所有后面的目标的更新都会影响到test的更新。,内核源代码中Makefile被分布在目录树中,与Makefile直接相关的文件有配置文件.config和规则文件Rules.make。顶层Makefile是整个内核配置、编译的总体控制文件。在顶层Makefile中的语句:include arch/$(ARCH)/Makefile包含了特定CPU体系结构下的Makefile,这个Makefile中包含了平台相关的信
17、息。配置文件.config包含由用户选择项,用来存放内核配置后的结果(如make config)。位于各种CPU体系目录下的Makefile,比如drivers/Makefile,负责所在子目录下源代码的管理。规则文件Rules.make,则被所有的Makefile使用。,用户通过make config配置后,产生了.config。顶层Makefile读入.config中的配置选择。顶层Makefile有两个主要的任务:产生压缩的内核镜像vmlinux文件和内核模块module。为了达到此目的,顶层Makefile递归的进入到内核的各个子目录中,分别调用位于子目录中的Makefile。至于到底
18、进入哪些子目录,取决于内核的配置。位于各个子目录下的Makefile同样也根据.config给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有include$(TOPDIR)/Rules.make。,2.在规则中使用通配符make支持3种通配符:“*”,“?”和“.”。波浪号(“”)字符在文件名中有特殊的用途。如“test”表示当前用户的$HOME目录下的test目录。而“hchen/test”则表示用户hchen的宿主目录下的 test目录。通配符“*.c”表示所有以后缀为c的文件。例如:print:*.clpr-p$?touch print该例说明目标print依赖于所有的
19、.c文件。其中的“$?”是一个自动化变量。,3.伪目标伪目标又称假想目标,如:clean:rm*.o temp这里并不生成“clean”这个文件。“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。可使用“make clean”来使用该目标。如果你的Makefile需要生成若干个可执行文件,可把所有的目标文件都写在一个Makefile中,可声明了一个“all”的伪目标。,声明了一个“all”的伪目标例如:all:prog1 prog2 prog3prog1:prog1.o utils.occ-o prog1 prog1.o uti
20、ls.oprog2:prog2.occ-o prog2 prog2.oprog3:prog3.o sort.o utils.occ-o prog3 prog3.o sort.o utils.o,9.3.2 Makefile文件中隐含规则1常用的隐含规则 编译C程序的隐含规则:.o的目标的依赖目标会自动推导为.c,并且其生成命令是$(CC)c$(CPPFLAGS)$(CFLAGS)。编译C+程序的隐含规则:.o的目标的依赖目标会自动推导为.cc或是.C,并且其生成命令是$(CXX)c$(CPPFLAGS)$(CFLAGS)。(建议使用.cc作为C+源文件的后缀,而不是.C),汇编和汇编预处理的隐
21、含规则:.o的目标的依赖目标会自动推导为.s,默认使用编译器as,并且其生成命令是:$(AS)$(ASFLAGS)。.s的目标的依赖目标会自动推导为.S,默认使用C预编译器cpp,并且其生成命令是:$(AS)$(ASFLAGS)。链接Object文件的隐含规则目标依赖于.o,通过运行C 的编译器来运行链接程序生成(一般是ld),其生成命令是:$(CC)$(LDFLAGS).o$(LOADLIBES)$(LDLIBS)。这个规则对于只有一个源文件的工程有效,同时也对多个Object文件(由不同的源文件生成)也有效。,2隐含规则使用的变量(1)关于命令的变量。AR:函数库打包程序。默认命令是ar。
22、AS:汇编语言编译程序。默认命令是as。CC:C语言编译程序。默认命令是cc。CXX:C+语言编译程序。默认命令是g+。CPP:C程序的预处理器(输出是标准输出设备)。默认命令是$(CC)E。RM:删除文件命令。默认命令是rm f。,(2)关于命令参数的变量 以下变量都是相关上面的命令的参数。若没有指明其默认值,则其默认值都是空。ARFLAGS:函数库打包程序AR命令的参数。默认值是rv。ASFLAGS:汇编语言编译器参数。(当明显地调用“.s”或“.S”文件时)。CFLAGS:C语言编译器参数。CXXFLAGS:C+语言编译器参数。CPPFLAGS:C预处理器参数。(C 和 Fortran
23、编译器也会用到)。FFLAGS:Fortran语言编译器参数。GFLAGS:SCCS get程序参数。LDFLAGS:链接器参数。(如:ld),3自动化变量常用的自动化变量如下。$:表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,$就是匹配于目标中模式定义的集合。$%:仅当目标在函数库文件中,表示规则中的目标成员名。例如,如果一个目标是 foo.a(bar.o),那么,$%就是bar.o,$就是foo.a。如果目标不是函数库文件(Unix下是.a,Windows下是.lib),那么,其值为空。,$:依赖目标中的第一个目标名字。如果依赖目标是以模式(即%)定义的,那么$将是符合模式的
24、一系列的文件集。注意,是一个一个取出来的。$?:所有比目标新的依赖目标的集合,以空格分隔。$:所有的依赖目标的集合,以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。$+:这个变量很像$,也是所有依赖目标的集合。只是它不去除重复的依赖目标。,$*:表示不包含扩展名的目标文件名,即目标模式中“%”及其之前的部分。例:目标是dir/a.foo.b,并且目标的模式是a.%.b,那么,$*的值就是dir/a.foo。如果目标中没有模式的定义,那么$*也就不能被推导出。如果目标文件的后缀是make 所识别的,那么$*就是除了后缀的那一部分。例如:如果目标是foo.c
25、,因为.c是make所能识别的后缀名,所以,$*的值就是foo。,对于上面的七个变量都可以分别加上D或是F,表示取文件的目录部分和文件部分。下面以$为例说明其含义:$(D):表示$的目录部分(不以斜杠作为结尾),如果$值是dir/foo.o,那么$(D)就是dir,若$中没有包含斜杠,其值是“.”(当前目录)。$(F):表示$的文件部分,如果$值是dir/foo.o,那么$(F)就是foo.o,$(F)相当于函数$(notdir$)。,9.3.3 Makefile文件的命令 1显示命令echo 正在编译XXX模块.当make执行时,会输出“正在编译XXX模块.”字符串,但不会输出命令,如果没有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ARM9 Linux 嵌入式 系统 设计
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-4872251.html