云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 第六章 函数

第六章 函数

  • 62 次阅读
  • 3 次下载
  • 2025/6/3 17:57:59

4) 可重入函数

什么是可重入函数?

可重入函数就是允许被递归调用的函数。函数的递归调用是指当一个函数正被调用尚未返回时,又直接或间接调用函数本身。有两种情况,一种是自身循环调用,另一种是其他函数调用,如程序中正在调用某个函数,而中断中也调用,就可能出现同时调用。一般的函数不能做到这样,只有重入函数才允许递归调用。

因为8051 内部堆栈空间的限制,为了提高效率,C51 没有提供这种堆栈,而是提供一种压缩栈。每个函数有一个给定存储空间,用于存放局部变量。函数中的每个变量都存放在这个空间的固定位置。当递归调用该过程时会导致变量被覆盖,所以通常情况下C51中的函数是不能重入的。

可重入函数为此必须使用reentrant函数属性来声明函数是可重入的。

与不可重入函数的参数传递和局部变量的存储分配方法不同,C51编译器为再入函数生成一个模拟栈,通过这个模拟栈来完成参数传递和存放局部变量。这样每次函数调用时的局部变量都会被单独保存,再入函数一般占用较大的内存空间,运行起来也比较慢,并且不允许传递bit 类型的变量,也不能定义局部位变量。

可重入函数经常在实时系统中应用,也可在中断函数和非中断函数同时调用同一个函数时使用。

5) 规定函数使用的寄存器组切换using m

可使用using函数说明属性来规定函数所使用的寄存器组。

m是一个0-3的整形参数,分别对应0-3组工作寄存器。这个参数表示使用的寄存器组的编号,这个参数不能使用带运算符的表达式。using属性只能在函数定义中使用,不能在函数原型声明中使用。

使用using属性的函数将自动完成以下操作: 进入函数前,将当前使用的寄存器组的标号保存在堆栈中。

更改PSW的寄存器组选择位,选择设定的寄存器组作为当前的寄存器组。

函数退出时,将寄存器组恢复成进入函数前的寄存器组。

6) 中断函数说明interrupt n

C51最大支持32个中断,在单片机中n常用0-5。对应中断源见P177。

注意:仅能在函数定义时使用interrupt函数属性,不能在函数声明时使用interrupt函数属性。 中断函数在运行过程中自动完成以下工作:

1)当中断产生时,将特殊功能寄存器ACC、B、DPH、DPL、PSW的值将被保存在堆栈中。

2)如果中断函数未使用using属性进行修饰,中断函数中所使用的寄存器的值将保存在堆栈中。

3)中断函数运行完成退出时,堆栈中保存的数据将被恢复。

4)中断函数退出时,其对应的汇编代码使用RETI指令退出。

搜索更多关于: 第六章 函数 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

4) 可重入函数 什么是可重入函数? 可重入函数就是允许被递归调用的函数。函数的递归调用是指当一个函数正被调用尚未返回时,又直接或间接调用函数本身。有两种情况,一种是自身循环调用,另一种是其他函数调用,如程序中正在调用某个函数,而中断中也调用,就可能出现同时调用。一般的函数不能做到这样,只有重入函数才允许递归调用。 因为8051 内部堆栈空间的限制,为了提高效率,C51 没有提供这种堆栈,而是提供一种压缩栈。每个函数有一个给定存储空间,用于存放局部变量。函数中的每个变量都存放在这个空间的固定位置。当递归调用该过程时会导致变量被覆盖,所以通常情况下C51中的函数是不能重入的。 可重入函数为此必须使用reentrant函数属性来声明函数是可重入的。 与不可重入函数的参数传递和局部变量的存储分配方法不同,C51编译器

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com