搜索
bottom↓
回复: 7

变量定义成data型时被莫名其妙改变

[复制链接]

出0入0汤圆

发表于 2009-12-15 12:32:23 | 显示全部楼层 |阅读模式
请教各位大侠,我在A函数中定义了一个变量i,A函数中通过指针函数的形式调用了B函数,如果把i定义成data型的,则B函数执行完毕返回的时候原本的i值就被莫名其妙的改变了,如果i定义成static 或者idata型的则不会被改变,百思不得其解,不知道各位有没有碰到过这个情形

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-12-15 12:48:58 | 显示全部楼层
我也遇到过,我认为是Keil C的bug ,keil C处理 函数指针 的时候容易覆盖局部变量,只好用全局变量或static变量解决,没办法。
--------------------
编辑修改:研究了一下,发现不是bug,详见4楼。

出0入0汤圆

 楼主| 发表于 2009-12-15 13:03:16 | 显示全部楼层
这样我以后就会特别注意了,谢谢shark 大侠!!!

出0入0汤圆

发表于 2009-12-15 14:07:25 | 显示全部楼层
禁止编译器对函数A与函数B进行覆盖分析就好。

出0入0汤圆

发表于 2009-12-15 18:09:03 | 显示全部楼层
Keil C为了节省内存,局部变量没有使用栈来存储,而是使用覆盖的方法来重复使用,对没有调用关系的函数,编译器认为他们的局部变量可以覆盖,所以你在A里直接调用B是不会发用问题的,因为有调用链,编译器不会覆盖他们的局部变量,但如果A里通过一个函数指针调用其它函数,编译器没法预知这个函数指针指向哪个函数,所以有可能它指向的那个函数B,而在编译器看来B没有被A直接调用,这样,悲剧就发生了。

   如果编译器智能一点,理论上是可以通过跟踪对函数指针的赋值语句分析出该指针可能指向哪些函数,然后对这些函数不进行覆盖就行了,当然,说起来易,实现起来难,因为赋值操作也可能是通过函数参数传递的,也可能是在任何其它函数里进行的,这样分析起来太难了,干脆就不管了。

3楼的方法是正规方法,不过写起来挺麻烦的,要在在Link里加选项:
例如:
MyFile.c 时有函数 FuncA(),希望FuncA用的局部变量不被其它函数覆盖
要在Link里加

OVERLAY(?PR?FuncA?MyFile ! *)
该操作可以直接加入link 命令行(如果你不用uVision的话),
在uVision里可以Project/Option for XXXX , BL51 MISC 页 ,Overlay 框内输入  ?PR?FUNA?MyFile ! *   即可。

出0入0汤圆

 楼主| 发表于 2009-12-16 10:22:43 | 显示全部楼层
试了一下4楼发方法,问题解决,谢谢“鲨鱼”的热心帮助,同时也谢谢 eduhf_123 经历

出0入0汤圆

发表于 2011-12-8 21:27:37 | 显示全部楼层
今天碰到这个问题了,谢谢4楼的方法!已经解决了

出0入0汤圆

发表于 2012-7-31 22:14:52 | 显示全部楼层
感谢四楼的回答
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 17:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表