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

2020-01-12 17:12发布

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

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

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

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

实在没有办法,刚才检查MAP信息,TNND才发现,其实不仅仅有再入的问题,这个函数使用的局域变量占用的地址,有一个是和其他函数是重复覆盖使用的,真相大白了,两天时间就是不想写一个reentrant,因为会增加一点点代码。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
43条回答
at90s
1楼-- · 2020-01-15 12:39
只有51才会有这个问题,keil c在连接时才分配局部变量的内存,它会分析函数调用关系来确定每个函数里各个局部变量的地址,这都是51硬件维护的栈空间只有256字节缘故。其他处理器一般都会吧局部变量在栈里面分配。
wuha
2楼-- · 2020-01-15 18:25
keil c51默认的8级优化,我在读写矩阵键盘时,总是固定的一个按键没反应,其他按键都没问题;换成按键程序一模一样,主程序不太一样的另一个板子上,还是按键有问题,但是换了个按键固定没反应。后来这两套程序都把优化等级改成0,就没有这个问题了,到现在都不知道啥原因。
newselect
3楼-- · 2020-01-15 20:09
中断里不放函数就好啦, 要放就用全局变量或静态变量
luobote55
4楼-- · 2020-01-15 22:13
 精彩回答 2  元偷偷看……
security
5楼-- · 2020-01-16 00:33
takashiki 发表于 2019-12-2 06:56
搞成11级优化,全局寄存器着 {MOD},您试下,估计能剩余2kB代码空间出来

请教一下,11 级优化,我怎么看到只有 9 级呢,在哪里设置?
laujc
6楼-- · 2020-01-16 01:31
你这个还好解决,上次用renesas的EEPROM Flash库,直接覆盖变量值,那找起来才痛苦。。。
因为那个库是不开源的,后来还是根据网上的提示,猜出是这个问题,重新定义了dr文件才搞定。

一周热门 更多>