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

2020-01-12 17:12发布

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

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

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

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

实在没有办法,刚才检查MAP信息,TNND才发现,其实不仅仅有再入的问题,这个函数使用的局域变量占用的地址,有一个是和其他函数是重复覆盖使用的,真相大白了,两天时间就是不想写一个reentrant,因为会增加一点点代码。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
43条回答
rube
1楼-- · 2020-01-12 21:16
函数同时被调用了?局部变量被赋值,不是期望的值
wye11083
2楼-- · 2020-01-13 01:33
 精彩回答 2  元偷偷看……
了无
3楼-- · 2020-01-13 07:02
函数局部变量是定义在栈里面的,肯定会和其他函数的局部变量重合。我说的没错吧?
makesoft
4楼-- · 2020-01-13 11:02
wye11083 发表于 2019-12-1 22:02
lz,c代码函数里面的变量都在栈里面,不可能出现地址重复的

keil c51优化的时候会判断函数会不会嵌套调用,不存在这种关系的话存在局域变量复用的问题。
并不是所有编译器局域变量都是栈操作的。
johnlj
5楼-- · 2020-01-13 16:24
一个函数在程序初始化时使用,这个时候系统任何中断并没有打开

初始化后,函数已经执行完退出,不会影响第一次中断调用的

倒是怀疑定时中断时间间隔过小,造成前次中断未返回,后次中断又来了,没做再入函数设置,当然会出问题
makesoft
6楼-- · 2020-01-13 19:33
johnlj 发表于 2019-12-1 23:40
一个函数在程序初始化时使用,这个时候系统任何中断并没有打开

初始化后,函数已经执行完退出,不会影响第 ...

哈哈,就是一样的思维才导致查了两天才解决问题。
当中断和主程序共同可以调用一个函数的时候,这个函数不是再入属性,编译器优化这个函数局域变量占用内存的时候,可能和主程序其他函数做覆盖优化,这个时候问题就发生了,哪怕仅仅覆盖一个字节。
当局域变量不是静态分配而是堆栈的话,就没有这个问题发生了。

一周热门 更多>