reentrant声明的函数为可重入函数。可重入的函数能够被多个进程同时调用。可重入函数在执行时,另外的进程可以中断当前执行的函数,并且调用同一个函数。正常情况下,C51程序中的函数不能被递归地调用,这是由于函数的参数和局部变量都被保存在固定的地址,在递归调用时操作了相同存储位置,导致数据被覆盖。
使用reentrant声明函数为可递归调用的可重入函数:
int calc (char i, int b) reentrant { int x; x = table [i]; return (x * b); }可重入函数,能够被递归调用,也能被两个以上的进程同时调用。可重入函数通常在实时应用或者中断与非中断程序共享相同函数这两种情况下被使用。
每个可重入函数都有一个位于内部ram或外部ram的模拟堆栈:
1)SMALL内存模型下,可重入函数模拟堆栈位于idata区;
2)COMPACT内存模型下,可重入函数模拟堆栈位于pdata区;
3)LARGE内存模型下,可重入函数模拟堆栈位于xdata区;
使用reentrant声明可重入函数须遵循的规则:
1)可重入函数不支持位寻址变量,比如bit类型的参数;
2)可重入函数不能被alien函数调用;
3)可重入函数不能被声明为alien属性(alien用于使能PL/M-51参数传递约定);
4)可重入函数可以同时拥有其他属性,比如using、interrupt、small、compact、large