Keil C51对C语言的关键词扩展之十五: reentrant

Keil C51中的reentrant关键字用于声明可重入函数,允许函数被多个进程同时调用而不会产生数据覆盖。可重入函数在不同内存模型下有特定的模拟堆栈,如SMALL在idata区,COMPACT在pdata区,LARGE在xdata区。使用时需要注意不支持位寻址变量,不能被alien函数调用,返回地址保存在硬件堆栈等规则。启动代码STARTUP.A51负责初始化模拟堆栈。尽管效率较低,但在8051应用中,可重入函数通过模拟堆栈进行参数和局部变量管理。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值