10

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

静态无符号字符 xdata PatternSize;

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

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

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

另外,我知道 static 关键字意味着该变量将在每次调用它定义的函数时保持不变。 static 和 xdata 必须一起使用吗?

4

5 回答 5

9

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

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

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

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

于 2010-01-13T20:28:42.480 回答
6

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

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

至于硬重置(不是电源循环)后外部 RAM 的状态:这取决于硬件设置。复位线是否连接到外部芯片?还有一些芯片在 CPU 芯片中带有 XDATA。再读一遍。一些芯片有一个 8051 CPU 和一些在 IC 内的 XDATA。

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

于 2010-01-11T20:29:46.993 回答
3

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

char *ptr;

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

char xdata *data ptr;

将定义一个存储在 DATA 空间中的两字节指针,但它只能指向 XDATA 空间中的东西。同样地

char data * data ptr;

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

于 2013-06-05T22:02:51.710 回答
1

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

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

于 2010-01-11T19:43:48.243 回答
1

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

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

于 2010-01-11T19:29:35.943 回答