zhangzhonghua 发表于 2023-12-27 18:00:21

本帖最后由 zhangzhonghua 于 2023-12-27 19:07 编辑

标记下本贴关键词以便查找。局部变量被意外修改,地址重叠,函数指针,调用树,Overlay,MAP文件,MEMORY MAP,OVERLAY MAP,编译时栈帧,运行时栈帧。

_奶咖君_ 发表于 2023-12-27 18:49:31

老哥牛的,,把这个帖子升华了{:4_168:}

杨为民 发表于 2023-12-27 19:23:52

_奶咖君_ 发表于 2023-12-27 09:06
关于第3点,,就算p不再被调用 也应该分配不同地址,,,就像我说的,他的func2绝对不是这样正常的调用, ...

4)关闭C51优化就不会产生这种现象了。

如果你没有进行其他设置(比如你强制它们Overlay),如果关闭优化还有这种不同层次的变量的地址相同现象,恭喜你中奖了,可以直接向Keil举报

_奶咖君_ 发表于 2023-12-27 19:35:32

杨为民 发表于 2023-12-27 19:23
4)关闭C51优化就不会产生这种现象了。

如果你没有进行其他设置(比如你强制它们Overlay),如果关闭优 ...

关闭优化并不算是一个很好的建议,,,除非所有人都有能力优化代码...老师 发个帖子系统的讲讲 overlay这个功能吧,,怎么正确的使用,,而不是一刀切,,虽然也很有用..

杨为民 发表于 2023-12-27 19:59:30

本帖最后由 杨为民 于 2023-12-27 20:00 编辑

_奶咖君_ 发表于 2023-12-27 19:35
关闭优化并不算是一个很好的建议,,,除非所有人都有能力优化代码...老师 发个帖子系统的讲讲 overlay这个 ...

(1)本文的问题本质是楼主抖机灵,故意设套(而且在一楼还隐瞒了):“而我这个问题,根本原因是用了函数指针调用,而编译器不能正确理出调用树,又要Overlay去节省空间,结果搞得调用函数和被调用函数的局部变量地址重叠了。”
对于这种抖机灵,Keil的C51给出的解决方法就是关闭优化,你有能耐你自己玩!
(2)所以我“关闭优化”只是告诉楼主C51解决他的这个特殊程序的问题的特殊手段,而非给其他任何人的建议。C51的智能优化功能(包括函数调用树分析)是很稳定可靠的,一般情况下不需要关闭。判断需不需要很简单,只要程序不出错,就使用高的优化等级。


杨为民 发表于 2023-12-27 20:04:36

_奶咖君_ 发表于 2023-12-27 19:35
关闭优化并不算是一个很好的建议,,,除非所有人都有能力优化代码...老师 发个帖子系统的讲讲 overlay这个 ...

“发个帖子系统的讲讲 overlay这个功能吧”,这个问题可能很多人感兴趣,我尽早在这个版块单独发帖介绍吧

zhangzhonghua 发表于 2023-12-28 00:10:26

本帖最后由 zhangzhonghua 于 2023-12-28 09:20 编辑

不知道什么叫抖机灵、隐瞒、设套。整个问题定位过程如下。

1、26日下班前发帖时,我还是一脸懵逼的,下班前匆匆忙忙,描述中只想到func1()调用func2(),没考虑到函数指针。
2、27日上午上班,看到回复,提到Overlay和函数指针,简单查了一下,了解到函数指针会造成Overlay问题,回复中增加了函数指针描述。
3、奶咖君指点了2个办法,维护调用树和NOOVERLAY。感觉维护调用树麻烦,就先用NOOVERLAY,结果到12点还弄不起来,也是奶咖君指出了错误。
4、有人提到可重入函数,了解了下,感觉也不合适,回复了,准备还是按奶咖君的2个办法做。
5、下午上班,继续深入了解Overlay,主要也不是看网络百度啥的,就是看Keil C51自带的Help手册,同时对比自己的MAP文件,边改、边调试、边看MAP文件变化,逐渐把Overlay、编译时栈帧的运作原理基本搞懂。
6、27日下午4点,问题的根本原因和解决办法也弄清了,对比结果也出来了,发帖汇报。发帖按我喜欢看的风格来写,修改过几次。
7、下班前,再发帖标记关键字。
8、晚上,看到一些不舒服的字眼,再把过程描述下来。

LAOXU 发表于 2023-12-28 04:23:58

keil 的 调用树, 无法对函数指针的调用, 给出正确答案, 我对此 的操作方法是, 多建几个空的用不着的中断程序, 在 每个中断中, 调用 一个 函数 (主程序中用函数指针调用的).

这样, keil 的 调用树, 就能给出正确答案了.

zhangzhonghua 发表于 2023-12-28 07:57:49

LAOXU 发表于 2023-12-28 04:23
keil 的 调用树, 无法对函数指针的调用, 给出正确答案, 我对此 的操作方法是, 多建几个空的用不着的中断程 ...

1、你这个做法,看MAP文件仔细对比过修改效果吗?我觉得不是最佳的。
2、最佳的方法,是Keil C51的Help手册给出的官方做法,修改调用树,我就是按这个做法去改,看MAP文件仔细对比过修改效果的。而且,也很简单,比你的做法改起来简单、直观。

神农鼎 发表于 2023-12-28 08:29:16

杨为民 发表于 2023-12-27 20:04
“发个帖子系统的讲讲 overlay这个功能吧”,这个问题可能很多人感兴趣,我尽早在这个版块单独发帖介绍吧 ...

期待杨老师的专业讲解,编译器,尤其是 KEIL C51 / KEIL C251 我们还是听杨老师的专业建议
页: 1 2 3 4 [5] 6 7 8 9 10
查看完整版本: 遇到局部变量被意外修改的问题,发现是编译器给2个局部变量分配了相同的地址?