打印

相当诡异

[复制链接]
1542|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kanke100|  楼主 | 2009-3-12 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
HWM| | 2009-3-12 16:51 | 只看该作者

如果去掉reentrant,又形成递归调用,诡异得你都无法想象

加入“reentrant”是要开销的,自然会费些时间。

使用特权

评论回复
板凳
kanke100|  楼主 | 2009-3-12 16:52 | 只看该作者

等待

不知道是我没有把问题说清楚还是大家都很忙,怎么没人理我

使用特权

评论回复
地板
kanke100|  楼主 | 2009-3-12 17:16 | 只看该作者

等待

这个不是递归,只是有可能会重入,但这种可能性很小。我没有设置成重入函数之前,测试过好几次都没问题,加上只是为了让它更稳定。这是我第一次用重入函数,就出现了这种情况。我怕会给以后留下阴影,再也不敢用重入函数了。

使用特权

评论回复
5
wangkj| | 2009-3-12 17:26 | 只看该作者

你反汇编后看代码不就知道原因啦??

或者跟踪执行,或者模拟执行,都能找到。
程序没有灵异时间,只有笨笨。

使用特权

评论回复
6
xwj| | 2009-3-12 17:27 | 只看该作者

唉... 中断中延时1秒? 真亏你想的出来。

2楼正解,为了递归时局部变量不重叠,加入“reentrant”后一般都会把局部变量改用堆栈来操作,而且中断程序也要多很多很多现场保护工作,自然会增加大量的运行时间


 HWM 发表于 2009-3-12 16:51 侃单片机 ←返回版面    

2楼: 如果去掉reentrant,又形成递归调用,诡异得你都无法想象 

加入“reentrant”是要开销的,自然会费些时间。
 
 
如果非要强调运行时间的话,最简单的就是再复制一遍,然后换个名即可。

而中断中延时1秒? 真亏你想的出来。
如果你的死机程序中这么做,那只能说明你对编程还没入门。

使用特权

评论回复
7
ayb_ice| | 2009-3-12 20:33 | 只看该作者

重入函数的局部变量是通过模拟堆栈分配的

同样函数延时是不同的

使用特权

评论回复
8
冷漠| | 2009-3-13 09:09 | 只看该作者

我的程序怎么没这个问题?

主函数调用延时1秒闪烁一个LED,中断函数调用同一delay_ms(int),从0.1S——2S 参数随意(5S也可以啦),闪烁另一LED。

结果与逻辑希望值一致!

假设中断函数中调用delay_ms(1000),那么主函数中的延时误差不可能大于2秒!符合合理逻辑。

绝无可能1秒误差到10秒。肯定程序有问题。

使用特权

评论回复
9
平常人| | 2009-3-13 09:22 | 只看该作者

2楼正接,递归就是函数的重入

把函数定义成重入函数,就是允许这颗函数可以被递归调用。

楼主只知其一,不知其二呀。。。。。。。。。

使用特权

评论回复
10
kanke100|  楼主 | 2009-3-13 11:03 | 只看该作者

已解决

原来是堆栈越界了

使用特权

评论回复
11
songbangyan| | 2009-3-13 14:38 | 只看该作者

呵呵

我就寻思,单片机能给你提供那么大的堆栈不哦

使用特权

评论回复
12
ayb_ice| | 2009-3-13 21:20 | 只看该作者

递归和重入可不完全一样

使用特权

评论回复
13
平常人| | 2009-3-13 21:41 | 只看该作者

当然不一样

递归要求函数可重入,但函数的重入调用,不全是递归调用。

使用特权

评论回复
14
HWM| | 2009-3-13 22:08 | 只看该作者

“递归函数”和“递归调用”

“递归函数”是在函数体内存在对本函数的“调用”,而“递归调用”反映的是一种“循环反身”掉用的关系。“递归函数”必然存在“递归调用”,而且其调用关系相当的直接。但有时候,表面上看不出直接“递归调用”的关系,却着实存在间接的“递归调用”关系,如A call B,B call C,C call A。此外,由于中断的任意性,若在中断中调用一个函数,而此函数又可以被其它途径调用,则就有可能存在函数的“递归调用”。

“递归调用”涉及到一个函数重入的问题,其实如果函数局部变量如果能全部放在栈中,问题也就不存在了。但为了节省栈的空间,往往会把一些体积大的局部变量放在栈外,并可能作覆盖处理。因此必须告诉编译,在处理具有重入特性的函数时,必须完全采用“栈”来存储局部变量。当然如此一来,“栈”会长得很快,甚至会撑破内存。LZ便是一例。

使用特权

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

本版积分规则

10

主题

47

帖子

0

粉丝