我什么时候使用xdata?

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

static unsigned char xdata PatternSize;

而有时则省略xdata关键字。

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

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

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

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

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

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

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

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

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

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

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

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

 char *ptr; 

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

 char xdata *data ptr; 

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

 char data * data ptr; 

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

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

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

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

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