单片机(八、51-C语言编程).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
可重入函数 可重入函数可以在同一个时刻由多个进程共享。当一个进程正在执行一个可重入函数,另一个进程可以中断该进程,并可以开始执行同一个可重入函数,而不影响函数的运行结果。 ANSI C 语言中,调用函数时会把函数的参数和函数中使用的局部变量入栈。 因为8051 内部堆栈空间的限制,为了提高效率,C51 没有提供这种堆栈,而是提供一种压缩栈。每个函数有一个给定存储空间,用于存放局部变量。函数中的每个变量都存放在这个空间的固定位置。当递归调用该过程时会导致变量被覆盖,所以通常情况下CX51中的函数是不能重入的。 为此必须使用reentrant函数属性来声明函数是可重入的。格式如下: 函数类型 函数名(形式参数列表) reentrant 与不可重入函数的参数传递和局部变量的存储分配方法不同,C51编译器为再入函数生成一个模拟栈,通过这个模拟栈来完成参数传递和存放局部变量。这样每次函数调用时的局部变量都会被单独保存,再入函数一般占用较大的内存空间,运行起来也比较慢,并且不允许传递bit 类型的变量,也不能定义局部位变量。 可重入函数经常在实时应用系统中应用,也可在中断函数和非中断函数同时调用同一个函数时使用。 规定函数使用的寄存器组 8051单片机的内部存储器的低32个字节被划分成4个寄存器组,每个寄存器组8个寄存器。寄存器组可以通过PSW中的两个位进行选择,任何时刻仅有一个寄存器组处于工作状态,该寄存器组称为当前寄存器组。 寄存器组切换在处理中断和使用实时操作系统时很有用。通常在调用函数时,须要将当前寄存器组的值保存在堆栈中,并在退出函数时将保存在堆栈中的值恢复到寄存器组中去。入栈和出栈操作均需要2个指令周期,保存和恢复8个寄存器的值,共需32个周期。通过寄存器组切换来保护寄存器组中的数据,省去堆栈操作,从而可以提高程序的运行速度。 为中断程序指定工作寄存器组的缺点是所有被中断调用的函数都必须使用同一个寄存器组,否则参数传递会发生错误。 可使用using函数说明属性来规定函数所使用的寄存器组。格式如下: 函数类型 函数名(形式参数列表) using n using属性使用一个0-3的整形参数,这个参数表示使用的寄存器组的编号,这个参数不能使用带运算符的表达式。using属性只能在函数定义中使用,不能在函数原型声明中使用。 使用using属性的函数将自动完成以下操作: 进入函数前,将当前使用的寄存器组的标号保存在堆栈中。 更改PSW的寄存器组选择位,选择设定的寄存器组作为当前的寄存器组。 函数退出时,将寄存器组恢复成进入函数前的寄存器组。 例 3.22: stmt level source 1 2 int alarm; 3 int alarm_count; 4 extern void alfunc( int iValue ); 5 6 void falarm( void ) using 3 { 7 1 alarm_count++; 8 1 alfunc (alarm = 1); 9 1 } 8051的标准中断有5种,某些8051兼容类型可以有更多的中断,C51最大支持32个中断。 中断函数的定义: 函数类型 函数名(形式参数列表) interrupt n 注意:仅能在函数定义时使用interrupt函数属性,不能在函数声明时使用interrupt函数属性。它将函数定义为中断处理函数。中断属性带一个0-31的整形参数,用来表示中断处理函数所对应的中断号,该参数不能是带运算符的表达式。 中断函数在运行过程中自动完成以下工作: 当中断产生时,中断函数被系统所调用,ACC、B、DPH、DPL、PSW这些特殊功能寄存器的值将被保存在堆栈中。 如果中断函数未使用using属性进行修饰,中断函数中所使用的寄存器的值将保存在堆栈中。 中断函数运行完成退出时,堆栈中保存的数据将被恢复。 中断函数退出时,其对应的汇编代码使用RETI指令退出(普通函数使用RET指令退出)。 CX51将自动生成中断向量。 stmt level source 1 extern bit alarm; 2 int alarm_count; 3 4 5 void falarm (void) interrupt 1 using 3 { 6 1 alarm_count *= 2; 7 1 alarm = 1; 8 1 } 中断函数应遵循以下规则: 中断函数不能进行参数传递。 中断函数没有返回值。 不能在其它函数中直接调用中断函数 如果在中断中调用了其他函数,必须保证这些函数和中断函数使用了相同的

文档评论(0)

jdy261842 + 关注
实名认证
文档贡献者

分享好文档!

1亿VIP精品文档

相关文档