【问题标题】:Cortex-M3 External RAM RegionCortex-M3 外部 RAM 区域
【发布时间】:2021-09-16 04:35:53
【问题描述】:

我目前正在研究诸如 RAM/ROM/Stack/Heap 和数据段等主题。 我正在查看 ARM Cortex-M3 内存映射并看到标有“外部 RAM”的区域。

根据随机Cortex-M3 STM32 MCU的data sheet,外部RAM区域从0x60000000-0x9FFFFFFF映射,所以它相当大!

我找不到关于该区域实际使用方式的明确答案。

我想你会有一个外部SRAM,你会在两个选项之间进行选择。

  • (1) 通过 SPI 接口读取并放入本地缓冲区(堆栈),然后将该本地缓冲区加载到外部 ram 区域。这个选项似乎有很多负面后果,例如如果请求的数据非常大,会占用 CPU 并临时增加堆栈。
  • (2) 利用 DMA 并从 SPI 接口传输到外部 ram 区域。

现在我就想不通了,为什么要把数据映射到这个特定的地址范围,有什么好处,为什么不直接把数据放到那个巨大的内存区域呢?

现在我问这个问题是因为我有一种轻微的感觉,我完全错过了外部 RAM 区域的真正含义。

-编辑- 在链接到 STM32 器件的数据手册中,存储区域“外部 RAM”被标记为保留。我的结论是 ARM 列出的内存区域显示了 32 位 MCU 的全部潜力,因为我错误地指出外部 RAM 区域“非常大!”并不一定意味着这是该区域的“真实”大小,即使使用它,也取决于供应商在 MCU 硬件中可以实现的物理性能,我想他们会限制硬件能力以在价格、功率方面具有竞争力消费等

【问题讨论】:

  • 我不明白这个问题。 “该区域的实际使用方式”取决于您。并不是有一个操作系统可以为您决定这一点。可能因为这种误解,这两个选项也没有意义。此外,链接的数据表甚至没有提到“外部 RAM”。
  • AFAIK,有一些用于外部存储器的标准接口,您的 uC 需要特定的硬件来支持它们。一旦在初始化期间正确配置,您就可以像访问内部内存位置一样访问它们,该过程对用户变得透明。
  • @MSalters 我假设不同的供应商会遵循这种布局developer.arm.com/documentation/dui0552/a/…
  • @Sorenp:嗯,这也描述了一个 512 MB 的嵌入式 SRAM 区域,这比您的设备实际拥有的 20 kB 多 25000 倍。 Linus Torvalds 理所当然地抱怨 ARM 缺乏标准化。两个 CPU 被称为“ARM”这一事实主要意味着两个制造商向 ARM,Ltd 支付版税,这并不意味着这两个 CPU 在任何方面都兼容,当然也不是我们对 PC 的期望。
  • @MSalters 好的,我实际上认为这是 CMSIS 的标准格式 :) 很高兴知道,谢谢!既然您提到了,在我所知道的任何设备中,SRAM 绝对不是 512 MB。我认为 arm 显示的内存映射是 32 位系统 0x0000 0000 - 0xFFFF FFFF 的全部潜力。这样特定区域被定义为一些基地址 + 比如说 20kB 或在小型 MCU 上物理上可能的任何东西。

标签: embedded stm32 cortex-m3 memory-mapping


【解决方案1】:

我想你会有一个外部 [SRAM][3] 并且你会选择 在两个选项之间。

  • (1) 通过 SPI 接口读取并放入本地缓冲区(堆栈),然后将该本地缓冲区加载到外部 ram 区域。这个选项 似乎有很多负面后果,例如占用CPU 如果请求的数据非常多,则临时增加堆栈 大。
  • (2) 利用 DMA 并从 SPI 接口传输到外部 ram 区域。

以上都不是。 SPI 总线上的外部存储器不是存储器映射的。如果你有一个 SPI 内存,它不会映射到那个区域,它只是一个 SPI 设备,而“地址”只是从内存设备本身开始的偏移量。具有 Quad 或 Octo-SPI 控制器的 MCU 是内存映射的。 QSPI RAM 并不常见且相对昂贵。 QSPI 更常用于闪存。

外部存储器区域可由带有 FSMC(灵活 静态内存控制器)或 FMC(灵活内存控制器),或提及 QPSI 接口。后者是 FMC SDRAM,通常在高端部件上可用。除了 QSPI 和 NAND 闪存之外,这些接口还需要使用 GPIO EMIF(外部存储器接口)替代功能来创建地址和数据总线。因此,它通常需要具有高引脚数的部件来容纳。 EMIF 可配置为 8、16 或 32 位数据总线,以减少引脚数(并降低访问速度)。

现在我不明白,为什么要将数据映射到这个特定的 地址范围,有什么优势,你为什么不把 数据直接在那个巨大的内存区域中?

由于它是由您之前的误解引起的,这个问题可能是多余的,但是内存映射中存在的内存可用于存储作为常规变量访问的数据,而不是从内部缓冲区传输到执行区 - 代码可以加载到此类内存并直接从此类内存中执行。

现在我问这个问题是因为我有一种轻微的感觉,我完全忽略了外部 RAM 区域的真正含义。

自我意识是一种技能。这被称为有意识的无能,是学习的动力。

我的结论是 ARM 列出的内存区域显示了 32 位 MCU 的全部潜力,因为我错误地指出外部 RAM 区域“非常大!”并不一定意味着这是该区域的“真实”大小,即使使用它,也取决于供应商在 MCU 硬件中可以实现的物理性能,我想他们会限制硬件能力以在价格、功率方面具有竞争力消费等

不,这主要与地址总线可用的引脚数量有关(QSPI 除外)。外部存储器是电路板设计的问题 - 这不是 MCU 供应商决定必须存在的东西。约束是最大,而不是要求的物理内存量。 STM32 FMC 支持以下内存大小/类型:

例如,您最多可以拥有 512Mb 的 SDRAM。静态存储器 (NOR/PSRAM/SRAM) 的可用空间比此类存储器的典型大小要大得多。

【讨论】:

  • 感谢您的详细回答,我将阅读有关 FSMC 和 QSPI 的内容:) 并清理我在“外部 RAM”上的笔记。
  • 值得注意的是,外部存储器通常比它的价值要麻烦得多。它不仅会增加您的 BoM 成本,而且还难以排除故障并容易受到 EMC 的影响。外部总线接口散发出 1990 年代设计的味道。在现代嵌入式系统中内存不足时,正确的解决方案是选择具有更多片上内存的部件。使用外部总线可能有特殊要求,但“我需要更多内存”不应成为使用外部总线的理由。
  • @Lundin Advice 发给 OP 不属于这个问题。这与此答案无关。
猜你喜欢
  • 2014-06-18
  • 2011-03-03
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2014-06-08
相关资源
最近更新 更多