我是嵌入式系统编程的新手。我正在研究使用 8051 芯片组的设备。我在示例程序中注意到,在定义变量时,有时它们会使用关键字 xdata。像这样……
static unsigned char xdata PatternSize;
而其他时候 xdata 关键字被省略。
我的理解是 xdata 关键字指示编译器该变量存储在外部闪存内存中。
在什么情况下我应该用扩展数据在外部存储变量?访问这些变量需要更长的时间,对吧?使用 xdata 存储的值在设备硬重置后不会保留,对吗?
此外,我了解到 static 关键字意味着该变量将在每次调用定义它的函数时持续存在。是否必须将 static 和 xdata 一起使用?
最佳答案
8051架构有3个独立的地址空间,核心RAM使用8位地址,最大可达256字节,XDATA为16位地址空间(64Kbytes),具有读写能力,程序空间为具有执行和只读数据能力的 16 位地址空间。由于其地址范围小且与内核紧耦合,寻址内核RAM在代码空间和访问周期方面效率更高
最初的 8051 内核具有微型片上 RAM(地址空间为 256 字节,但某些变体在实际内存中只有一半),XDATA 指的是片外数据存储器(与程序存储器相对)。然而,大多数现代 8051 架构设备都具有片上 XDATA 和程序存储器。
因此,当性能至关重要时,您可能会使用核心内存,而对于更大的内存对象,您可能会使用 XDATA。然而,在大多数情况下,编译器应该为你做出这个决定(查看你的编译器手册,它会详细描述内存是如何分配的)。指令集使得在核心内存中实现堆栈变得高效,而静态和动态分配的数据通常更明智地分配在 XDATA 中。如果编译器有一个 XDATA 关键字,那么它将覆盖编译器的策略,并且只应在编译器的策略以某种方式失败时使用,因为它会降低代码的可移植性。
[edit] 另请注意,核心存储器包括一个 32 字节的位可寻址区域,位寻址指令使用进入该区域的 8 位地址来直接访问各个位。该区域存在于 256 字节字节可寻址核心内存中,因此位和字节均可寻址[/edit]
关于c - 我什么时候使用扩展数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2043888/