我什么时候使用xdata?

PIC*_*ain 8 c embedded memory-management 8051 flash-memory

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

static unsigned char xdata PatternSize;

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

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

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

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

Cli*_*ord 7

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

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

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

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


Rob*_*ert 5

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

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

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

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