两天时间解决了一个BUG,函数再入引起,不要忽视警告信息

2020-01-12 17:12发布

本帖最后由 makesoft 于 2019-12-1 20:58 编辑

没想到51的小程序调试起来这么麻烦,花了整整两天时间,让俺这老江湖汗颜。

其实就是偷懒造成的,一个函数在程序初始化时使用,这个时候系统任何中断并没有打开,另外这个函数在定时中断中也有使用,天真的认为不存在同时调用的可能,所以不可能存在再入的问题,就是没理会重复调用的告警信息。

后来程序不定时的出现问题,因为开始已经有了不可能同时调用再入这个函数的场合,所以就没有检查这个问题。

实在没有办法,刚才检查MAP信息,TNND才发现,其实不仅仅有再入的问题,这个函数使用的局域变量占用的地址,有一个是和其他函数是重复覆盖使用的,真相大白了,两天时间就是不想写一个reentrant,因为会增加一点点代码。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
43条回答
lb0857
1楼-- · 2020-01-14 18:01
中断中尽量避免调用子函数,实在需要,就写成专门给这个中断用的,不同的中断之间也是要这样隔离    最实用 接地气的建议
823032003
2楼-- · 2020-01-14 20:07
楼主,请问当函数内部局域变量不是静态分配而是堆栈的话,就没有这个问题吗?
myxiaonia
3楼-- · 2020-01-15 00:57
我之前也犯过和你一样的错误,搞两天没搞明白,后来还是求助后发现的问题。

和你一样,同一个函数中断和应用程序都有调用,我是中断指定了寄存器组,而调用函数却没指定,然后keil没有任何报警,就这么被坑了两天
myxiaonia
4楼-- · 2020-01-15 03:37
823032003 发表于 2019-12-2 08:13
楼主,请问当函数内部局域变量不是静态分配而是堆栈的话,就没有这个问题吗? ...

是的  加重入后会使用栈
saccapanna
5楼-- · 2020-01-15 07:20
 精彩回答 2  元偷偷看……
saccapanna
6楼-- · 2020-01-15 12:38
本帖最后由 saccapanna 于 2019-12-2 09:02 编辑
wye11083 发表于 2019-12-1 22:02
lz,c代码函数里面的变量都在栈里面,不可能出现地址重复的


你说的这种函数,叫做纯函数,纯函数都是可以重入的。但是使用了全局变量等的函数(内部变量使用 static 修饰也是一样的),就不可重入了,或者要做保护。

一周热门 更多>