当前位置:首页 > 第六章 函数
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指令退出。
共分享92篇相关文档