打印

使用STC125A60S2的一些困惑,xdata,idata之惑

[复制链接]
17159|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mackay|  楼主 | 2010-11-4 15:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在做一个项目,现在使用的是STC125A60S2。
现在出现了一个问题:我有不少关键变量声明是xdata类型,问题就出在这样一个地方.
在某个时候,有一个变量不按照我要求去变,比如按照程序的去跑,这个变量的值是1,但它就变出一个0x15.
但更加吐血的是,我把这个变量设为idata类型,就没有这个现象。这个问题伴着我在使用这个芯片,偶尔出现。
我用到的xdata有13K。
如果是程序问题,为何改为idata就没有出现,用了xdata出现。
我之所以怀疑是单片机问题,因为我在测试这个芯片事,片内高于多少的xdata就出问题,具体我忘记了,但绝对不是datasheet里面所写的。
希望能有大侠回答一下。
小弟先谢了。

相关帖子

沙发
chen3bing| | 2010-11-4 15:54 | 只看该作者
可能是用来存储xdata数据类型的数据空间满了。

使用特权

评论回复
板凳
mackay|  楼主 | 2010-11-4 16:01 | 只看该作者
我外接了一个62256,没有满的。原来我在xdata 9K多一点时也出现过,当时比较急,改了之后就没有当一回事,现在又出现了,所以有点郁闷,希望各位兄台能给出点好建议。

使用特权

评论回复
地板
coody| | 2010-11-4 17:07 | 只看该作者
LZ,估计你的外挂RAM速度不够,你可以设置低一点的总线速度就好了,我的产品使用32K~512K的外挂RAM都用过,木有问题滴。。。。

使用特权

评论回复
5
chunyang| | 2010-11-4 17:09 | 只看该作者
如果该MCU带有片内xdata RAM,最好禁止掉,但不能排除是楼主程序本身的问题。

使用特权

评论回复
6
mackay|  楼主 | 2010-11-4 17:14 | 只看该作者
楼上的兄弟,谢谢你的帮忙!
我使用的是UT62256CSCL-70LL.
不知道速度够不够。
每次出现,就出在一个xdata的变量上,但只有一个变量有问题,不是大规模出现,是总线速度问题吗?

使用特权

评论回复
7
jt4117| | 2010-11-4 20:51 | 只看该作者
你定义xdata时用没用到指针。 有没有可能xdata某个地址被重复引用了!! 或者指针乱了。

使用特权

评论回复
8
coody| | 2010-11-4 22:07 | 只看该作者
最简单的方法是测试一下XDATA的读写,这样可以排除7楼说的重复指针操作问题。
如果测试通过,则基本是程序的问题,偶地方访问重叠。如果是速度问题,则不会只出现在一个变量上的。

使用特权

评论回复
9
xlsbz| | 2010-11-5 12:12 | 只看该作者
楼主程序的问题!

使用特权

评论回复
10
gx_huang| | 2010-11-5 12:34 | 只看该作者
同意8L的说法,自己编一个程序,反复读写所有XDATA,看看是否可靠。

使用特权

评论回复
11
coody| | 2010-11-5 12:41 | 只看该作者
对于楼主的问题,我特别详细的测试了我的板,STC12LE5A60S2和STC12C5A60S2,外挂32K的62256,3V和5V都测试了,跑33MHZ,没有发现问题,将原来的一个WAV播放程序的缓冲放到外挂RAM上,缓冲开到24K,从SD卡读WAV文件送DAC,采样22.05KHZ,立体声,情绪稳定

使用特权

评论回复
12
武当派掌门| | 2010-11-5 14:43 | 只看该作者
楼主的问题按照叙述极有可能是数组下标越界产生的错误。
检查程序中所有给数组赋值的语句,或者是给指针赋值的语句是否出现越界情况。

使用特权

