VC与Delphi中变量类型对应关系_第1页
VC与Delphi中变量类型对应关系_第2页
VC与Delphi中变量类型对应关系_第3页
VC与Delphi中变量类型对应关系_第4页
VC与Delphi中变量类型对应关系_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、“interrupt”后接一个031的常数,不允许使用表达式。中断不允许用于外部函数,它对函数目标代码的影响如下:l 当使用函数时,SFR中的ACC、B、DPH、DPL和PSW(当需要时)入栈;l 如不使用寄存器组切换,甚至中断函数所需的所有工作寄存器(Rn)都入栈;l 函数退出前,所有的寄存器内容出栈;l 函数由8051控制命令“RETI”终止。开发中断过程时的规则l 不能进行参数传递,如果中断过程包括任何参数声明,编译器将产生一个错误信息;l 无返回值,如果想定义一个返回值将产生错误,然而,如果返回整型值编译器将不产生错误信息,因为整型值是默认值,因而编译器不能清楚识别。l 编译器会识别对

2、中断过程的直接调用并拒绝它们,在任何情况下不能直接调用中断过程,因为退出该过程是由操作码RETI完成的。RETI影响8051芯片的硬件中断系统,由于硬件上没有中断请求存在,因而这个操作码的结果是不定的并且通常是致命的。由于疏忽,可能用指针来间接调用它,这是值得注意的。l 编译器从绝对地址8n+3处产生一个中断向量,其中n为中断号,该向量包括一个到中断过程的跳转,向量的产生可由指令NOINTVECTOR压缩。因而用户有能力从独立的汇编模块中提供中断向量。l C51编译器允许031个中断,究竟允许哪些中断依赖于使用的8051系列芯片,编译器不能检查。l 如果中断程序中有浮点运算,必须保持浮点寄存器

