当前位置: 首页 > 技术资料 > 基于GUN工具的嵌入式软件编译体系的设计与实现

基于GUN工具的嵌入式软件编译体系的设计与实现

QooIC.com 新闻出处:电子市场 | 发布时间:2010/11/12 14:35:29

  常见的软件项目开发都是基于IDE环境。例如TC,V C++,JBUILDER等,所以不必关心工程文件如何组织、功能模块如何增减、编译顺序如何组织、编译工具如何调用等问题。但是嵌人式系统开发,通常没有完善的IDE环境,即使是Tornado这样的IDE环境,也同样使用GUN工具来构建编译体系,并且对于大型软件开发项目,同样需要根据编译器构建自己的编译体系。在Linux内核裁减、驱动开发等应用中,更需要构建适当的编译体系。


  GU N 的 编译程序集合称为GCC(GUNC ompilerC ollection),是最重要的开放源代码软件。GCC是一个编译器套装,它集成了C,C++ ,ObjectiveC,Fortran,Java等语言编译器。由于Unix平台的高度可移植性,GCC提供各种常见的Unix类平台上的版本,还提供了DOS上的GCC版本。而且SUN公司的Solari、操作系统配置的编译器就是GNU的GCC. GCC的不断发展完善使许多商业编译器都相形见细。


  嵌人式系统本身不具备自举开发能力,并且灵活多变。灵活多变通常包括代码的可移植性,代码的可裁减性等特点。而使用GCC工具集合,通过编写makefile ,就可以构建一个编译体系,但是如果把所有的编译规则都集中在一个makefile中,就不能灵活增减代码、文件、模块或增减编译选项等功能,也不能灵活调用各种编译工具,最终产生能够在不同芯片上运行,功能模块满足不同需求的目标文件。这就需要分散编写makefile,用makefile构建一个编译体系,来克服上述缺点。


  1 编译体系的基本需求

 

      (1)使用GCC提供的make工具,利用makefile文件构建一个灵活增减模块、文件的编译体系。


  (2) 能够灵活增加对其它编译、链接工具,以及其它辅助工具的调用。例如针对工程中的C,C++,JAVA等源程序调用不同的编译工具,能够根据目标芯片的不同,调用生成不同机器代码的编译器,能够灵活根据需要调用不同链接方式的库链接工具。


  (3) 具有开放性,能够根据需要增减调用辅助编译工具。用户可以根据需要,自主开发辅助编译工具,然后合人编译体系。


  2 编译体系基本原理

 

      该编译体系主要使用GCC提供的make工具。make工具最本质的想法非常简单:检查源代码和目标文件,以确定哪个源文件需要重新编译以创建新的目标文件。make会假设所有改动过的需要重新编译的源文件都比已经存在的目标文件新。make所作的每件事都依赖于这样的基本操作。目标文件到源文件的关系用于产生依赖关系。与依赖关系相关的命令生成目标文件。为确定依赖关系,make会读取定义依赖关系的脚本,在第二次编译时,make工具会根据依赖关系脚本依次比较源文件与目标文件。这个脚本通常叫做makefileoma ke file 包括命令依赖关系,这些命令会将源文件翻译成为目标文件。make工具就是利用makefile构造一棵内部树all该树的树的根节点是需要编译生成的最终目标文件,树的叶节点就是所有的源代码文件。例如:


  形成的的内部树如图1所示。


  在ma ke file 中还可以指定需要调用的编译辅助工具的绝对路径,当make工具执行到该语句时,就会调用指定的辅助编译工具。


  3 编译体系的设计思路与原则

 

      (1) 必 须 考虑编译体系的灵活性。必须将体系的makefile 分散到每个模块,即每个模块配置一个makefile,其中定义与模块相关的宏、编译顺序、头文件搜索路径等。这样模块在增减时,不会造成宏混乱或编译规则混乱等,以致影响其他模块。


  (2) 必 须 考虑编译体系的开放性。必须考虑能够灵活调用其他编译工具,最常见的情况是同样的代码需要调用生成不同机器代码的编译器,生成不同的机器代码。另外还需要能够加人调用如Tcl脚本工具以及其他自己开发的辅助编译工具的功能。


  (3) 必 须 考虑编译体系的通用性。将makefile分成通用部分及与特定应用相关部分,当该编译体系用于不同项目时,通用部分应该是固定的,只需要修改少量与特定项目相关的makefileo4 编译体系的架构设计设计 的 编 译体系架构如图2所示。

      4 编译体系的架构设计


  (1) 将 M pforProductType.m ak作为make工具搜索路径的人口,它由下层众多makefile 支撑。它定义与该项目关系最密切的宏、编译规则、依赖关系搜索路径等。根据设计的思路和原则以及图2所示,可以得出如下结论:通用的宏、编译规则、依赖关系。搜索路径应该在编译体系的下层定义。该文件定义与项目通用的预处理程序的搜索路径。


  (2) g R ul eMakePrj.m ak文件定义了编译过程的通用执行步骤以及顺序。文件还定义了链接形式,是模块链接还是LIB链接等。还可以在该文件中提供能够回显到用户屏幕上的帮助信息。在文件中,还定义变量Moduls,Sc rfile-C ,Sc rfile-C PP,Sc rfile-JA VA等变量。在文件中维护Mouduls变量,定义模块的增减。


  (3) M od ule-x .m ak文件定义文件级的依赖关系。该makefile文件定义了该模块需要编译的文件,通过它在同一模块内增减文件。同时也定义文件级的编译顺序。同时,与模块相关而不具备通用性的宏应该定义在该文件中,这样可以保证灵活增减模块。文件中还定义预处理程序的该模块特有的搜索路径,这在生成依赖关系和检查依赖关系中非常重要。在每个模块中对Scrfile -C等变量进行维护,通过以下形式实现本模块源文件的增减:


  Sc rfi le -C + = a aa.c b bb.c d dd.c(4) gl o ble ComileRulie.ma k关系定义全局性的编译规则。例如,当工程中包含多种语言开发的源程序时,确定。文件的编译规则,cpp文件的编译规则,汇编文件的编译规则,链接方式等。在该文件中使用:


  fore ac hm od ule ,$( Modules)将 Mo ud uls的值分解出来,依次编译各个模块。使用:


  pat sub st % .c ,%.cd,$( Srcs一c)将 Scr fil e_C 分解出来,依次编译各个文件。


  (5)g loblesymboldef.m ak文件定义全局相关的宏,这样可以保证灵活增减模块,而不会引起编译体系的宏的混乱。文件中还定义通用预处理程序的搜索路径,这在生成依赖关系和检查依赖关系中非常重要。


  5 结论

 

      为没有IDE环境或IDE环境不完善的嵌人式项目量身定制一个合适的编译体系,是实施一个嵌人式项目的基础。GCC工具是常用编译器,make是常用的工具,但是如何构建一个灵活、可靠的编译体系,正是需要研究探索的。本文提供一种构建大型嵌人式项目编译体系的理论和方法,并且在大型嵌人式软件项目中已经得到采用,实践证明这是一种可靠灵活的编译体系。