奇怪,往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条回答
flywater
1楼-- · 2020-01-24 08:29
 精彩回答 2  元偷偷看……
zhanliana
2楼-- · 2020-01-24 14:01
懂了,按照落叶的指示,我对比测试了下,结果如下:
1 如果什么都不告诉他,那么地址分配是随机的,可能会出错。
2 如果勾上使用片内XDATA(看来keil对产品信息掌握比较全,已经预置了这种配置),抽样检查发现没有超出范围的事情发生
3 如果不勾上面的,而是手填下面的,0,1024,抽样没的超范围的。
4 勾选上面的Use on-chip Xram,同时下边填个错值,256,1024。不会出错。看来以上面勾选的优先。
5 不勾选上面的 Use on-chip Xram,同时下边填个错值,256,1024。会出错。因为地址范围填错了。(我竟然晕晕的认为XRAM地址从256开始的。)
谢谢落叶的提示。

如果data在紧凑的情况下的用量不超过256,是不是不会存在因中断、堆栈而导致溢出?
flywater
3楼-- · 2020-01-24 18:03
回复【5楼】zhanliana
...
另外,如果我写的某个程序占用data达到256字节,会不会由于中断和堆栈等导致溢出?(排除编译器欺骗我的情况下),嘿嘿
-----------------------------------------------------------------------

报歉,刚才在忙,没看到还有一问
如果你有函数调用,要压栈出栈,肯定会导致溢出,这个值也不要全看编译器给显示,有水分,包括FLASH也是如此(如果用到绝对定位会更明显)。
aaa1982
4楼-- · 2020-01-24 23:23
回复【7楼】flywater  落叶
-----------------------------------------------------------------------

我从来没有设置过,从来都是用多少xdata基本上就是多大的范围,都是从0x0000开始的,连续的。

真还没碰到过这种情况。

而且keil编译链接的过程不会像动态内存分配似的还会产生碎片吧。

aaa1982
flywater
5楼-- · 2020-01-25 03:15
可以找个小程序试试:

Build target 'Target 1'
compiling Ctest2.c...
linking...
Program Size: data=232.0 xdata=0 code=1962
"CTest1" - 0 Error(s), 0 Warning(s).

按说DATA只占232个字节,不应该会有问题

(原文件名:1.JPG)
但SP已在0xfe处了再看下面执行完函数返回后的SP到哪了?

(原文件名:2.JPG)
此时程序已飞了....
zhanliana
6楼-- · 2020-01-25 08:34
 精彩回答 2  元偷偷看……

一周热门 更多>