搜索
bottom↓
回复: 5

可重入和不可重入问题

[复制链接]

出0入0汤圆

发表于 2013-11-5 15:21:24 | 显示全部楼层 |阅读模式
可重入和不可重入问题

如附件
加上禁止中断 就变成可重入函数
如果没有禁止中断 就变成不可重入函数

想请问裸机架构一般来说如下
http://www.docin.com/p-8448025.html
例如
If(FlagDisplay==1)
{
FlagDisplay=0
XXX();
}
FlagDisplay不需考虑重入性吗??

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入296汤圆

发表于 2013-11-5 16:39:09 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2013-11-5 16:40 编辑

是否可重入问题一般来说从两个角度来看
1、对于完全没有使用公共资源的函数,必然是可重入的,比如,函数里面只使用局部变量(包括形参),或者同时
   用到堆分配的——也可以简单的说,如果一个函数所有的资源(变量)都是动态分配的,那么就是可重入的。
2、对于使用了公共资源的函数,比如函数里面使用了除通用寄存器以外的寄存器,静态变量(全局变量,静态局部
   变量),如果这些公共资源没有做临界区保护,那么函数是不可重入的。如果做了临界区保护,则函数可以认为
   是可重入的——但实际上,这要看临界区的类型,如果是操作系统或者中断那种完全可以阻断其它任务的执行的
   则可以认为函数是严格可重入的(例如你帖子里面提出的情况);如果临界区不能阻断其他任务的执行,比如状
   态机实现多任务的情形下,如果临界区的处理是非阻塞式的,那么实际上要从函数的功能性上检查:比如看看如
   果错过了一两次进入临界区的机会,对当前的调用者是否有不良影响——如果有,这就不是一个可重入的函数。

出0入0汤圆

 楼主| 发表于 2013-11-5 17:49:34 | 显示全部楼层
Gorgon_Meducer 发表于 2013-11-5 16:39
是否可重入问题一般来说从两个角度来看
1、对于完全没有使用公共资源的函数,必然是可重入的,比如,函数里 ...

感谢回答

FlagDisplay为全局变量

假设不以临界区保护的话
If(FlagDisplay==1)
{
FlagDisplay=0;
XXX();
}
则可为严格可重入的,是指当只有前台(主程序)和后台(ISR)
两个线程的情况下吗也就是前台可以被后台中断

要加临界区的条件不是指当两个不同子程序访问和修改相同的内存数据时
需增加临界区
为甚么FlagDisplay不需要加
If(FlagDisplay==1)
{
关中断
FlagDisplay=0;
开中断
XXX();
}

出0入296汤圆

发表于 2013-11-6 13:19:21 | 显示全部楼层
blueice1108 发表于 2013-11-5 17:49
感谢回答

FlagDisplay为全局变量

对于这种情况,不加是不严格的,但如果变量具有天然原子性,可以带这样的侥幸心理。

出0入0汤圆

 楼主| 发表于 2013-11-6 16:08:08 | 显示全部楼层
Gorgon_Meducer 发表于 2013-11-6 13:19
对于这种情况,不加是不严格的,但如果变量具有天然原子性,可以带这样的侥幸心理。 ...

感谢傻孩子大侠回答

出0入0汤圆

发表于 2014-12-10 11:22:51 | 显示全部楼层
本帖最后由 zhenghe 于 2014-12-10 11:24 编辑

多个上下文都要访问的资源为共享资源。如:静态变量、函数、硬件外设等。

上下文并发访问的共享资源为临界共享资源,简称临界资源,临界资源必须互斥访问。

重入:当一个函数运行过程中(直接或间接)调用自身的现象为重入。

可重入函数:重入时,各函数仍然得到正确结果的函数为可重入函数。

可重入与线程安全两个概念都关系到函数处理资源的方式。但是,他们有一定的区别。可重入概念会影响函数的外部接口,而线程安全只关心函数的实现。

大多数情况下,要将不可重入函数改为可重入的,需要修改函数接口,使得所有的数据都通过函数的调用者提供。
要将非线程安全的函数改为线程安全的,则只需要修改函数的实现部分。一般通过加入同步机制以保护共享的资源,使之不会被几个线程并发访问。

线程安全与可重入性是两个不同性质的概念。可重入性是在单线程操作系统背景下,重入的函数或者子程序,按照后进先出的线性序依次执行完毕。多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。可重入函数未必是线程安全的;线程安全函数未必是可重入的。例如,一个函数打开某个文件并读入数据。这个函数是可重入的,因为它的多个实例同时执行不会造成冲突;但它不是线程安全的,因为在它读入文件时可能有别的线程正在修改该文件,为了线程安全必须对文件加“同步锁”。另一个例子,函数在它的函数体内部访问临界共享资源使用了加锁、解锁操作,所以它是线程安全的,但是却不可重入。因为若该函数一个实例运行到已经执行加锁但未执行解锁时被停下来,系统又启动该函数的另外一个实例,则新的实例在加锁处将转入等待。如果该函数是一个中断处理服务,在中断处理时又发生新的中断将导致资源死锁。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 13:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表