目的:学习开发工具的使用,C优化器的使用 Chap一介绍过,C是编程效率最高的语言。要想让编译后的C代码具有较高的效率,关键在编译效率。对C6000而言,C是用得最多的编程方法。经过循环优化后,其效率可达70-80%。有些算法的C程序效率甚至与手工汇编相当。(线性汇编95-100%) 由于C用得多,而且多数人有C的编程经验,因此编程就从C开始介绍。所以即使完全没有DSPs编程经验的技术人员也可以立即开始编程工作。 BIT/TI 第三讲 C语言初步
建议的程序开发流程 C程序 C程序优化 第十讲 用线性汇编改 写关键代码段 第九讲 BIT/TI 第三讲 C语言初步 从上面TI所建议的程序开发流程也可以看出,用户程序用C程序实现,这样可以实现开发效率与程序效率的较好统一。如果要采用汇编语言实现关键的代码段,也最好是在C的框架下。因此,本章首先介绍C程序的开发过程,以及相关开发工具的使用。 第九讲 BIT/TI 第三讲 C语言初步
学习内容 一、代码产生工具 二、C优化器 三、C的数据类型 四、实验 BIT/TI 第三讲 C语言初步 三、C语言符合ANSI C的标准,但是要注意C6x对数据的定义。 四、掌握代码的编译、基本调试方法和性能测试方法 BIT/TI 第三讲 C语言初步
C程序、标准汇编、线性汇编的编译 sa asm c BIT/TI 第三讲 C语言初步 *.asm C程序经过C编译器生成C6000汇编程序,所输出的汇编文件作为汇编器的输入。 BIT/TI 第三讲 C语言初步
一、C的代码产生工具 新 BIT/TI 第三讲 C语言初步 初次接触C6x系列DSPs,完全可以不必考虑硬件结构等,只要有PC上的编程经验,就可以直接用标准ANSI C语言编写所需要的算法程序。不同的是,这里要用C6x的C编译器对程序进行编译。最后生成的可执行文件为.out。 代码产生工具包括C编译器(cl6x.exe)、汇编器(asm6x.exe)和连接器(lnk6x.exe)和运行支持库(rts6201.lib,rts6701.lib,rts6201e.lib,rts6701e.lib)。 编译、汇编和连接是三个相互独立的过程,有三个不同的程序完成。为了方便,可以用壳程序cl6x.exe把这三个过程用一个命令完成。 除了标准C函数外,还包括编译器用于管理C环境的C函数。如_c_int00就是一个重要的库函数 ANSI C 标准函数库 C I/O library: printf, scanf, fopen, getchar等,给程序调试带来方便。 Intrinsic函数 系统启动程序 _c_int00:用于初始化C环境,包括数据初始化。 BIT/TI 第三讲 C语言初步
编译命令 编译器选项 CL6x -g file1.c file2.asm file.sa file3 -s -as -z … ... 标准汇编直 接调用汇编器 -z调用连接器 线性汇编调用汇编优化器 无扩展名默认为C文件 代码产生工具的使用: 在命令行使用 代码设计工作室 我们看到,在命令行除了输入、输出文件外,还有一些选项用来控制整个编译过程,包括编译、汇编、连接。其中某些选项会影响到编译后的程序效率。在稍后我们将陆续介绍一些。 壳命令默认地执行编译和汇编两个过程,使用选项-z可以调用连接器。 除了连接器选项-z必须在命令行的最后,以及与连接有关的选项必须在-z之后外,命令行的其它编译和汇编选项可以任意组合。 .sa:线性汇编程序文件。是C6000特殊的一个地方,使用线性汇编可以在保证代码效率的前提下大大提高编程效率。与标准汇编相比,线性汇编把一些比较烦琐的,对代码编译效率影响不大的工作用编译工具自动完成,减轻编程者的工作量,可以大大提高编程效率,具体使用方法在第九讲介绍。下面是线性汇编程序的编译过程。 BIT/TI 第三讲 C语言初步
连接器选项 CL6x -g -s file.c -z link.cmd -o file.out -l rts6201.lib -z调用连接器 连接器命令文件 运行支持库 输出文件名 编译器生成的.obj文件都是浮动地址的COFF格式文件,需要经过连接生成一个绝对地址的可执行文件。因此需要用连接器命令文件说明一些与连接有关的目标系统信息。并且如果程序中调用了库函数,还需要连接运行支持库。 BIT/TI 第三讲 C语言初步
常用的编译选项 BIT/TI 第三讲 C语言初步 前两个选项-g,-s使得调试更容易;选项–g通过在目标文件内加入与调试有关的一些信息,使能符号调试。选项-s把用户的C代码作为注释与编译器产生的汇编代码放在C编译器输出的汇编文件内(.asm)。但是-g和-s对C优化器的优化性能会有一些影响。 -o3和-pm是与C优化器有关的选项,后面介绍;连接器选项在第五章介绍。 上面所介绍的编译过程将在实验中练习。 BIT/TI 第三讲 C语言初步
二、C优化器 优化器选项 有软件流水功能 经过C优化器的优化,以及其它C语言优化后, C代码效率可达70-80% 用优化选项启动 C6x的C编译器能够达到很高的编译效率,关键在于它的C优化器。C6x优化C编译器是针对C6x特有的VLIW结构设计(VLIW结构能否发挥性能,一个关键就在C编译器),编译效率很高。辅以C程序的其它优化方法,程序效率能与手写媲美。本讲介绍用C优化器对C程序进行优化,第十章还将专门介绍C的其它优化方法。 从-o2开始,优化器所具有的软件流水功能,是针对循环代码的一种优化技术。它是C编译器能够产生令人难以置信的高效率的主要原因。第8讲将产生软件流水的方法。 软件流水概念:与指令流水的概念相似。同一个指令的执行分为几个阶段,即若干级流水。不同指令的不同流水在流水线上并行执行。在一个循环体中有若干条指令,这些指令之间一般具有很强的相关性,很难充分利用C6000的8个功能单元并行执行指令。采用软件流水技术,使得不同次循环的指令并行执行。 通常C优化器是对每个输入文件分别进行优化的。而如果优化能对整个程序进行,则效率通常会更高。选项-pm使得语法分析器在启动优化器和代码产生器之前,把所有的C文件组合成一个文件。 上面介绍了C优化器的功能,下面介绍使用方法。 有软件流水功能 BIT/TI 第三讲 C语言初步
C优化器的使用步骤-建议 cl6x -g -s file.c -z cl6x -g -o file.c -z 不带优化选项进行编译(功能验证) cl6x -g -s file.c -z 用优化选项-o2进行编译(-o2是与符号调试兼容的最高优化级别) cl6x -g -o file.c -z 用最高级别优化选项进行编译 cl6x -o3 -pm file.c -z 程序进行优化前,必须首先保证程序的功能正确,即必须在调试器环境下调试正确后,再使用C优化器。上面是建议的C优化器优化步骤: 编程的第一步是要保证代码的功能正确,因此先不要使用优化选项。然后将选项-g和-o结合使用,产生与符号调试不冲突的前提下最大程度优化的代码。最后再进行最高级别的优化(由于符号调试无法进行,通常需要在代码内加入测试代码以验证优化后的代码功能)。 注意 以上每个步骤都需要进行功能验证 BIT/TI 第三讲 C语言初步
三、C62xx C 数据类型 注意 BIT/TI 第三讲 C语言初步 用C语言编程时,对各种数据类型的定义要清楚: short 16位,int 32位,后面要介绍的字长优化就利用这一特性。 long长度(40),这是因为C62xx的支持40位的源或目操作数(两个32位寄存器)。注意汇编器产生的long数据是32位的。乘积累加运算时用long存储累加和,防止溢出(利用多出的8位作警戒位)。 加性溢出的处理措施: 1、采用饱和算术指令,并用寄存器CSR检测饱和 2、利用long数据多出的8位作guard位 3、增益小于1的系统,中间结果溢出不影响最后结果。 Pointer-C62xx CPU 支持32-bit字节寻址,因此pointer 类型可以访问C62xx的整个4G-byte地址空间。 BIT/TI 第三讲 C语言初步
实验 实验内容:两个数组点积运算 实验目的: 掌握编译过程、C优化器的使用 熟悉Simulator开发环境 学习程序性能测试方法 本章内容介绍了C程序的开发流程,并对C程序的优化有了初步认识。在第十章还将对C程序的优化设计作更深入的探讨。 BIT/TI 第三讲 C语言初步
代码开发流程 BIT/TI