打印
[51单片机]

xdata 储存问题

[复制链接]
4800|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
两只岸上的鱼|  楼主 | 2016-9-19 09:58 | 只看该作者
补充:
在有些代码中看到,没有外扩RAM器件。也有出现xdata 定义变量,如何正确的去理解这个xdata定义?

使用特权

评论回复
板凳
popeye021| | 2016-9-19 10:22 | 只看该作者
xdata与data的区别是访问方式的不同。简单一点理解是访问速度不同。片内也有可能是xdata的访问方式。汇编指令上能看出不一样。

使用特权

评论回复
地板
popeye021| | 2016-9-19 10:23 | 只看该作者
印象里汇编一个是mov,一个是movx

使用特权

评论回复
5
datouyuan| | 2016-9-19 10:24 | 只看该作者
问题1:
你理解是对的.

问题2:
我没用过C8051F340.
一般那4KB是用xdata定义变量.具体看规格书.


补充:
1.虽没有外扩RAM,但有可能外扩AD,或其它使用数据地址总线的器件.
2.有些增强型51内部超出256要用xdata定义.

使用特权

评论回复
6
ningling_21| | 2016-9-19 15:02 | 只看该作者
两只岸上的鱼 发表于 2016-9-19 09:58
补充:
在有些代码中看到,没有外扩RAM器件。也有出现xdata 定义变量,如何正确的去理解这个xdata定义? ...

第一条理解正确
c8051f340芯片中256字节位于传统理解的片内,其余4K的RAM也位于“”片内“(指芯片内部),但必须用xdata 访问,因为其位于扩展的RAM区

使用特权

评论回复
7
两只岸上的鱼|  楼主 | 2016-9-19 16:02 | 只看该作者
本帖最后由 两只岸上的鱼 于 2016-9-19 16:11 编辑
ningling_21 发表于 2016-9-19 15:02
第一条理解正确
c8051f340芯片中256字节位于传统理解的片内,其余4K的RAM也位于“”片内“(指芯片内部) ...

C8051F340
256字节可定义变量为  uchar data x;
4K          定义变量为  uchar xdata x;

那么如果是外接RAM器件,是不是只能用于数据的存取,而不能用来定义变量?
uchar xdata x,y;
RAM_cs = 0;
xdata[0x0001] = x;   //在外接器件RAM存数据
y = xdata[0x0001];   //在外接器件RAM取数据

或者是否可以这样定义
#define x   xdata[0x0001]


谢大牛帮我屡屡

使用特权

评论回复
8
两只岸上的鱼|  楼主 | 2016-9-19 16:12 | 只看该作者
两只岸上的鱼 发表于 2016-9-19 16:02
C8051F340
256字节可定义变量为  uchar data x;
4K          定义变量为  uchar xdata x;

补充:外接RAM器件必须要带地址才能访问?   例如:xdata[0x0000]
而uchar xdata x  只能是在芯片内部的xdata 是无法访问到外部器件的RAM的  ??

使用特权

评论回复
9
ningling_21| | 2016-9-19 16:21 | 只看该作者
两只岸上的鱼 发表于 2016-9-19 16:02
C8051F340
256字节可定义变量为  uchar data x;
4K          定义变量为  uchar xdata x;

外接的RAM所在的范围也是在片外,肯定可以定义变量一样加xdata 就可以使用

使用特权

评论回复
10
两只岸上的鱼|  楼主 | 2016-9-19 16:41 | 只看该作者
ningling_21 发表于 2016-9-19 16:21
外接的RAM所在的范围也是在片外,肯定可以定义变量一样加xdata 就可以使用 ...

外接的RAM 是要带地址才能访问到??

使用特权

评论回复
11
ningling_21| | 2016-9-19 16:59 | 只看该作者
两只岸上的鱼 发表于 2016-9-19 16:41
外接的RAM 是要带地址才能访问到??
外接的RAM不需要带具体地址访问
但外接的RAM和芯片内部的片外RAM的地址范围你需要搞清楚,否则就会造成数据覆盖,具体地址确定需参考芯片资料手册

使用特权

评论回复
12
datouyuan| | 2016-9-19 17:09 | 只看该作者
两只岸上的鱼 发表于 2016-9-19 16:02
C8051F340
256字节可定义变量为  uchar data x;
4K          定义变量为  uchar xdata x;

定于变量时指定地址即可.
uchar xdata xR _at_ 0x0001;

