奇怪,往xdata的一个数组里写数,第0个元素的值会自动变成0,改成idata就不会出现

2020-01-23 14:50发布

小弟在做一个项目,往数组里边写入一个要显示的数据,送1602LCD进行显示。
定义的了一个在xdata区的数组:
xdata uchar ber[7];
然后某段程序往里边赋值
for(i=0;i<7;i++)
ber=array;
结果发现ber[0]的值被变成了十进制的0,导致LCD显示函数认为已经到了最后一个字符而不显示。
即使我把代码改成:
for(i=0;i<7;i++)
ber=i+ '0';//(变成asccii码)
一样的,就ber[0]的值为0,数组其他元素的值是对的。
后来干脆把ber[]定义在idata区内。
竟然没有问题了!
想不明白为什么。

一开始怀疑为xdata区的这一字节坏掉了。
坏了个新一点儿的片子也这样。
如果xdata区不稳定,应该不只这一字节坏掉,我其他还有很多定义在Xdata区域内的变量,也是正常的。就这一个不正常。
请教高手这是为什么。

一开始也怀疑过,data的某些区域会被中断占用,可是xdata区域是不会被占的丫!
我的data=198字节,XDATA=912字节,code=22334字节
XDATA是片内自带的1KB XRAM
WINBOND W77E58 52单片机
keil uv 8.03版

另外有一个问题不明白,如果编译器告诉我,data使用量不超过256字节,是不是代表data占用量不会受中断影响(我是说会不会由于中断导致data溢出)?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
52条回答
jason1927
1楼-- · 2020-01-27 07:41
建议你检查一下你是不是ber[]这个数组的物理地址被另外的数组操作,也就是说如果编译器在ber[]这个物理地址前面连续分配了一个数据,而你刚好前面这个数组操作时多操作了一个元素,造成你一直在修改这个单元,而改到data区之后就完全正确。当然只是猜测,检查一下看看
zhanliana
2楼-- · 2020-01-27 11:29
回复【25楼】jason1927
建议你检查一下你是不是ber[]这个数组的物理地址被另外的数组操作,也就是说如果编译器在ber[]这个物理地址前面连续分配了一个数据,而你刚好前面这个数组操作时多操作了一个元素,造成你一直在修改这个单元,而改到data区之后就完全正确。当然只是猜测,检查一下看看
-----------------------------------------------------------------------

首先我不知道如何查看ber[]数组前面一个地址被谁占用了, keil软件有这个功能么,如果一个一个看哪个变量各占哪些置,未免速度太慢。而且,我试过,貌似不是个切实可行的办法。
另外,对于一个确定元素个数的数组,在编译阶段如果有越界行为,应该会编译通不过。
如果在程序运行阶段越界,还真不知道会有什么样的结果,应该是复位。
zhanliana
3楼-- · 2020-01-27 13:41
 精彩回答 2  元偷偷看……
rainyss
4楼-- · 2020-01-27 16:59
【27楼】 zhanliana
...
另外,这是不是C语言的经典陷阱啊,编译器也不报错。


你说对了,这就是C语言的"经典陷阱",编译器不仅不会报错,也不应该报错,因为它无法辩断这是不是程序员有意识的行为----C语言是用高级语言的语法干低级语言的事,除法语法问题外,其余一切都交给程序员来处理.
xiaobendan
5楼-- · 2020-01-27 21:52
请教 flywater 落叶
在STARTUP.A51中指定
XDATALEN        EQU     0x0400
是否也可达到设置那个参数的效果?
我一直是这样做的,里面都没有设置什么,只是在STARTUP.A51中修改一下就行了。
sipueay
6楼-- · 2020-01-28 00:19
这个贴子不错, 既有分析思路,又有解决办法.

一周热门 更多>