第5章C语言程序设计及仿真调试-山东大学课程中心.ppt
6、函数的重入 为了提高效率,C51没有提供这种调用堆栈,而是提供一种压缩栈。每个过程被给定同一个空间,用于存放局部变量。过程中的每个变量都存放在这个空间的固定位置。当递归调用这个过程时,会导致变量被覆盖。 在某些实时应用中,非重入函数是不可取的。因为,函数调用时可能会被中断程序中断,而在中断程序中可能再次调用这个函数,所以C51允许将函数定义成重入函数。 重入函数可被递归调用和多重调用, 而不用担心变量被覆盖, 因C51可模拟生成一个可重入变量堆栈 {随存储模式(small, compact, large)不同, 堆栈可在不同的存储器区(idata, pdata, xdata)}, 每次函数调用时的局部变量都会被单独保存。因为这些堆栈是模拟的,重入函数一般都比较大,运行起来也比较慢。 * 不常使用 6、函数的重入 由于一般可重入函数由主程序和中断调用(即递归调用), 所以通常中断程序使用与主程序不同的工作寄存器组。 另外,对可重入函数,在相应的函数前面加上开关#pragma noaregs,以禁止编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。 所以对不依赖于寄存器组的函数可被其他使用了不同的寄存器组的多个函数调用。 * extern char func (); #pragma NOAREGS noaregfunc () { k = func () + func (
原创力文档

文档评论(0)