求助,51单片机程序数据溢出。。。(keil函数指针)

2020-01-13 18:39发布

本帖最后由 OneRain 于 2018-6-18 13:18 编辑

很久没有搞51内核的MCU了,发现程序的局域变量数据经常被改的莫名奇妙。。。函数级数在4-5级,不是太深,但是好像经常表现出溢出导致局域变量数据被改。。。
见图: QQ截图20180617152836.png (27.22 KB, 下载次数: 0) 下载附件 2018-6-17 15:29 上传 ,函数1退出后,函数2的局域变量数据全部被修改的不成样子。。。
Program Size: data=74.1 xdata=207 const=1351 code=13749,我程序占有量发现data变量留的足够有啊。。。。求那个大神告知原因啊!!!
修改原因:添加具体错误原因,好让以后有人遇到这种错误的人,搜索到关键字的搜索到这个解决贴!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
OneRain
1楼-- · 2020-01-13 23:51
补充一下,在进入函数1前,函数2的局域变量数据都是正确的,即使函数1执行也是完全没问题,包括函数1进入下一级函数,都没问题,但是只要函数1退出来,函数2的局域变量数据就全部会变。。。
lzf713
2楼-- · 2020-01-14 03:56
局部变量有时候共用相同地址的RAM,但是,不同函数调用时候,会将原来的现场保护好的。比如有两个函数,一个叫a,一个叫b,他们都有一个局部变量,分别是aa,bb,并且共用同地址的存储器。正在执行函数a时候,使用aa。如果函数a还没有结束就调用函数b,在执行函数b之前就将aa压入堆栈了。当执行完函数b之后,自动将aa从堆栈里面弹出,恢复原来状态。
OneRain
3楼-- · 2020-01-14 04:31
lzf713 发表于 2018-6-17 18:50
局部变量有时候共用相同地址的RAM,但是,不同函数调用时候,会将原来的现场保护好的。比如有两个函数,一 ...

现在问题的关键就是,退出函数调用的时候,局部变量会被修改。。。导致值出现错误!!!有点操蛋。。。。
lzf713
4楼-- · 2020-01-14 07:27
 精彩回答 2  元偷偷看……
OneRain
5楼-- · 2020-01-14 09:58
lzf713 发表于 2018-6-17 18:54
有没有开中断?

开了一个心跳中断,我把总中断关了一个鸟样!!!
OneRain
6楼-- · 2020-01-14 12:32
lzf713 发表于 2018-6-17 18:54
有没有开中断?

我都在想要不要用IAR的51了,感觉有点慌!!!!

一周热门 更多>