3、状态,当没有其它程序执行浮点运算时,可能不保存,函数“fsave”和“fprestore”用来保存浮点状态。l 中断过程调用的函数所使用的寄存器必须与中断过程相同,当没有使用“using”指令时,编译器会选择一个寄存器组作绝对寄存器访问,当子程序使用另一个寄存器组时会发生错误,用户必须保证按要求使用相应寄存器组,C编译器不会对此检查。例:unsigned int interruptent;unsigned char second;time( interrupt 1 using 2 /*定时器0中断服务程序,工作寄存器使用2区*/if(+interruptcnt=4000 second+; /*

4、秒计数加一*/interruptcnt=0; /*清中断计数*/ 19 再入函数再入函数可被递归调用,调用可发生在任何时候,即使是在中断过程中。在实时处理的应用问题中常常需要再入函数。使用关键字“reentrant”可有选择地定义函数有再入能力。在存贮器模式的基础上为再入函数在内部或外部存贮器中模拟了一个栈区域。由于MCS-51缺乏合适的寻址方法,使用栈结构是相当必要的。因而应尽量少用再入函数。定义一再入函数的语法如下:返回值 函数名(参数)模式reetrantinterrupt nusing n 例:int calc(char i,int b reentrant int x;x=tablei

5、;return(x*b;使用再入函数有如下规定:l 不能传递类型为“bit”的参数。也不能声明一个局部标量,再入功能不能包括位操作及MCS-51可位寻址区域。l 不能在“alien”函数调用再入函数。l 再入函数可同时有其它属性,如“using”函数模式和“interrupt”。l 再入函数不能同时有“alien”属性,从而遵守PL/M规则。l 返回地址及可能的PUSH/POP操作存入MCS-51的栈中或被执行(不在再入栈中)。l 在同一模块中,任意模块的再入函数(small reentrant,lage reentrant,compact reentrant)不能与具有不同模式的再入函数混合

6、。再入函数举例:/*这个再入函数可以从“main”及中断程序中调用*/int calc(char i,int breentrant int x;x=tablei;return(x*b;1.10 参数传递通过CPU的寄存器可传递至多三个参数。这样产生与汇编子程序相当的有效参数机制。如果寄存器被占用,或说明了“#pragma NOREGPARMS”,参数变量将使用固定的存贮器位置,存贮器模式决定了8051存贮器为参数提供的位置。表:候选的参数寄存器参数类型char,1字节指针int,2字节指针long,float一般指针一个参数R7R6,R7R4R7R1,R2,R3二个参数R5R4,R5R4R7R

7、1,R2,R3三个参数R3R2,R3R1,R2,R3函数的返回值放在CPU固定的寄存器中,列表如下。这样,与汇编子程序的接口变得非常容易。表:函数返回值的寄存器用法返 回 值寄 存 器意 义bit进位标志 C(unsigned charR7(unsigned intR6,R7高位在R6,低位在R7(unsigned longR4R7高位在R4,低位在R7floatR4R732位IEEE格式指 针R1,R2,R3类型选择在R3,高位在R2,低位在R1111 PL/M51接口Franklin C51利用关键字“alien”提供了一个与Intel PL/M-51直接和简单和接口,关键字“alien”

8、在所有存贮器模式下可用于“extern”和“public”函数。现有的PL/M-51程序利用C语言的强大功能可与Franklin C-51连接起来。使用关键字“alien”,C51可用PL/M-51规定的参数传递方式工作。“alien”可用于外部或公共函数,并可用于任一模式,这样,已有的PL/M-51程序可加入到C-51中。Alien函数始终包含一个标准的参数数量,因此,C中定义的三点()记号不被接受,且会产生一个错误信息。例:extern alien char plm_function(unsigned char,unsigned int;extern char c_function(uns

9、igned char x,unsigned char y return(x*y;PL/M-51兼容函数必须定义以关键字“alien”。这样,PL/M函数的参数传递及参数返回规定在C编译器中才被考虑。1.12 汇编接口参数是通过固定的CPU寄存器传给汇编程序的,当使用“#pragma NOREGPARMS”时,则通过固定的存贮器位置传递参数。这样就给汇编与Franklin C-51之间提供了一个非常简洁的接口。返回值在CPU寄存器中。下例为在汇编中用来编码的“toupper”函数,参数传递发生在寄存器中。UPPER SEGMENT CODE ;程序代码段PUBLIC _toupper ;入口地址

10、RESG UPPER ;选择程序代码段toupper: MOV A,R7 ;char 参数在寄存器R7中CJNE A,#a,UPP1UPP1: JC UPPERTCJNE A,#z+1,UPP2UPP2: JNE UPPRETCLR ACC.5UPPRET: MOV R7,A ;char 返回值在寄存器R7中RET ;返回C1.13 内部函数Franklin C-51支持下列内部函数。内部函数既是再入的又是有效的。表:C51的内部函数VC1.14 代码优化函 数描 述memcpy,memsset,memchr,memmove,memcmpANSI的内存操作功能strcmp,strcpyANSI

11、字符串处理功能_crol_,_irol_,lrol_左移字符、整数、长整数_crolr_,_irolr_,lrolr_右移字符、整数、长整数_nop_空操作_testbit_测试并清位(JBC指令)基于8051的优化:l 窥孔(PEEPHOLE)优化:只要能节省存贮空间或执行时间,复杂的运算都将化简。l 访问优化:常数和变量直接包含在操作中。l 数据覆盖:函数的数据和位移被标记为OVERLAYABLE,被L51用其它数据和位覆盖。l CASE/SWITCH优化:SWITCH/CASE语句优化为一个跳转或一串跳转。SMALLCOMPACT模式,无浮点运算C51FPC.LIBC51编译器包含的库模

12、块,都有源代码,对它们可作与硬件相关的修改。用户改变对于现有硬件输入和输出结构的两个模块,就可修改所有库函数,同样也可以重新很快地构造如CHAR6个优化级,另外,用OPTIMIZE(SIZE),NOREGPARMS和NOAREGSC51的所有优化如下:Integer(1) 一般优化:l 常数折迭:发生在一个表达式或地址计算中的几个常数值组合为一个常数。l 跳转优化:跳转转到最终的目标地址,以提高程序效率。WordUINTl Wordl 全局公共子式消除:相同的子表达式或地址计算(多次发生在同一函数中)将被识别出来,并且只要有可能,将只计算一次。(2) SHORT INT) 代码生成选项:l O

13、PTMIZE(SIZE):共同的“C”操作被子程序代替:程序码长被压缩。l NOAREGS:不使用绝对寄存器访问,程序代码在这种方式下独立于寄存器组。l NOREGPARMS:参数传递总是在本数据段完成,程序代码与早期C-51版本兼容。1.15 LongIntC-51编译器包含6个不同的编译库,可根据不同函数的需要进行优化,这些库几乎支持所有的ANSI函数调用。因此,用此标准的C程序可在编译和连接后立即运行。UNSIGNED LONG INT库LongIntCharC51S.LIBByteCHAR*C51FPS.LIB浮点数学运算库(SMALL模式)C51C.LIBPCharPWideChar

14、浮点运算库(COMPACT模式)PointerC51L.LIBBOOLBoolC51FPL.LIB浮点运算库(LARGE模式)DoubleExtended“puts”函数用LCD显示。THandleFARPROCTFarProcATOMTAtomTPOINTTPointTRECTTRectCOLORREFTColorRefOFSTRUCTTOFStructDEBUGHOOKINFOTDebugHookInfoBITMAPTBitMapRGBTRIPLETRGBTripleRGBQUADTRGBQuadBITMAPCOREHEADERTBitmapCoreHeaderBITMAPINFOHEADERTBitmapInfoHeaderBITMAPINFOTBitmapInfoBITMAPCOREINFOTBitmapCoreInfoBITMAPFILEHEADERTBitmapFileHeaderHANDLETABLETHandleTableMETARECORDTMetaRecordMETAHEADERTMetaHeaderMETAFILEPICTTMetaFilePictTEXTMETRICTTextMetricNEWTEXTMETRICTNewTextMetricLOGBRUSHTLogBrushLOGPENTL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论