c - 我什么时候使用扩展数据?

标签 c memory-management embedded 8051 flash-memory

我是嵌入式系统编程的新手。我正在研究使用 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/

相关文章:

c - c中的字符串自动连接

c - 具有单个参数的 fprintf 宏期望 ')'

c++ - arm-none-eabi-gcc 在 C : undefined references 中使用 C++ 代码

architecture - 如何规划我的软件以避免过度重写和相互依赖

c++ - 在 C 中有效地解析 char 数组

C - 尝试从文件读取结构

廉价而令人愉快的 rand() 替代品

c++ - Vector of Vector 如何在内存中对齐?

c++ - 如何使用符合 STL 的分配器进行异构内存分配

c++ - 临时字符串的内存分配