《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > SPARC高性能处理器集成开发环境及其编译器设计与实现
SPARC高性能处理器集成开发环境及其编译器设计与实现
摘要: 本文针对空间SPARC高性能处理器的IDE及其C编译器进行研究,从而完成SPARC处理器的软件开发环境的设计和实现。
Abstract:
Key words :

引言

嵌入式系统迅猛发展的今天,广泛的应用和需求使嵌入式系统的开发不再局限于只能由相关应用领域的专家来完成,各种优秀集成开发环境(IDE,Integration Develop Environment)的出现,大大降低了工程人员的开发门槛[1],使得嵌入式系统的开发变得相对简单。目前,嵌入式系统开发使用的开发平台多种多样,从ARM公司的SDT到ADS,再到RVDS,以及风河公司的Tornado和其他公司提供的各种专用开发工具;这些IDE一般都是由文件管理器、编译器、汇编器、链接器、调试器等组件和工具组成。在这些开发环境中,编译程序起着核心作用,链接程序、调试程序、程序管理等工具直接依靠编译程序所产生的结果工作,而且其它工具的构造也常常要用到编译的原理、方法和技术,因此,IDE与编译器是密不可分的。

本文针对空间SPARC高性能处理器的IDE及其C编译器进行研究,从而完成SPARC处理器的软件开发环境的设计和实现。

1、处理器体系构架

空间SPARC高性能处理器是一款SPARC v8兼容[1] [2] [3]的高性能SoC,它在片上包含整数处理单元,浮点处理单元,独立的指令和数据Cache,硬件乘法器和除法器,外部可编程输入端口的中断控制器,带有跟踪缓冲器的硬件调试单元,两个24位定时器,32个通用I/O接口,一个看门狗,三个串行通信接口,能够支持PROM、SRAM、SDRAM和I/O映射空间访问的外部存储器控制器,具有软件可控的省电工作模式,具有可实现 PCI主机桥(Host bridge)和从属桥(Guest bridge)功能的PCI控制器等,只要加上存储器和与应用相关的外围电路,就可以构成完整的单板计算机系统。其体系框图如下所示:

2、集成开发环境

好的集成开发环境可以提供设计、仿真、验证、分析、并行开发的能力,嵌入式系统集成开发环境更是整合了各方的资源与一身。由于系统设计的各个环节彼此之间都是有相互联系的,设计的结果好坏和正确要在仿真和验证中取得,仿真验证的数据又可以反过来指导设计,所以说单纯的隔离设计中的各个部分的设计是不合理的,集成环境可以为设计者提供这样一个平台,使得设计者和验证者共享数据,彼此之间协同工作使得设计更加的合理。

2.1 总体设计

嵌入式集成开发环境针对SPARC高性能处理器的软件系统设计要求和设计能力进行改进,希望能够提供给用户和系统开发工程师一个比较完备的、易用的开发工具,其主要功能应包括以下几个方面:

应用程序开发,包括编辑、编译 应用程序调试 软件工程管理 软件仿真环境 操作系统配置管理 集成环境配置管理

集成开发环境的总体设计框图如下所示:

2.2 集成开发环境实现

作为高性能控制SPARC高性能处理器的专用集成开发环境,设计实现了软件开发环境SPE-C,使用C语言做为其编程语言,运用SPARC V8平台适用的BMSPARC编译套件,能在本地Win32的环境下运行。

它具备集成开发环境所有必要的功能,包括集成的源代码编辑,工程管理,编译调试,环境设置等功能,方便用户基于SPARC v8兼容处理器的应用开发和程序调试。

它还具有一般开发环境所普遍具有的易用性和方便性。调试部分功能包括断点、逐语句/过程运行、查看和修改寄存器堆/存储器/片上寄存器、指令跟踪等,实现了调用栈和变量的查看等。

SPE-C软件开发环境实现的主要特点包括:

