"); //-->
摘 要: 从分析编译器基本工作原理入手,研究了目前广泛使用的三种嵌入式系统集成开发环境(ADS1.2、RVDS2.2和Tornado2.2)中的编译器效能,通过具体测试数据,分析了编译器效能产生差异的原因,得出了结论。
关键词: 嵌入式系统;集成开发环境;编译器;效能
在嵌入式系统迅猛发展的今天,广泛的应用和需求使嵌入式系统的开发不再局限于只能由相关应用领域的专家来完成。各种优秀的集成开发环境IDE(Integration Develop Environment)的出现,使得嵌入式系统开发变得相对简单,从而对广大工程人员降低了门槛[1]。目前有很多工程人员正在用各种开发平台进行嵌入式系统开发,从ARM公司的SDT到ADS,再到RVDS,以及风河公司的Tornado和其他公司提供的各种专用开发工具,这些IDE一般都是由文件管理器、编译器、汇编器、链接器、调试器等组件和工具组成。在这些程序开发设计环境中,编译程序起着核心作用,链接程序、调试程序、程序管理等工具直接依靠编译程序所产生的结果工作,而且其他工具的构造也常常要用到编译的原理、方法和技术,因此,对IDE开发效率影响最大的是编译器的效能。本文针对目前广泛使用的三种集成开发环境ADS1.2、RVDS2.2和Tornado2.2中C编译器的性能进行了研究,测试其编译效率,分析了编译器效能产生差异的原因。
1 三种主要的IDE及其C编译器介绍
(1)ADS(ARM Developer Suite)是ARM公司推出的ARM系列处理器集成开发工具,使用非常广泛,目前最高版本是1.2,使用的主要是ARM公司的armcc编译器,此编译器通过了Plum Hall C Validation Suite为ANSI C的一致性测试。armcc用于将ANSI C编写的程序编译成32位ARM指令代码[2][3]。
(2)RVDS(RealView Developer Suite)是ARM公司继SDT和ADS1.2后主推的新一代开发环境,旨在取代ADS,目前最高版本为3.1,后又推出了RVDS MDK,但使用最为普遍的还是RVDS2.2。编译器是ARM公司新推出的RVCT编译器,它对循环和指针具有高阶优化的新特性[4]。
(3)Tornado是Wind River Systems(风河公司)的老牌开发工具,目前常用版本为2.2,主要为风河公司的diab编译器和GNU(开放软件联盟)的gcc编译器使用。其中gcc编译器的通用性更好,尤其是在Linux环境下,gcc是最佳选择,所以这里选择更具代表性的gcc进行对比[5]。
以上三种IDE各有特色,其C编译器都能够很好地支持C语言编写的源程序,同时IDE中提供了对ARM运行时库的支持,从而保证了所编写的C程序能够用开发工具进行编译、链接和调试。
2 编译器工作原理
编译器是将一种语言编译成为另一种语言的计算机程序,该程序以源语言编写的程序作为输入,翻译生成等价的目标语言程序[6]。编译器可分成只依赖于源语言的编译器前端和只依赖于目标语言的编译器后端两大部分。前端主要对源代码进行扫描、语法分析和语义分析,生成中间代码;而后端主要是优化器和代码生成器。这一结构对于编译器的结构灵活性和可移植性十分重要。流程编译器前后端结构如图1所示。
编译器内部包括了五个编译阶段,它们执行不同的逻辑操作,这些阶段在实际应用中是组合成一体的,但其有相对独立的步骤。表1为编译器各编译阶段的任务表。
从表1可以看出:第四阶段是决定编译器编译效率的主要阶段,优化能力是衡量一款编译器效能的决定性因素。
典型的编译工作流程如图2所示。
3 测试原理及方法
编译器性能的测试主要通过对C语言源程序(c文件)编译后得到的目标程序(obj文件)的运行时间和代码尺寸进行比较和综合衡量,从而判断编译器的编译效率。从编译原理得出结论,各种IDE的C编译器在优化阶段的优化能力是决定测试结果的主要因素。
对三个具有代表性的C程序进行了具体测试:简单的ADD加法程序、规范的3DES加密算法程序[7]、复杂且不规范的熵(Huffman)编码程序[8]。在测试中,将各种编译器的优化方向设定为时间性能,优化级别均设定为最高级别,处理器型号设为ARM920T。
测试分两步进行:
(1)对用三种IDE的编译器对C语言源程序编译后得到的obj文件大小进行统计。
(2)对各C语言子程序编译的obj文件和头文件进行链接调试,测量运行时间。选用AXD调试器为测时工具,利用AXD下的Debugger Internals选项对编译链接的工程运行占用系统时钟周期进行记录。
需要指出的是,Tornado2.2中的gcc编译器编译得到的obj文件需要在ADS1.2下重新链接,而RVDS2.2自带AXD调试器,所以可以直接测时。
4 实验结果及分析
比较代码编译器所得到的obj文件大小:Tornado2.2的gcc编译器得到的obj文件最小,ADS1.2的armcc编译器得到的obj文件略大于 gcc编译器,RVDS2.2的RVCT编译器得到的obj文件比gcc编译器大10%。
分别对三个程序进行编译后的测试结果如表2所示。
表2中Instructions为指令数,Core_cycles为系统程序运行时占用的内核时钟周期,S_cycles和 A_cycles分别为程序运行时地址连续操作和空地址操作占用的时钟周期数,Total为两者总和[9]。
从测试数据可以看出,ADD加法程序和3DES加密程序三种编译器的编译效率相差不大;ADS1.2的armcc编译器要略好于Tornado2.2的gcc编译器和RVDS2.2的RVCT编译器;而对于熵编码程序,RVDS2.2的RVCT编译器的编译效率明显高于Tornado2.2的gcc编译器和DS1.2的armcc编译器。这是因为ADD加法程序和3DES加密程序是比较简单、规范的C语言程序,文件数、函数调用、指针和循环都较少,无法发挥RVCT的优势;而对于熵编码程序,各种函数调用非常多,指针跳转频繁,RVCT编译器会根据代码的具体情况,针对函数调用、循环、指针等进行高阶优化,自动进行循环解开、融合、位置调整、指针优化等操作,使代码由繁化简更加合理,虽然代码量略有增大,但是大幅提高了代码的执行效率[10]。因此,综合比较的结果是:RVDS2.2的RVCT编译器的编译效率是三者中最好的,ADS1.2的armcc编译器略好于Tornado2.2的gcc编译器。
本文对于目前广泛使用的三种嵌入式系统集成开发环境的编译器效率进行了测试,通过综合对比,得出了结论。还有很多公司,如IAR、Embest的IDE都有不错性能,因此,对编译器的研究有待于更进一步深入。
参考文献
[1] 周立功.ARM嵌入式系统基础教程.北京:航空航天大学出版社,2005.
[2] ARM.ADS1.2 USER′S MANUAL.2004.
[3] 孙秋野,孙凯,冯健.ARM嵌入式系统开发典型模块.北京:人民邮电出版社,2007.
[4] ARM.RVDS2.2 Introductory Tutorial.2006.
[5] WindRiver System.Tornado2.2 UserGuide.2003.
[6] 陈火旺,刘春林,谭庆平,等.程序设计语言编译原理(第三版).北京:国防工业出版社,2000.
[7] Bruce Schneier著,吴世忠译.应用密码学——协议、算法与C源程序.北京:机械工业出版社,2001.
[8] HUFFMAN D A.A method for the construction of minimum redundancy codes[J].Proc.IRE,1952,40(9):1098-1101.
[9] Samsung Electronics.S3C2410A USER′S MANUAL.2004.
[10] ARM中国.RVDS-ARM系统开发的首选工具.单片机与嵌入式系统应用,2007,(2)-(3).
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。