我什么时候使用xdata?

时间:2010-01-11 18:23:25

标签: c memory-management embedded 8051 flash-memory

我是嵌入式系统编程的新手。我正在使用8051芯片组的设备。我在示例程序中注意到,在定义变量时,有时它们使用关键字xdata。像这样...

static unsigned char xdata PatternSize;

而其他时候省略了xdata关键字。

我的理解是xdata关键字指示编译器将该变量存储在外部闪存中。

在什么情况下我应该使用xdata在外部存储变量?访问这些变量需要更长时间,对吧?使用xdata存储的值在设备硬重置后不会保留吗?

另外,我知道static关键字意味着变量将在每次调用它所定义的函数时持续存在。是否必须同时使用static和xdata?

5 个答案:

答案 0 :(得分:7)

8051架构有三个独立的地址空间,核心RAM使用8位地址,因此最多可达256字节,XDATA是一个16位地址空间(64K字节),具有读/写功能,程序空间为具有执行和只读数据功能的16位地址空间。由于其小的地址范围和与内核的紧密耦合,在代码空间和访问周期方面寻址核心RAM更有效

最初的8051内核具有片上RAM(地址空间为256字节,但有些变体只有实际存储器的一半),而XDATA则指的是片外数据存储器(与程序存储器相对)。然而,大多数现代8051架构设备都具有片上XDATA和程序存储器。

因此,当性能至关重要时,您可能会使用核心内存;对于更大的内存对象,您可能会使用XDATA。但是,在大多数情况下,编译器应该为您做出此决定(请查看编译器的手册,它将详细描述内存的分配方式)。指令集使得在核心存储器中实现堆栈变得高效,而静态和动态分配的数据通常在XDATA中更明智地分配。如果编译器有一个XDATA关键字,那么它将覆盖编译器的策略,并且只应在编译器的策略以某种方式失败时使用,因为它会降低代码的可移植性。

[编辑]还要注意,核心存储器包括一个32字节的位寻址区域,位寻址指令使用一个8位地址进入该区域直接访问各个位。该区域存在于256字节可寻址核心存储器中,因此位和字节都可寻址[/ edit]

答案 1 :(得分:5)

xdata告诉编译器数据存储在外部RAM中,因此它必须使用不同的指令来读写内存而不是内部RAM。

访问外部数据确实需要更长时间。我通常将中断变量放在内部RAM中,将大多数大型数组放在外部RAM中。

关于硬复位(非电源循环)后外部RAM的状态:这取决于硬件设置。复位线是否转到外部芯片?另外一些芯片在CPU芯片内配备了XDATA。再读一遍。有些芯片在IC内部有8051 CPU和一些XDATA。

static和xdata不重叠。 Static告诉编译器如何分配变量(在堆栈上或内存位置)。 Xdata告诉编译器如何获取该变量。 Static还可以将该变量的名称空间限制为该文件。你可以拥有一个xdata静态变量,它只是一个函数的本地变量,并且有一个静态变量,它是函数本地的,但是使用内部RAM。

答案 2 :(得分:3)

尚未提及的一个重点是,因为使用不同的指令来访问不同的存储区域,所以硬件没有统一的“指针”概念。已知在DATA / IDATA空间中的任何地址可以用一个字节的指针唯一地标识;同样地,任何已知在PDATA空间中的地址。已知在CODE空间中的任何地址都可以用双字节指针来标识;同样地,任何已知在XDATA空间中的地址。但是,在许多情况下,像memcpy这样的例程不会事先知道哪些内存空间应该与传入的指针一起使用。为了适应这种情况,8x51编译器通常使用三字节指针类型,可用于访问任何存储空间中的内容(一个字节选择指针应使用哪种类型的指令,其他字节保存该值)。指针声明如:

char *ptr;

将定义一个三字节指针,它可以指向任何内存空间。将声明更改为

char xdata *data ptr;

将定义一个双字节指针,该指针存储在DATA空间中,但只能指向XDATA空间中的内容。同样

char data * data ptr;

将定义一个双字节指针,该指针存储在DATA空间中,但只能指向DATA和IDATA空间中的内容。使用指向已知数据空间的指针的代码将比使用“通用”三字节指针的代码快得多(可能是十倍)。

答案 3 :(得分:1)

如何以及何时使用xData内存区域取决于系统架构。某些系统可能在此地址具有RAM,而其他系统可能具有ROM或Flash。在任何一种情况下,访问都将比访问内部RAM,ROM或Flash慢。

一般来说,大型项目,常量项目和较少使用的项目应该进入xData。关于xData的内容没有标准规则,因为它取决于架构。

答案 4 :(得分:1)

8051具有128字节范围的暂存区“伪寄存器”,(大多数)编译器将其用作声明变量的默认值。但显然这个区域非常小,并且您希望能够将变量放入16位内存地址空间。这就是xdata(即“外部数据”)说明符的用途。放在哪里显然取决于数据是什么以及您打算如何使用它。

基本上,我认为这是错误的问题。在学习如何使用C编译器的8051特定功能之前,您需要先了解CPU架构。