打印

定义到xdata内的数据会被其他程序冲掉吗?

[复制链接]
4563|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xjycug|  楼主 | 2011-9-18 23:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
c8051f040内集成有4KB的外部数据存储器。定义到该存储器内的全局long型变量会在程序运行中由于其他函数的执行发生变化吗?
在一个项目中,对工程使用 KEIL uv2  编译
编译结果data = 13.7  xdata = 3100   code = 45000+
程序运行得正常,我在定义全局变量时都指定了变量定义到哪个区域,通常全局变量我都指定到 xdata数据区域中,在xdata 中我定义了较多的 int型变量,还有约十个左右的 long型变量。但是后来增加了一个函数,其实也是调用以前存在的一些函数后,我在使用设备时发现执行后来增加的函数后,设备数据显示有异常,有变量的值发生改变,我使用设置断点的方法,发现在执行后来增加的函数后,有全局变量发生改变。后来在进一步的试验中又发现还有参数存在异常,也是全局变量发生改变。这两个全局变量均是定义到 xdata数据区域中的 long型变量。后来我把所有定义到xdata区域中的long型变量都拖到watchwindow中观察,发现就这两个发生改变,而且改变是发生在执行添加的这个函数后,而该函数没有对这两个变量进行直接或者间接的操作。由于xdata区域中int型变量较多,我没有一个一个的检查,但是在操作设备的过程中没有发现其它的异常,我姑且认为后加的函数对xdata区域中int型变量没有影响。我后来将被修改的long型变量在定义中由原来定义到xdata区域中改为定义到idata区域中,再执行函数,变量没有再被修改。
我很纳闷,明明定义的全局变量,怎么在执行一个与之毫不相干的函数后,数据就莫名其妙的被修改了呢?是执行函数时哪儿溢出了?我觉得也不大可能啊,毕竟全局变量我是指定在外部数据存取区域中啊?我没想明白,希望得到大家的指点。看看我是哪儿还没有想到的。

相关帖子

沙发
ayb_ice| | 2011-9-19 08:34 | 只看该作者
这种120%程序本身问题

使用特权

评论回复
板凳
coody| | 2011-9-19 11:42 | 只看该作者
你要程序冲就冲

使用特权

评论回复
地板
xjycug|  楼主 | 2011-9-19 21:50 | 只看该作者
可是被修改的变量赋值的地方就三处,执行后来增加的函数时,没有执行这些赋值语句,定义在 xdata中,怎么就能够将值给修改了呢??

使用特权

评论回复
5
xjycug|  楼主 | 2011-9-20 22:28 | 只看该作者
哎,问题找到了,今天调试,发现是指针溢出,而且是一年前编写的函数,这么久都没有表现出问题,可能是现在程序功能越来越多,变量变多了,指针访问的地方与使用的变量的地址重叠了。看来使用指针还是要多加小心!不过还是觉得很神奇,一直有问题的指针,竟然使设备一直运行正常,难怪我一开始怀疑是我后来写的函数有问题。

使用特权

评论回复
6
steno| | 2012-2-13 11:37 | 只看该作者
我也出现这样的问题,跟你的一样,把变量放到idata就没问题,但我程序上没用指针呀,这又是怎么回事?我在网上查了一下,发现这个问题已经有很多人提出来了。

使用特权

评论回复
7
原野之狼| | 2012-2-13 11:44 | 只看该作者
不要盲目调试  多查阅下基础知识  
比如 编译器手册+C语言本身

使用特权

评论回复
8
coody| | 2012-2-13 11:45 | 只看该作者
相似的问题:我放在钱包里的钱会被花掉吗?

答案:想花就花

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

185

帖子

2

粉丝