欢迎来到天天文库
浏览记录
ID:13969769
大小:118.50 KB
页数:25页
时间:2018-07-25
《c-51语言程序设计基础》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、c51设计基础1.7寄存器组定义8051系列的器件包含4个相同的寄存器组,每个寄存器组包括8个寄存器(R0~R7),C51编译器可使在一函数中决定用哪一寄存器组成为可能。绝对寄存器的访问可用AREGS/NOAREGS和REGISTERBANK来控制。定义一个带扩展性的函数语法如下:返回类型函数名([参数])[模式][再入][中断n]usingn再入和中断将在后两节讨论。例:voidrb_function(void)using3;“using”不允许用于外部函数,它对函数的目标代码影响如下:l函数入口处将当前寄存器保存入栈;l指它的寄存器还会改变;l函数退出前寄存器组被恢复。“u
2、sing”定义对于返回一个寄存器内的值的函数是无用的。编程者必须十分小心以保证任何寄存器切换都只在仔细控制的区域发生。如果不做到这一点将会产生不正确的函数结果。即使当编程者使用同一寄存器组时,带“using”属性的函数原则上也不能返回一个位值。实际产生的代码决定于编译器及不同开关条件,有时用命令产生绝对的寄存器地址,当需要进行这样的地址计算时,使用REGISTERBANK指令的影响只是计算Arn寄存器使用的地址,而必进行实际切换。1.8中断服务程序C51编译器及其对C语言的扩充允许编程者对中断的所有方面进行控制。这种支持能使系统编程者创建高效的中断服务程序,用户只需在普通和高级
3、方式下关心中断及必要的寄存器组切换操作,C51编译器将产生最合适的代码。1.8.1中断服务程序的定义使用中断服务函数的完整语法如下:返回值函数名([参数])[模式][再入]interruptn[usingn]“interrupt”后接一个0~31的常数,不允许使用表达式。中断不允许用于外部函数,它对函数目标代码的影响如下:l当使用函数时,SFR中的ACC、B、DPH、DPL和PSW(当需要时)入栈;l如不使用寄存器组切换,甚至中断函数所需的所有工作寄存器(Rn)都入栈;l函数退出前,所有的寄存器内容出栈;l函数由8051控制命令“RETI”终止。1.8.2开发中断过程时的规则l
4、不能进行参数传递,如果中断过程包括任何参数声明,编译器将产生一个错误信息;l无返回值,如果想定义一个返回值将产生错误,然而,如果返回整型值编译器将不产生错误信息,因为整型值是默认值,因而编译器不能清楚识别。l编译器会识别对中断过程的直接调用并拒绝它们,在任何情况下不能直接调用中断过程,因为退出该过程是由操作码RETI完成的。RETI影响8051芯片的硬件中断系统,由于硬件上没有中断请求存在,因而这个操作码的结果是不定的并且通常是致命的。由于疏忽,可能用指针来间接调用它,这是值得注意的。l编译器从绝对地址8n+3处产生一个中断向量,其中n为中断号,该向量包括一个到中断过程的跳转,
5、向量的产生可由指令NOINTVECTOR压缩。因而用户有能力从独立的汇编模块中提供中断向量。lC51编译器允许0~31个中断,究竟允许哪些中断依赖于使用的8051系列芯片,编译器不能检查。l如果中断程序中有浮点运算,必须保持浮点寄存器状态,当没有其它程序执行浮点运算时,可能不保存,函数“fsave”和“fprestore”用来保存浮点状态。l中断过程调用的函数所使用的寄存器必须与中断过程相同,当没有使用“using”指令时,编译器会选择一个寄存器组作绝对寄存器访问,当子程序使用另一个寄存器组时会发生错误,用户必须保证按要求使用相应寄存器组,C编译器不会对此检查。例:unsign
6、edintinterruptent;unsignedcharsecond;time()interrupt1using2/*定时器0中断服务程序,工作寄存器使用2区*/{if(++interruptcnt==4000){ second++; /*秒计数加一*/ interruptcnt=0; /*清中断计数*/}}1.9再入函数再入函数可被递归调用,调用可发生在任何时候,即使是在中断过程中。在实时处理的应用问题中常常需要再入函数。使用关键字“reentrant”可有选择地定义函数有再入能力。在存贮器模式的基础上为再入函数在内部或外部存贮器中模拟了一个栈区域。由于M
7、CS-51缺乏合适的寻址方法,使用栈结构是相当必要的。因而应尽量少用再入函数。定义一再入函数的语法如下:返回值函数名([参数])[模式]reetrant[interruptn][usingn]例:intcalc(chari,intb)reentrant{ intx; x=table[i]; return(x*b);}使用再入函数有如下规定:l不能传递类型为“bit”的参数。也不能声明一个局部标量,再入功能不能包括位操作及MCS-51可位寻址区域。l不能在“alien”函数调用再入函数。
此文档下载收益归作者所有