如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
作者:来源于:发布时间:2007-3-2813:52:00C51优化的C语言交叉编译器KeilC51交叉编译器是一个基于ANSIC标准的针对8051系列MCU的C编译器,生成的可执行代码快速、紧凑,在运行效率和速度上可以和汇编程序得到的代码相媲美。n和汇编语言相比,用C语言这样的高级语言有很多优势,比如:n对处理器的指令集不必了解,8051CPU的基本结构可以了解,但不是必须的。n寄存器的分配以及各种变量和数据的寻址都由编译器完成。n程序拥有了正式的结构(由C语言带来的),并且能被分成多个单独的子函数。这使整个应用系统的结构变得清晰,同时让源代码变得可重复使用。n选择特定的操作符来操作变量的能力提高了源代码的可读性。n可以运用和人的思维很接近的词汇和算法表达式。n编写程序和调试程序的时间得到很大程度的缩短。nC运行连接库包含一些标准的子程序,如:格式化输出,数字转换,浮点运算。n由于程序的模块结构技术,使得现有的程序段可以很容易的包含到新的程序中去。nANSI标准的C语言是一种丰常方便的,获得广泛应用的,在绝大部分系统中都能够很容易得到的语言。因此,如果需要,现有的程序可以很快地移植到其他的处理器上,节省投资。和汇编语言的接口你可以很容易在C程序中调用汇编程序,反之依然。函数参数通过CPU寄存器传递,或使用NOREGPARMS参数指示编译器通过固定的存储器传递。从函数返回的值总是通过CPU寄存器传递。除了直接产生目标代码外,你还可以用SRC编译参数指示编译器产生汇编源代码文件(供A51汇编器使用)。例如下面的C语言源代码:unsignedintasmfunc1(unsignedintarg){return(1+arg);}用SRC指示C51编译器编译时产生以下汇编文件:?PR?_asmfunc1?ASM1SEGMENTCODEPUBLICasmfunc1RSEG?PR?_asmfunc1?ASM1USING0asmfunc1:;----Variable'arg?00'assignedtoRegister'R6/R7'----MOVA,R7;loadLSBoftheintADDA,#01H;add1MOVR7,A;putitbackintoR7CLRAADDCA,R6;addcarry&R6MOVR6,A?C0001:RET;returnresultinR6/R7你可以用#pragmaasm和#pragmaendasm预处理指示器来在你的C语言程序中插入汇编指令。和PL/M-51的接口Intel的PL/M-51是一种流行的编程语言,在很多方面和C语言类似。你很容易就可以将C程序和PL/M-51程序联接起来。在你用alien声明PL/M-51函数后,你就可以从C语言中调用它们。所有在PL/M-51模块中定义的全局变量都可以在C语言程序中使用。例如:externaliencharplm_func(int,char);PL/M-51编译器和KeilSoftware工具都产生OMF51格式的目标文件。连接程序使用OMF51文件来处理外部字符变量,而不管它们在什么地方声明和使用。代码优化C51是一个杰出的优化编译器,它通过很多步骤以确保产生的代码是最有效率的(最小和/或最快)。编译器通过分析初步的代码产生最终的最有效率的代码序列,以此来保证你的C语言程序占用最少空间的同时运行的快而有效。C51编译器提供9个优化级别。每个高一级的优化级别都包括比它低的所有优化级别的优化内容。以下列出的是目前C51编译器提供的所有优化级别的内容:n常量折叠:在表达式及寻址过程中出现的常量被综合为一个单个的常量。n跳转优化:采用反转跳转或直接指向最终目的的跳转,从而提升了程序的效率。n哑码消除:永远不可能执行到的代码将自动从程序中剔除。n寄存器变量:只要可能,局部变量和函数参数被放在CPU寄存器中,不需要为这些变量再分配存储器空间。n通过寄存器传递参数:最多三个参数通过寄存器传递。n消除全局公用的子表达式:只要可能,程序中多次出现的相同的子表达式或地址计算表达式将只计算一次。n合并相同代码:利用跳转指令,相同的代码块被合并。n重复使用入口代码:需要多次使用的共同代码被移到子程序的前面以缩减代码长度。n公共块子程序:需要重复使用的多条指令被提取组成子程序。指令被重新安排以最大化一个共用子程序的长度。对8051的特殊优化n窥孔优化:当能够缩小代码空间或执行时间时,复杂的操作被简单的操作代替。n访问优化:常量和变量被计算后直接包含在操作中。n扩展访问优化:用DPTR做存储器指针来增加代码的密度。n数据覆盖:一个函数的数据和位变量空间是可覆盖的