评论回复
13
mackay|  楼主 | 2010-11-6 11:27 | 只看该作者
这个变量不是定义如下:
extern uchar xdata Order0Len;
如果定义为 idata或者data,这个数就没有问题。
这个变量在两个地方引用,在串口中断中自加,作为串口收到字节数的计数器,main函数的大循环里面,查询这个数是否不为0,如果不为0,就进去自减,但是问题就出现在这。如果这个数定义为xdata类型,我串口里面多发几个字节,查询这个变量是,这个变量的值在某个时候,就会跳到一个比较大的数值。比如0x15等,我确信我没有发那么多个字节,我后来查询我的串口缓冲区时,发现也没有那么字节。后来我查几天程序后,将这个变量改为idata类型,程序跑了几天也没有出现这个问题。如果是程序逻辑问题,我就想不明白了,我也在怀疑是不是定义这个变量为xdata时,这个变量所在的绝对地址里面的数(请原谅我这样称呼它)给某个指针改变了。但如果是这样,怎么查?如果遇到指针自加,我是有判断这个指针的边界的。缓冲区我也有做判断,不让其溢出。但现在关键是:我改为idata,就没有出现这个问题,只出现在这个数为xdata类型的情况下。
我先真心的谢谢各位弟兄,你们的建议我都在一个个去试了。

使用特权

评论回复
14
mackay|  楼主 | 2010-11-6 11:28 | 只看该作者
这个变量是定义如下:(之前这里写错了)
extern uchar xdata Order0Len;
如果定义为 idata或者data,这个数就没有问题。
这个变量在两个地方引用,在串口中断中自加,作为串口收到字节数的计数器,main函数的大循环里面,查询这个数是否不为0,如果不为0,就进去自减,但是问题就出现在这。如果这个数定义为xdata类型,我串口里面多发几个字节,查询这个变量是,这个变量的值在某个时候,就会跳到一个比较大的数值。比如0x15等,我确信我没有发那么多个字节,我后来查询我的串口缓冲区时,发现也没有那么字节。后来我查几天程序后,将这个变量改为idata类型,程序跑了几天也没有出现这个问题。如果是程序逻辑问题,我就想不明白了,我也在怀疑是不是定义这个变量为xdata时,这个变量所在的绝对地址里面的数(请原谅我这样称呼它)给某个指针改变了。但如果是这样,怎么查?如果遇到指针自加,我是有判断这个指针的边界的。缓冲区我也有做判断,不让其溢出。但现在关键是:我改为idata,就没有出现这个问题,只出现在这个数为xdata类型的情况下。
我先真心的谢谢各位弟兄,你们的建议我都在一个个去试了。

使用特权

评论回复
15
jack821119| | 2010-11-12 09:35 | 只看该作者
62256的某个地址空间有问题,你可以将extern uchar xdata Order0Len;
变量进行绝对地址定义,应该就不会出现这问题了

使用特权

评论回复
16
cahu| | 2010-11-12 15:47 | 只看该作者
仔细研读

使用特权

评论回复
17
steno| | 2012-2-13 11:32 | 只看该作者
我也碰到这样的问题,至今还没查出问题,怎么办?

使用特权

评论回复
18
原野之狼| | 2012-2-13 11:41 | 只看该作者
1  外扩的片子的各种电气参数、时序参数按照要求来做。
2  检查程序的问题。
3  片内的XRAM和片外的XRAM之间的关系,看看MCU手册上怎么写的,是否可以同时工作,或者如何设置使能。
4  对于外扩的XRAM器件,可以先遍历检查所有存储空间,然后再跑用户程序。

使用特权

评论回复
19
潇洒哥1号| | 2012-2-13 15:12 | 只看该作者
5# chunyang

似乎没有问题吧?有根据吗?片内的xdata RAM最好禁掉?我用过mentor 51核的没有问题;

使用特权

评论回复
20
syle| | 2012-7-24 15:19 | 只看该作者
检查下 是否没有使能扩展RAM
AUXR &= 0xfd; //允许访问内部EXT_RAM;

使用特权

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

本版积分规则

5

主题

15

帖子

0

粉丝