求助,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-14 16:15
他妈的终于找到原因了。。。函数指针的锅!!!不知道C51怎么实现的。。。坑爹啊!!!
OneRain
2楼-- · 2020-01-14 18:43
具体情况,看各位有啥好的解决办法。。。。
typedef mic_bool_def (*aaa_def)(uint8_t reg, uint8_t amount, uint8_t *pd);
定义了一个函数指针类型,然后,用这个类型起了个变量
aaa_def bbb;
一个实现函数是:
mic_bool_def  ccc(uint8_t reg, uint8_t amount, uint8_t *pd);
现在的情况是:
bbb = ccc;
然后执行bbb(参数),就出现上面的问题,但是直接执行ccc(参数),完全OJBK。。。。问题来,各位怎么看这个问题。。。
OneRain
3楼-- · 2020-01-14 19:06
 精彩回答 2  元偷偷看……
OneRain
4楼-- · 2020-01-14 23:22
最后的解决办法顺带也写上,如果只是少量的指针,可以用keil的OVERLAY来搞,但是用的比较多,还是不建议,因为非常容易疏漏。。。最后我个人的解决办法,当然是不用函数指针啦,直接用switch啦!!!!!
OneRain
5楼-- · 2020-01-15 01:06
对了,在补充一句,就是用函数指针的时候,函数参数也有限制,如果你用OVERLAY来实现的话,最多好像是3个。。。具体原因没有去深究啦。。。还是老老实实的用switch好啦!!!

一周热门 更多>