打印

关于关键字reentrant的疑问

[复制链接]
2775|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
福州观沧海|  楼主 | 2012-9-20 21:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在一个UCOSII的实例中看到一个函数的定义
void Task1(void *ppdata) reentrant
{。。。} 我知道reentrant是重入的意思,这个函数被定义为可重入函数。但我不太清楚有reentrant这个关键字和没有这个关键字之间的区别。恳请高人们指点一二,小弟不胜感激!

相关帖子

沙发
yewuyi| | 2012-9-20 23:35 | 只看该作者
既然定义都给出了,那就是可重入函数和不可重入的区别了啊。

你BAIDU什么叫可重入函数就应该可以完全弄清楚这个关键词的作用,有无它的区别也就明白了。

网络上有大把的详细解释,我就不重复解释了,你自己百度一下吧。

使用特权

评论回复
板凳
阿南| | 2012-9-20 23:35 | 只看该作者
一、可重入函数
1)什么是可重入性?
可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入 函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。

2)可重入函数:
不为连续的调用持有静态数据。
不返回指向静态数据的指针;所有数据都由函数的调用者提供。
使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
如果必须访问全局变量,记住利用互斥信号量来保护全局变量。
绝不调用任何不可重入函数。

3)不可重入函数:
函数中使用了静态变量,无论是全局静态变量还是局部静态变量。
函数返回静态变量。
函数中调用了不可重入函数。
函数体内使用了静态的数据结构;
函数体内调用了malloc()或者free()函数;
函数体内调用了其他标准I/O函数。
函数是singleton中的成员函数而且使用了不使用线程独立存储的成员变量 。
总的来说,如果一个函数在重入条件下使用了未受保护的共享的资源,那么它是不可重入的。

使用特权

评论回复
地板
airwill| | 2012-9-21 08:51 | 只看该作者
reentrant 应该是在 C51 里扩展的关键词.
C51 里, 由于 256 字节的内存空间太小, 不大合适将局部变量放在堆栈里, KEIL 编译器将局部变量都放在 RAM 里, 通过覆盖分析, 来高效地使用内存. 但是这样就导致函数的不可重入性.
为此, 通过定义这个关键词来解决. 具有 reentrant 的函数的局部变量不直接在内存分配地址, 而是通过堆类的空间来分配

使用特权

评论回复
5
阿南| | 2012-9-21 09:14 | 只看该作者
在RAM有限的51单片机中,一般不建议使用reentrant,因为每次调用被申明为reentrant的函数时,都会对参数和变量实现压栈,RAM很快就会不够用。

使用特权

评论回复
6
菜鸟同学| | 2013-4-21 19:20 | 只看该作者
airwill 发表于 2012-9-21 08:51
reentrant 应该是在 C51 里扩展的关键词.
C51 里, 由于 256 字节的内存空间太小, 不大合适将局部变量放在堆 ...

说的太对了,百度了好久,还是你这个说的明白。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

311

帖子

1

粉丝