c51设计基础.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c51设计基础

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

文档评论(0)

zhuliyan1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档