编程语言为C语言 支持BMSPARC编译器 集成调试功能 新建工程提供系统初始化模版框架 提供可供修改的全定制链接脚本 创建生成文件脚本 工程管理,分类函数预览 支持中英文两种语言 文件函数预览 代码编辑,语法高亮 变量属性提示 函数浏览及快速检索,快速定位(文内及工程)及文字替换 支持打印及系统统计 文件内书签功能

SPE-C软件开发环境为用户提供了高效、便捷的开发和调试环境,现在该软件已经设计完成并通过第三方评测,可以随时提供给用户使用。

3、BMSPARC编译器

3.1 编译器工作原理

BMSPARC是基于GNU工具链并进行优化设计的一款编译器套件。GNU工具链一般由下面一些工具组成:编译器GCC(GCC本身作为编译器集合包含了对多种语言的支持,这里仅讨论C编译器);Binutils软件包中作为汇编器的GAS,作为链接器和定址器的LD以及对二进制目标文件进行变化处理的其他工具;作为标准C库的Newlib或Glibc;作为调试器的GDB。[4] [5]

其中编译器是将一种语言编译成为另一种语言的计算机程序,该程序以源语言编写的程序作为输入,翻译生成等价的目标语言程序。编译器可分成只依赖于源语言的编译器前端和只依赖于目标语言的编译器后端两大部分。前端主要对源代码进行扫描、语法分析和语义分析,生成中间代码;而后端主要是优化器和代码生成器。

3.2 BMSPARC编译器生成

在进行基于SPARC高性能处理器的嵌入式软件系统开发之前,要先建立交叉编译环境。目标机的交叉编译环境是一个由编译器、链接器和解释器组成的综合开发环境,主要由 binutils、gcc 和 glibc 几个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。建立一个交叉编译工具链是一个复杂的过程,交叉编译器的最终成功运行,取决于很多因素,包括:主机系统配置、GNU工具版本配合、参数配置、库选择等,一个成功的、稳定的交叉编译环境是需要花费大量额时间的,幸运的是现在针对很多处理器都有比较成熟何稳定的编译配置,这里简单列出本系统的交叉编译环境的主要配置:

宿主机 i386-cygwin,目标机 sparc; 编译环境版本

1. binutils-2.13.2.1

2. gcc-3.4.4

3. gdb-6.3

4. newlib-1.13.0

在交叉编译器编译的基本配置如下所示:

../gcc-3.4.4/configure --target=sparc-elf --prefix= /opt/sparc-elf-3.4.4

--with-gnu-as --with-gnu-ld

--verbose --enable-languages=c,c++ --disable-shared --disable-nls

--with-newlib --with-cpu=leon 2>&1 | tee compile-gcc-configure.out

交叉编译环境建立过程如下:

1. 下载源文件、补丁和建立编译的目录

2. 建立内核头文件

3. 建立二进制工具(binutils)

4. 建立初始编译器(bootstrap gcc)

5. 建立c库(glibc)

6. 建立全套编译器(full gcc)

7. 下载源文件、补丁和建立编译的目录

生成的工具链是基于ELF格式的,全部在/opt/sparc-elf-3.4.4(这是cygwin的目录)路径下,完全作为集成开发环境的配套工具链。

3.3 CORDIC指令支持

BMSPARC还提供对硬件CORDIC的支持。CORDIC算法使用矢量的旋转和定向运算进行三角函数、对数、开方及反三角函数等复杂运算。该算法的基本思想是通过一系列固定的与运算基数相关的角度的不断偏摆以逼近所需的旋转角度,由于其基本运算单元只有移位与加减法,为该算法的VLSI实现打下了良好的基础。

下表列出了BMSPARC支持的cordic协处理器指令及其对应的指令操作码,是对SPARC v8标准指令集中浮点协处指令操作码的扩充。

BMSPARC编译器提供对cordic指令的支持,主要通过库函数修改的方式完成。首先在binutils中修改汇编器gas,主要针对汇编器的前端和BFD库的移植,涉及到的文件包括:tc-sparc.c、tc-sparc.h、sparc.h、sparc-opc.c、sparc-dis.c和elf32- sparc.h等。通过定义相应cordic指令的宏来完成汇编级的指令生成,之后要完成newlib中超越函数相关的数学函数库,利用汇编指令实现函数的功能,并在汇编中使用cordic指令完成的超越函数功能。最后定义顶层数据类型,针对不同的数据类型,如针对单精度和双精度的浮点,实现其三角函数的数学库是不同的,要分别针对其不同的类型进行实现。

