嵌入式操作系统:第3章嵌入式Linux的开发环境及工具软件

举报
资源描述
第第3 3章章 嵌入式嵌入式LinuxLinux的开发环境及工具软件的开发环境及工具软件3.1嵌入式嵌入式Linux的开发环境的开发环境3.2Linux开发工具的使用开发工具的使用3.3GNUmake命令和命令和makefile文件文件3.4使用使用Automake和和Autoconf生成生成makefile文件文件3.5嵌入式嵌入式Linux编辑器编辑器vi的使用的使用3.6Emacs综合编辑器综合编辑器建立交叉编译环境建立交叉编译环境启动代码启动代码Bootloader的实现的实现/移植移植kernel的配置的配置/移植移植/编译编译根文件系统根文件系统Cramfs的实现的实现嵌入式开发流程嵌入式开发流程3.1 嵌入式嵌入式Linux的开发环境的开发环境3.1.1嵌入式嵌入式Linux开发环境建立开发环境建立有几个嵌入式有几个嵌入式Linux Linux 开发环境方案:开发环境方案:(1)基于)基于PC机机WINDOWS操作系统下的操作系统下的CYGWIN;(2)在)在WINDOWS下安装虚拟机下安装虚拟机VMware软件,使软件,使用用redhat9虚拟机,即在虚拟机中安装虚拟机,即在虚拟机中安装LINUX操作系统;操作系统;(3)直接安装)直接安装LINUX操作系统,也可安装操作系统,也可安装ubuntu。交叉编译交叉编译交叉编译交叉编译就是在一个平台上生成另一个平台上的可执行代码。就是在一个平台上生成另一个平台上的可执行代码。这里说的这里说的平台分别指的是主机平台平台分别指的是主机平台Host和目标平台和目标平台Target。就我们在就我们在ARM平台上移植平台上移植Linux来说,来说,Host是一台一般的是一台一般的PC机,它通过串机,它通过串口或网络接口与口或网络接口与Target通信;通信;Target是是arm-linux平台平台(这里说的这里说的arm指的是指的是平台所使用的平台所使用的CPU是是ARM9处理器,处理器,linux指的是运行的操作系统是指的是运行的操作系统是Linux)。我们在我们在Host上开发程序,并在这个平台上运行交叉编译器上开发程序,并在这个平台上运行交叉编译器CrossComplier,编译我们的程序,编译我们的程序,而由而由CrossComplier生成的程序将在生成的程序将在Target上运行。上运行。“既然我们已经有了主机编译器,那为什么还要既然我们已经有了主机编译器,那为什么还要交叉编译呢?交叉编译呢?”需要交叉编译的原因:需要交叉编译的原因:首先,在项目的起始阶段,目标平台尚未建立,因此需要做交叉编译,以生成我们所需要的Bootloader以及kernel(因为Bootloader和kernel的源码需要经过交叉编译后才可以在目标平台上运行);其次,当目标平台能启动之后,由于目标平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。交叉编译 我们在主机平台上开发程序,并在这个平台上运行交叉编译器,编译我们的程序;而由交叉编译器生成的程序在目的平台上运行。要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。armv4l-unknown-linux-gcc:交叉编译linux内核 arm-linux-gcc:交叉编译linux内核 arm-elf-gcc:主要交叉编译uclinux内核 arm-uclinux-gcc:交叉编译uclinux内核主要下载网址:主要下载网址:www.gnu.org为了在命令行中能够寻找到交叉编译器,我们需要把它所在的路径加入到PATH环境变量中(例:/usr/local/arm/bin:$PATH)。常用在常用在ARM平台的平台的GNUToolchain3.1.2 3.1.2 嵌入式嵌入式LinuxLinux开发的一般过程开发的一般过程1.了解硬件了解硬件;2.准备需要使用的准备需要使用的Linux工具以及其他工具工具以及其他工具;3.安排内存地址安排内存地址;4.编写启动代码和机器相关代码编写启动代码和机器相关代码;5.编写驱动程序;编写驱动程序;6 6.C库、库、GUI和系统程序的移植;和系统程序的移植;7 7.调试。调试。3.1嵌入式嵌入式Linux的开发环境的开发环境3.2Linux3.2Linux开发工具的使用开发工具的使用开发工具的使用开发工具的使用3.3GNUmake命令和命令和makefile文件文件3.4使用使用Automake和和Autoconf生成生成makefile文件文件3.5嵌入式嵌入式Linux编辑器编辑器vi的使用的使用3.6Emacs综合编辑器综合编辑器第第3 3章章 嵌入式嵌入式LinuxLinux的开发环境及工具软件的开发环境及工具软件3.2 Linux开发工具的使用3.2.1Linux开发工具开发工具GNUgcc的使用的使用1、GCC简介简介GCC是是GNUCompilerCollection的简称,的简称,GCC是是Linux平台下最常用的编译程序,除了支持平台下最常用的编译程序,除了支持C语言外,还语言外,还支持多种其他语言,例如支持多种其他语言,例如C+、Ada、Java、Objective-C、Fortran、Pascal等。等。GCC支持的体系结构有支持的体系结构有40余种,常见的有余种,常见的有x86系列、系列、Arm、PowerPC等。同时,等。同时,GCC还能运行在不同的操作还能运行在不同的操作系统上,如系统上,如Linux、Solaris、Windows等。等。GCCGCCGCCGCC无所不在无所不在无所不在无所不在宏定义宏定义#3.2 Linux开发工具的使用使用使用gccgcc编译程序时,编译编译程序时,编译过程可以细分为个阶段:过程可以细分为个阶段:(1)预处理(Preprocessing)、(2)编译(Compilation)、(3)汇编(Assembly)(4)链接(Linking)。3.2.1Linux开发工具开发工具GNUgcc的使用的使用2、GCC常用模式及选项常用模式及选项gcc最基本的用法是:最基本的用法是:gccoptionsfile.其中其中options是以是以“-”开始的各种选项,开始的各种选项,file是相关的文是相关的文件名。在使用件名。在使用gcc的时,必须给出必要的选项和文件名。的时,必须给出必要的选项和文件名。gcc的整个编译过程分别是:的整个编译过程分别是:预处理、编译,汇编和链预处理、编译,汇编和链接接。3.2 Linux开发工具的使用示例程序示例程序/helloworld.c#include int main(void)printf(Hello World!n);return 0;3.2.1Linux开发工具开发工具GNUgcc的使用的使用2、GCC常用模式及选项常用模式及选项GCC最常用的有两种模式:最常用的有两种模式:编译模式编译模式:gcchelloworld.c-ohelloworld编译连接模式编译连接模式:gcc-chelloworld.c-ohelloworld.o说明说明:编译模式生成的二进制机器代码为可执行的;编译连:编译模式生成的二进制机器代码为可执行的;编译连接模式生成的二进制机器代码不可执行,只生成目标接模式生成的二进制机器代码不可执行,只生成目标文件文件helloworld.o。可以自定义文件名可以自定义文件名,如,如gcc-chelloworld.c-omyHelloWorld.o3.2 Linux开发工具的使用3.2 Linux开发工具的使用(1)预处理(Preprocessing):(2)编译(Compilation):(3)汇编(Assembly):(4)链接(Linking):一步到位的编译指令:一步到位的编译指令:gcc helloworld.c gcc helloworld.c-o helloworld-o helloworldgcc-E helloworld.c-o helloworld.igcc-E helloworld.c-o helloworld.igcc-S helloworld.i-o helloworld.sgcc-S helloworld.i-o helloworld.sgcc-gcc-c c helloworld.helloworld.s s-o helloworld.-o helloworld.o ogcc helloworld.o-o helloworldgcc helloworld.o-o helloworld主要作以下几种事情主要作以下几种事情:所有的所有的#define#define删除,并且展开所有的宏定义;删除,并且展开所有的宏定义;处理所有条件编译指令;处理所有条件编译指令;处理处理#include#include预编译指令,将被包含的文件插入到该预编译指令的位置。预编译指令,将被包含的文件插入到该预编译指令的位置。删除所有的注释删除所有的注释/和和 ;添加行号和文件标识;添加行号和文件标识;保留所有的保留所有的#pragma#pragma编译器指令;编译器指令;生成汇编代码生成汇编代码编译为目标文件编译为目标文件将程序的目标文件与所需的所有附加的目标将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件文件连接起来,最终生成可执行文件3.2.1Linux开发工具开发工具GNUgcc的使用的使用多个文件的编译多个文件的编译通常整个程序是由多个源文件组成的,相应地也就形成了多通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用个编译单元,使用GCC能够很好地管理这些编译单元。能够很好地管理这些编译单元。假设有一个由假设有一个由test1.c和和test2.c两个源文件组成的程序,两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序为了对它们进行编译,并最终生成可执行程序test,可,可以使用以使用以下以下命令:命令:gcctest1.ctest2.c-otest3.2 Linux开发工具的使用gcc-c test1.c-o test1.ogcc-c test1.c-o test1.ogcc-c test2.c-o test2.ogcc-c test2.c-o test2.ogcc test1.o test2.o-o testgcc test1.o test2.o-o test源文件源文件头头文件不在同一目文件不在同一目录录下怎么下怎么办办?(假?(假设设test.c在在./src目目录录下,而包含文件在下,而包含文件在./inc目目录录下)下)$gcctest.cI./inc-otest此命令告诉此命令告诉GCC包含文件存放在包含文件存放在./inc目录下,即在当前目录目录下,即在当前目录的上一级。若在编译时需要的包含文件存放在多个目录下,的上一级。若在编译时需要的包含文件存放在多个目录下,可使可使用多个用多个-I来指定各个目录:来指定各个目录:$gcctest.cI./incI././inc2-otest 这里指出了另一个包含子目录这里指出了另一个包含子目录inc2,较之前目录它还,较之前目录它还要在再上两级才能找到。要在再上两级才能找到。gcc的版本可以使用如下的版本可以使用如下gccv命令查看:命令查看:3.3.警告功能警告功能 当当GCCGCC在在编编译译过过程程中中检检查查出出错错误误,则则中中止止编编译译;但但检检测测到到警告时却能继续编译生成可执行程序。警告时却能继续编译生成可执行程序。在在众众多多的的警警告告选选项项之之中中,最最常常用用的的是是-Wall-Wall选选项项。该该选选项项能能发发现程序中一系列的常见错误警告,举例如下:现程序中一系列的常见错误警告,举例如下:$gcc$gcc-Wall-Wall test.c-o t
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关资源
正为您匹配相似的精品文档
相关搜索

当前位置:首页 > 中学教育 > 初中教育


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号