xR=x;   //在外接器件RAM存数据
y=xR;  //在外接器件RAM取数据

使用特权

评论回复
13
两只岸上的鱼|  楼主 | 2016-9-19 18:49 | 只看该作者
ningling_21 发表于 2016-9-19 16:59
外接的RAM不需要带具体地址访问
但外接的RAM和芯片内部的片外RAM的地址范围你需要搞清楚,否则就会造成数据 ...

有点明白了,芯片内部的xdata  与 外接的RAM  xdata   是有共同部分的
比如:C8051F340  有4K  如果外接了RAM芯片    那么这个前4K数据  很有可能产生覆盖。

谢版主细心教导

使用特权

评论回复
14
两只岸上的鱼|  楼主 | 2016-9-19 18:58 | 只看该作者
datouyuan 发表于 2016-9-19 17:09
定于变量时指定地址即可.
uchar xdata xR _at_ 0x0001;

如果我需要使用到外接RAM的  0x0010   
为了避免覆盖情况 要这样定义吗 uchar xdata xR _at_ 0x0010;

#define xR   XBYTE[0x0010]  这样定义是不是不可行啊

使用特权

评论回复
15
datouyuan| | 2016-9-19 19:14 | 只看该作者
两只岸上的鱼 发表于 2016-9-19 18:49
有点明白了,芯片内部的xdata  与 外接的RAM  xdata   是有共同部分的
比如:C8051F340  有4K  如果外接 ...
C8051F340  有4K  如果外接了RAM芯片    那么这个前4K数据  很有可能产生覆盖。
有覆盖的情况mcu只能让你使用其中之一,具体使用哪个,这要看规格书.

你把外接RAM的地址和C8051F340 内部的ram不一样,就不会有覆盖了.











使用特权

评论回复
16
两只岸上的鱼|  楼主 | 2016-9-19 19:20 | 只看该作者
datouyuan 发表于 2016-9-19 19:14
有覆盖的情况mcu只能让你使用其中之一,具体使用哪个,这要看规格书.

你把外接RAM的地址和[/b ...

现在有个问题MCU与FPGA对接,FPGA就当外部RAM使用,因管脚不够,所以mcu地址线只拉了8根,只有256个字节   

在mcu定义xdata变量时,怕会出现与这个外部RAM 覆盖情况
有没有什么好办法能避免这个问题

使用特权

评论回复
17
datouyuan| | 2016-9-19 19:20 | 只看该作者
两只岸上的鱼 发表于 2016-9-19 18:58
如果我需要使用到外接RAM的  0x0010   
为了避免覆盖情况 要这样定义吗 uchar xdata xR _at_ 0x0010;

#define xR   XBYTE[0x0010]

uchar xdata xR _at_ 0x0010;

这2个应该都可以,有点细微区别.

我倾向使用_at_ ,这样更灵活,使用和别的变量没区别.

uchar xdata xR_buf[256] _at_ 0x0000;

xR_buf[10]应该就是XBYTE[0x0010]

使用特权

评论回复
18
两只岸上的鱼|  楼主 | 2016-9-19 19:26 | 只看该作者
datouyuan 发表于 2016-9-19 19:20
#define xR   XBYTE[0x0010]

uchar xdata xR _at_ 0x0010;


#define xR   XBYTE[0x0010]
uchar xdata xR _at_ 0x0010;
这样定义后
再定义变量uchar xdata x;  
x变量是不是就没有可能被分配到  0x0010  这个地址中?

使用特权

评论回复
19
datouyuan| | 2016-9-19 19:28 | 只看该作者
两只岸上的鱼 发表于 2016-9-19 19:20
现在有个问题MCU与FPGA对接,FPGA就当外部RAM使用,因管脚不够,所以mcu地址线只拉了8根,只有256个字节  ...

增加1条线,A15当FPGA外部RAM的使能脚.

这样外部ram的地址是0x8000~0x80ff.

内部的地址0x0000~0x00ff和外部就不覆盖了.

使用特权

评论回复
20
两只岸上的鱼|  楼主 | 2016-9-19 19:43 | 只看该作者
datouyuan 发表于 2016-9-19 19:28
增加1条线,A15当FPGA外部RAM的使能脚.

这样外部ram的地址是0x8000~0x80ff.

是否可以 不拉A15   我还是以0x8000~0x80ff 去读写
让FPGA做下处理   只去判断后16位地址。

使用特权

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

本版积分规则

6

主题

38

帖子

0

粉丝