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

2020-01-12 17:12发布

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

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

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

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

实在没有办法,刚才检查MAP信息,TNND才发现,其实不仅仅有再入的问题,这个函数使用的局域变量占用的地址,有一个是和其他函数是重复覆盖使用的,真相大白了,两天时间就是不想写一个reentrant,因为会增加一点点代码。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
43条回答
wye11083
1楼-- · 2020-01-13 20:06
 精彩回答 2  元偷偷看……
johnlj
2楼-- · 2020-01-13 20:43
makesoft 发表于 2019-12-1 23:47
哈哈,就是一样的思维才导致查了两天才解决问题。
当中断和主程序共同可以调用一个函数的时候,这个函数 ...

看明白是,是初始化调用该函数后,其占用的临时变量空间的某个字节被其它函数使用,然后中断中该函数继续使用原来的临时变量空间,就出现了bug

那么减低编译优化级别,会不会避开这个问题?
makesoft
3楼-- · 2020-01-13 21:03
默认优化8级,并且64K程序空间现在只剩余几百字节,不然也不吝啬使用reentrant啊
takashiki
4楼-- · 2020-01-14 02:37
makesoft 发表于 2019-12-2 06:26
默认优化8级,并且64K程序空间现在只剩余几百字节,不然也不吝啬使用reentrant啊 ...

搞成11级优化,全局寄存器着 {MOD},您试下,估计能剩余2kB代码空间出来
stm32f103f4
5楼-- · 2020-01-14 08:18
不知道不开优化会是什么情况
McuPlayer
6楼-- · 2020-01-14 12:48
 精彩回答 2  元偷偷看……

一周热门 更多>