打印
[51单片机]

STC89C52RC XDATA中uchar二维数组初始化

[复制链接]
1858|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
broadbj|  楼主 | 2016-11-24 13:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学习12864,计划用uchar二位数组,在xdata中开辟一个1k缓存的,这是背景。

所以在XDATA区定义了uchar数组:lcdbuf[32][32],初始化时用2个for循环清空元素值。
程序编译通过,下载到单片机,不报错。

但通过液晶实际写入时发现,lcdbuf[8][0]之前的内容可以被初始化,但其以及之后的数组内容都是0XFF。
也就是话,初始化程序跑完了,但只清空了256(8*32)个字节的元素。

另外测试了一下,程序中,如果单独对lcdbuf[8][0]或之后的元素赋值,还是可以做到的。

不知道是什么原因呢?

相关帖子

沙发
ningling_21| | 2016-11-24 13:53 | 只看该作者
先测试一下XDATA 是否正常

使用特权

评论回复
板凳
broadbj|  楼主 | 2016-11-24 14:11 | 只看该作者
ningling_21:
根据提示做了下面的测试:
1 增加一个lcdbuf0[8][32],在原有二位数组之前定义。目的是让它占掉xdata中前256字节。
2 修改lcdbuf[32][32]为lcdbuf[24][32],保持xdata中总字节数不变。

最终测试结果:
新增的lcdbuf0(xdata中前256字节),全部初始化成功;
修改的lcdbuf(xdata中257~1024字节),全部不成功,全为0XFF。

这样代表什么意思呢?

使用特权

评论回复
地板
broadbj|  楼主 | 2016-11-24 14:13 | 只看该作者
追加说明一点:
使用2个for循环,给二位数组赋值,是上述的结果;
但程序中使用单独的一条语句,给某一个元素赋值,都是可以成功的。

比较困惑。

使用特权

评论回复
5
ningling_21| | 2016-11-24 14:36 | 只看该作者
broadbj 发表于 2016-11-24 14:11
ningling_21:
根据提示做了下面的测试:
1 增加一个lcdbuf0[8][32],在原有二位数组之前定义。目的是让它占 ...

部分 xdata 不能正常使用

使用特权

评论回复
6
broadbj|  楼主 | 2016-11-24 14:40 | 只看该作者
ningling_21 发表于 2016-11-24 13:53
先测试一下XDATA 是否正常

最后的测试发现问题集中在这个地方:

循环里给数组赋值,不可以;单独语句复制,可以。
NG:for (m=0;m<1;m++){lcdbuf[0][m]=0xAA;}
OK:lcdbuf[0][0]=0xAA;

但不知道怎么解决。

使用特权

评论回复
7
broadbj|  楼主 | 2016-11-24 15:28 | 只看该作者
ningling_21 发表于 2016-11-24 14:36
部分 xdata 不能正常使用

那就是单片机硬件问题了吧

使用特权

评论回复
8
ningling_21| | 2016-11-24 16:04 | 只看该作者
broadbj 发表于 2016-11-24 15:28
那就是单片机硬件问题了吧

可以致电STC客服咨询

使用特权

评论回复
9
broadbj|  楼主 | 2016-11-24 21:59 | 只看该作者
ningling_21 发表于 2016-11-24 16:04
可以致电STC客服咨询

ningling_21,谢谢您的回复。
手头有两片,换了另外一片也是一样的结果,是否硬件再说吧。

现在疑问的地方是下面语句执行时,同样的两句,结果却不同,还请您帮忙看一看,
谢谢了!
这句无法给元素赋值:for (m=0;m<1;m++){lcdbuf[0][m]=0xAA;}   
这句可以赋值:lcdbuf[0][0]=0xAA;
不知原因是什么。

使用特权

评论回复
10
whtwhtw| | 2016-11-25 08:14 | 只看该作者
用volatile定义变量m试试

使用特权

评论回复
11
broadbj|  楼主 | 2016-11-29 11:24 | 只看该作者
whtwhtw 发表于 2016-11-25 08:14
用volatile定义变量m试试

whtwhtw,谢谢!

使用你说的变量类型测试了,仍然无法通过For循环赋值。

使用特权

评论回复
12
a343731655| | 2020-1-7 11:30 | 只看该作者
89C52 首先只有256B的RAM,他能使用XDATA,也就是可以使用片外RAM,但是如果你没有装这个片外的RAM芯片的话。。。这时你用XDATA声明变量,有两种情况
1.如果配置界面-target界面,你勾选了 use  On-chip XRAM,你再编译,由于没有片外RAM,所以超出空间,编译应该报错。
2.你没勾选,他实际用的还是片内RAM。或是程序空间ROM。。

使用特权

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

本版积分规则

1

主题

8

帖子

0

粉丝