【问题标题】:RAM & ROM memory segmentsRAM & ROM 内存段
【发布时间】:2018-04-08 06:54:35
【问题描述】:

有.bss、.text、.data、.rodata、....等不同的内存段

我不知道它们中的哪些位于 RAM 中,哪些位于 FLASH 存储器中,许多消息来源在 (RAM 和 ROM) 存储器的两个部分中都提到了它们。

请提供对 RAM 和闪存的内存段的公平解释。

ATMEL 工作室编译器
ATMEGA 32 平台

【问题讨论】:

  • ATMEL工作室编译器ATMEGA 32平台
  • 如果我使用 diff 编译器或平台会有什么不同吗?
  • @MohamedMoustafa 是的,它有很大的不同。有些平台根本不将任何 ROM 映射到进程内存空间。
  • Atmel Studio compiler - 它不存在。 Atmel studio IDE & gcc 编译器是的。我认为现在对你来说这个话题太复杂了。在数百篇文章中都有解释——如果你不理解它们——意味着它还为时过早。如果您需要深入了解 C 语言、链接器脚本、启动代码和目标硬件,则可以使用。现在只需要记住 - 未初始化的静态变量会被清零,自动不会。
  • 这里有各种各样的问题,但具体到哈佛建筑垃圾。

标签: c memory embedded ram rom


【解决方案1】:

它们位于您项目的链接描述文件定义的任何位置。

一些目标在 ROM 中定位并执行代码,而其他目标可能会在启动时将代码从 ROM 复制到 RAM 并从 RAM 执行 - 通常是出于性能原因在更快的处理器上。因此 .text 和 .rodata 可能位于 R/W 或 R/O 内存中。但是 .bss 和 .data 根据定义不能位于 R/O 内存中。

【讨论】:

  • 非常感谢您的回答帮助我开始理解这个问题,是否有任何参考或文档可供阅读以更深入地理解这个主题?
  • @MohamedMoustafa :链接器/编译器的文档和目标平台的参考手册/数据表。
【解决方案2】:

希望您了解这些部分名称的典型用途。 .text 是代码,.rodata 是只读数据,.data 是非零读/写数据(例如在编译时已初始化的全局变量),.bss 读/写数据假定为零,未初始化。 (未初始化的全局变量)。

所以 .text 和 .rodata 是只读的,因此它们可以在闪存或 ram 中并在那里使用。 .data 和 .bss 是读/写的,因此它们需要在 ram 中使用,但是为了将该信息放入 ram 中,它必须在电源关闭时位于非易失性位置,然后复制到 ram。因此,在微控制器中,.data 信息将存在于闪存中,引导代码需要将该数据复制到 ram 中代码期望找到它的位置。对于 .bss,您不需要所有这些零,您只需要起始地址和字节数,并且引导程序可以将该内存归零。

所以他们都可以/确实住在这两个地方。但典型的用例是只读的用在闪存中,读/写用在内存中。

【讨论】:

    【解决方案3】:

    ROM 无法写入,但 RAM 可以写入。 ROM 保存(BIOS)基本输入/输出系统,但 RAM 保存正在运行的程序和使用的数据。 ROM 比 RAM 小得多。 ROM 是非易失性(永久),但 RAM 是易失性的。

    【讨论】:

      猜你喜欢
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 2015-04-01
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多