已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数的递归调用和再入函数函数类型 函数名 (形参表)reentrant再入函数可被递归调用,无论何时,包括中断服务函数在内的任何函数都可调用再入函数。与非再入函数的参数传递和局部变量的存储分配方式不同,Cx51编译器为再入函数生成一个模拟栈,通过其来完成参数传递和存放局部变量。模拟栈所在的存储器空间根据再入函数存储器模式的不同,可以是DATA、PDATA、XDATA存储器空间。当程序中包含有多种存储器模式的再入函数时,编译器为每种模式单独建立一个模拟栈并独立管理各自的栈指针。对于再入函数有如下规定:(1) 再入函数不能传送bit类型的参数,也不能定义一个局部位变量,再入函数不能包括位操作和8051系列单片机的可位寻址区(2) 与PL/M51兼容的函数不能具有reentrant属性,也不能调用再入函数(3) 编译时存储器模式基础上为再入函数在内部或外部存储器中建立一个模拟堆栈区,称为再入栈。在small模拟下再入栈位于idata区,在compact模式下再入栈位于pdaa区,在large模式下再入栈位于xdata区。再入函数的局部变量及参数都被放入再入栈中,从而使再入函数可进行递归调用。而非再入函数的局部变量被放在再入栈外的暂存区内,如对其进行递归调用,则上次调用时使用的局部变量数据将被覆盖。(4) 在同意 个程序中可定义或使用不同存储器模式的再入函数,任意模式的再入函数不能调用不同模式的再入函数,但可任意调用非再入函数。(5) 在参数的传递上,实际参数可传递给间接调用的再入函数。无再入属性的间接调用函数不能包含调用参数,但可以使用定义的全局变量来进行参数传递。采用函数递归调用可使程序结构紧凑,但要求采用再入函数,以便利用再入栈来保存有关的局部变量数据,因此要占用较大的内存空间。另外,递归调用时对函数的处理速度较慢,因此一般情况下应尽量避免使用函数递归调用,定义函数时应尽量避免使用再入属性。8051常规栈是位于内部数据RAM中,是向上生长型的而模拟再入栈是向下生长型的。中断服务函数与寄存器组定义C语言中一般形式为:函数类型 函数名(形参表) interrupt nusing nInterrupt n中n为中断号,取值范围0-31,编译器从8n+3处产生中断向量一般常用的中断向量表如下:中断号n 中断源 中断向量8n+30 外部中断0 0003H1 定时器0 000BH2 外部中断1 0013H1 定时器1 001BH4 串行口 0023H8051系列单片机片内RAM使用4个不同的工作寄存器组,每个组中有8个寄存器R0-R7扩展关键字using专门用于选择不同的工作寄存器组,n范围0-3。若不选择using,则由编译器自动选择一个寄存器组作为绝对寄存器组访问。注意该关键字后面不允许跟带运算符的表达式。该关键字对函数目标代码的影响如下:在函数入口处将当前工作寄存器组保护到堆栈中;指定的工作寄存器内容不会改变;函数退出前将被保护的工作寄存器组从堆栈中恢复。使用关键字using要保证任何寄存器组的切换都只在仔细控制的区域中发生。带该关键字的函数原则上不能返回bit类型的值。关键字using不允许用于外部函数。关键字interrupt不允许用于外部函数,对中断函数目标代码的影响如下:在进入中断函数时,特殊功能寄存器ACC、B、DPH、DPL、PSW将被保存入栈若不使用关键字using进行工作寄存器组切换,则将中断函数所用到的工作寄存器都入栈保存函数退出前所有寄存器内容出栈恢复中断函数由RETI结束中断函数编写需遵循的原则(1) 中断函数不能进行参数传递,否则编译报错(2) 中断函数没有返回值,建议定义为void类型(3) 任何情况下都不能直接调用中断函数,否则编译错误(4) 若中断函数调用了其他函数,则被调用函数使用的寄存器必须和中断函数相同,由于中断函数不可预测,中断函数对其他函数的调用有可能形成递归调用,需要时,可将被中断函数调用的其他函数定义成再入函数(5) KEIL Cx51编译器从绝对地址8n+3处产生一个中断向量,该向量包含一个到中断函数入口地址的绝对跳转,在对源程序编译时,可用编译控制命令NOINTVECTOR抑制中断向量的产生,从而使用户有能力从独立的汇编程序模块中提供中断向量。函数变量的存储方式C语言中有四种存储种类:自动变量(auto):默认,也可省略申明。当函数调用时存在,退出函数则消失。外部变量(extern)静态变量(static):分局部静态变量和全局静态变量局部静态变量:只能在定义它的函数中进行访问,退出函数后,该值依旧存在,但不能访问。全局静态变量:在函数外部定义,作用防卫从它的定义点开始,直到程序结束。当程序由多个模块文件组成时,该变量始终存在,但只能在被定义的模块文件中被访问,该数值能被该模块文件中所有函数共享,退出该文件后,虽然变量值依旧存在,但不能被其他模块文件所访问。寄存器变量(register):该定义只是给编译器一个建议,对于使用频率最高的那些变量定义为该类型。实际情况是否能将该变量设置为寄存器变量,要由编译器确定。对于一些频繁使用的变量,若不设置为寄存器类型,编译器也会将其作为寄存器变量来处理。KEIL Cx51编译器采用三种存储器模式:SMALL、COMPACT、LARGE。函数的存储器模式确定了函数的参数和局部变量在内存中的地址空间。SMALL模式下,函数的参数和局部变量位于8051的内部RAM中;LARGE和COMPACE模式下,函数的参数和局部变量位于8051的外部RAM中。定义函数时,一般形式为:函数类型 函数名(形参表)存储器模式,若没有明确指定存储器模式,则函数按编译时的默认存储器模式处理。#pragma large /*默认存储器模式为LARGE*/Extern int cal (char i) small;Int large(int I, int j) /*未指定模式,为LARGE模式*/数组定义数据类型 数组名常量表达式Char x5;数组类型 存储器类型 数组名常量表达式 = 常量表达式表;存储器类型:定义数组所在的存储器空间Unsigned char xdata a = 1, 2; 长度可以不指定,编译器自动计算长度指针变量定义一般形式如下:数据类型 存储器类型1 * 存储器类型2 标识符存储器类型1:指针被定义为基于存储器的指针,若无,表示为一般指针两者区别在于:存储字节不同,前者2个字节,后者3个字节,第一个字节存储指针存储器类型的编码,第2和第3字节分别存储该指针的高位和低位地址偏移量。存储器类型1 idata/data/bdata xdata pdata code编码值 0x00 0x01 0xFE 0xFF存储器类型2:用于指定指针本身的存储器空间。一般指针可用于存储任何变量而不必考虑变量的存储器空间的位置。Char *xdata strptr;/*位于xdata空间的一般指针*/Char data *str; /*指向data空间char 型数据的指针*/基于存储器的指针长度比一般指针短,虽可节省存储器空间,运行速度快,但它所指对象具有确定的存储器空间,缺乏灵活性。参数传递时一般采用一般指针,当传递的参数是基于存储器的指针时,若不特别指明,编译器会自动将其转换为一般指针。一般指针与基于存储器的指针及转换一般指针需要3个字节,基于存储器的指针需要1-2个字节(data/idata/pdata存储器类型 1字节;code/xdata存储器类型2字节)一般指针具有较好的兼容性,但速度较慢,基于存储器的指针具有较高的运行速度,可接生存储器空间,但缺乏兼容性。只适用于8051单片机。Char data * xdata str;/*指向 data空间char类型数据的指针,指针本身在xdata空间*/一般指针与基于存储器的指针可相互转换,在某些函数调用中进行参数传递时需要采用一般指针,当传递的参数是基于存储器的指针时,若不特别指出,编译器会自动将其转换为一般指针。绝对定位一种直接操作存储器空间地址的方法: 利用Cx51运行库中的一套预定义宏“ABSACC.H”如:#include Char c_var;Int i_var;XBYTE0X12=c_var;/*往XDATA存储器地址0x12写数据c_var*/I_var= XWORD0x100;/*从xdata存储器地址0x200读出数据给i_var*/存储器类型 数据类型标识符 _at_ 常数Bit类型变量不能用该方法进行绝对地址定位不能对绝对变量进行初始化Xdata char text256 _at_ 0xe000应用段的数据部分包含如下内容:DATA_GROUP 在SMALL模式下所有被连接的目标模块中可覆盖的“自动变量”和“传递参数”的组合。XDATA_GROUP 在LARGE模式下所有被连接的目标模块中可覆盖的“自动变量”和“传递参数”的组合。PDATA_GROUP 在COMPACT模式下所有被连接的目标模块中可覆盖的“自动变量”和“传递参数”的组合。?STACK:再定位堆栈段,该符号定义在启动程序STARTUP.A51中,BL51将在内部IDATA区最后定位该段。REG BANK#:工作积存器组段,#为工作积存器组号,0-3应用段的代码部分包含如下内容:?C_C51STARTUP :启动程序模块STARTUP.A51中的起始代码段名?C_LIB_CODE:用户程序中使用了的运行库模块代码?CO?module:用户模块中的常数代码段?C_START:该标号为启动程序中最后一条转移语句的符号地址,连接定位器将运行库中的初始化模块定位到该地址处,并开始执行Cx51程序的main()函数。如果用户希望转移到一个自己的汇编程序模块,可以将其汇编程序模块入口地址取代该符号?C_INITSEG:当需要对DATA存储器区进行初始化时,运行库将调用该初始化段。应用段中还包括其他一些段美容。绝对地址都显示在BL51所产生的映像文件.M51或.MAP中。将函数的变量定位在特定的地址处的办法:(1) 将变量放在一个具有绝对段的汇编语言程序模块中,将该模块与其他C51程序模块连接在一起(2) 将该变量单独放在一个函数中,使之具有一个独立的数据段,在调用BL51时可将该数据段定位在指定地址处。如:用户模块exm.c中使用下面函数:Test1()Char var1;/一个变量UVision2中将某函数中的变量绝对定位到DATA存储器中某地址处,可采用:PROJECT菜单/Options选项/BL51 Locate标签页/data栏/对应的“Segments”框中敲入?DT?test1?exm(30H)(2)PROJECT菜单/Options选项/BL51 Locate标签页/Xdata栏/对应的“Segments”框中敲入?XD?test1?exm(0e00h)(3)将某函数定位在指定地址处,使用:PROJECT菜单/Options选项/BL51 Locate标签页/Code栏/对应的“Segments”框中敲入?PR?test1?exm(1000h)(4)如果要将整个exm.obj模块定位在CODE的1000H处,采用:PROJECT菜单/Options选项/BL51 Locate标签页/Code栏/对应的“Segments”框中敲入1000H(6) 若要将数据定位在地址0x7000开始代码空间,如:Char code table=1,2,3;需要在PROJECT菜单/Options选项/BL51 Locate标签页/Code栏/对应的“Segments”框中敲入?CO?TABLE(0X7000)(7)在Cx51程序中BDATA类型变量和位变量应定义成全局变量,而不要定义在某一个函数内部,否则将发生编译错误ROM分SMALL、COMPACE、LARGE、D512K、D16M在OPTIONS选择项/TARGET标签页/Code Rom Size框中选择ROM大小用来决定程序代码空间大小,会影响跳转和调用指令的编码(1) ROM(SMALL)调用和转移以ACALL和AJMP指令编码,最大程序空间可达2K字节,整个用户空间长度必须分布在该2K字节空间内(2) ROM(COMPACT)调用以LCALL指令编码,函数内转移以AJMP命令编码,函数长度不可超过2K字节,但整个程序长度可达64K字节。(3) ROM(LARGE)调用和转移以LCALL和LJMP指令编码,可不加限制地使用整个地址空间,即用户程序可达64K字节(4) ROM(D512K)适用于DS80C390及其派生产品,产生19位的ACALL和AJMP指令编码,程序最大可达512KB。(5) ROM(16M)适用于DS80C390及其派生产品,产生24位的ACALL和AJMP指令编码,程序最大可达16MB。编译模式SMALL在OPTIONS选项/TARGET标签页/Memory Model框内选择编译模式该命令控制编译器对源程序进行编译时采用小存储器模式,该模式对不同变量影响如下:所有函数和过程的变量和局部数据段被定义在8051的内部数据存储器中,因此对数据对象的访问最快,缺点是空间有限。COMPACT在OPTIONS选项/TARGET标签页/Memory Model框内选择编译模式该命令控制编译器对源程序进行编译时采用紧凑存储器模式,该模式下酥油函数和过程变量及局部数据段被定义在8051的外部数据存储器中,存储器以256字节为1页,低8位地址由R0/R1决定,高8位地址由8051的P2口输出。LARGE在OPTIONS选项/TARGET标签页/Memory Model框内选择编译模式该命令控制编译器对源程序进行编译时采用大存储器模式。该模式对变量的应县如下:所有变量和局部数据段都定义在8051的外部数据存储器中,可访问64K字节的全部地址空间。由于在访问数据对象时需要采用数据指针DPTR,因此效率不高。对于指定了存储器类型的变量,该编译模式控制命令不起作用。ASM/ENDASM用鼠标点文件弹出右键菜单选择Options For File选项选中Properties标签页选中Generate Assembler SRC file和Assemble SRC f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026二上数学试讲获奖课件
- 2026二上数学赛课课件
- 部编版小学六年级上册语文 20文言文二则 教案
- 八年级生物生命的起源1市公开课获奖课件省名师示范课获奖课件
- 2026四下数学第三单元原创课件
- 垃圾分类宣传教育课件3
- 消防水电配套施工设计方案
- 2027届中卫市重点中学物理九上期末达标检测模拟试题含解析
- 湖北省武汉市武昌区C组联盟2027届物理九年级第一学期期末预测试题含解析
- 新能源汽车电气系统构造与检修 课件 项目2 新能源汽车电力系统构造与检修
- 2026年河南省重点学校高一入学语文分班考试试题及答案
- 辽宁省沈阳市五校2025-2026学年高二下学期7月期末考试物理试卷(含答案)
- 中国公证协会招聘考试真题2025
- 抛丸机安全操作规程(2篇)
- 2023年济南市平阴县教体事业单位招聘教师考试真题
- 成人社区获得性肺炎基层诊疗指南
- (正式版)HGT 20593-2024 钢制化工设备焊接与检验工程技术规范
- 打木垛施工安全技术措施
- 中广核研究院热室设施建设项目 环境影响报告书(建造阶段)
- 正常人体解剖学:绪论
- 微生物学 链球菌属
评论
0/150
提交评论