显然,通过使用库替换的方法,可以简化移植过程,实现软件兼容及编译器的快速开发和使用,并可以快速的完成针对超越函数的编译器优化。

4、SPE-C与BMSPARC编译器的集成

SPE-C中编译系统的基本规则为:针对工程中的源文件及链接文件,包括用户指定的库文件,按照指定的规则,并参考用户设置,生成一个符合要求的Makefile文件,然后用make.exe对Makefile文件进行解释执行,从而生成需要的目标文件,或完成相应的动作。[6] [7] [8]

如果在整个过程中有错误发生,则编译/链接终止,IDE系统将套件提供的错误原因反馈给用户。

为了将BMSPARC编译工具链集成到SPE-C中,必须使BMSPARC工具链的输出信息包括警告和错误信息最终输出(Output)在SPE-C的显示窗口中。由于BMSPARC工具链的各个执行文件都是基于控制台的执行程序(基于命令窗口的命令行程序),而SPE-C是图形用户界面(GUI)程序,因此要将它们执行的各种输出信息收集并放到SPE-C的输出窗口中显示,需要一些实现技巧。本系统中实现在SPE-C的输出窗口中显示编译信息的方法如下:

1)当集成开发环境通过界面交互得到用户编译某一工程或源码文件的指令后,首先发起一个后台线程;

2)后台线程创建一个匿名管道,发起一个命令子进程以执行编译整个工程或某个源码文件的make命令,直接将该命令子进程的标准输出和错误输出均重定向到由父进程创建的匿名管道的“写”端,SPE-C的后台线程通过该匿名管道的“读”端得到所需要的编译信息;

3)后台线程再将所有通过管道获取的编译信息实时传送回IDE界面中的信息输出(Output)窗口进行显示。

下图是采用如上技术,实现SPE-C与编译器之间的信息交互的结果示例:

显然,这种方法实现起来并不复杂,命令子进程的Stdout和Stderr都被重定向到匿名管道的写端,仅用一个匿名管道就实现了全部功能。上面程序流程图中从匿名管道读端读取的输出信息,即是由编译命令子进程的Stdout和Stderr重定向输出的内容,将其直接放入Output窗口中显示便实现了编译信息实时显示的功能。

结束语

本文讨论了针对SPARC高性能处理器的嵌入式系统专用软件集成开发环境及其编译器,介绍了集成开发环境(SPE-C)的设计及其集成的相关功能,介绍了BMSPARC编译环境及其添加CORDIC指令支持的方法,以及如何实现编译环境与集成开发环境的集成。通过上面的工作,SPE-C集成开发环境已经实现了与SPARC高性能处理器的无缝配合工作;下一步要完善软件仿真环境及对操作系统的支持,为用户进行软件仿真和针对操作系统编译开发提供有效的支持环境。

参考文献

[1] “The SPARC Architecture Manual Version 8”, SPARC International,Prentice Hall, 1992

[2] Prakash Rashinkar,Peter Paterson.孙海平译. 系统芯片(SOC)验证方法与技术. 电子工业出版社,2005

[3] 张镇,魏同立, 基于IP模块的片上系统设计 电子器件,2002

[4] 姚文刚,[硕士论文]基于GCC的交叉编译器结构分析与后端移植研究,2006

[5] 王晓栋,郑扣根,基于嵌入式系统的交叉汇编器的研究与实现,工业控制计算机,2004

[6] 朱兴泉,IDE集成GCC编译器的方法,指挥控制与仿真,2007

[7] 王荣胜,林嘉宇,张镔,嵌入式系统集成开发环境中的编译器效能研究,电子技术应用 2008

[8] 邹耀,刘佩林,基于用户描述的可配置汇编器,计算机工程,2009

此内容为AET网站原创,未经授权禁止转载。