STM32 板的 RAM、堆和堆栈存储器
Posted
技术标签:
【中文标题】STM32 板的 RAM、堆和堆栈存储器【英文标题】:RAM, Heap, and Stack memory for an STM32 board 【发布时间】:2014-09-15 18:17:16 【问题描述】:我正在处理一个需要至少 500 kB 内存才能使用的项目。我有一个 SDK,此代码定义了堆栈和堆,它工作正常。
Stack_Size EQU 0x00004000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00200000
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
但是,我正在尝试将相机和 LCD 屏幕功能集成到此 SDK 中,当我这样做时,至少会显示 LCD 屏幕的堆栈和堆的最高值如下所示。任何高于此值的值,LCD 屏幕都会保持黑色,并且应用程序似乎无法运行。
Stack_Size EQU 0x00004000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00002B50
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
我需要第二个代码示例中的堆栈和堆大小与第一个代码示例中的大小相匹配,这样我就不会因为没有可用内存而陷入硬故障异常循环。为什么增加堆大小会使我的项目变得更糟?意思是当我增加堆大小时它为什么甚至没有运行?
我附上了我的项目选项的屏幕截图,以便您查看 RAM 的配置。
以下是我拥有的内存量。这是否意味着我有 2 MB 的 RAM?
8 M x 32-bit SDRAM 连接到 STM32F439NIH6 FMC 的 SDRAM Bank1 界面。
1 Mbit x 16 SRAM 连接到 bank1 NOR/ FMC 接口的 PSRAM2 和 8 位 连接到 SRAM 的 BLE 和 BHE 的 BLN0 和 BLN1 允许 16 位访问 分别。
【问题讨论】:
你能解释一下“至少会显示液晶屏的最高值”吗?另外,“增加堆大小使我的项目变得更糟”是什么意思?堆大小似乎已从 0x00200000 字节减少到 0x00002B50 字节。您的描述非常不清楚。 是的,它减少了,因为如果我将其设为所需的 0x00200000 值,则项目不会运行。 0x00200000 是 2097152 字节的堆 - 您的控制器甚至没有那么多内存。堆和栈选择对于 STM32 来说是一项至关重要且艰巨的任务。您应该考虑需要多少内存,然后将堆栈和堆设置为适当的大小。您还肯定需要知道变量或数组的声明位置。您使用操作系统吗? 【参考方案1】:您的 STM32F4 微控制器实际上没有从地址 0x20000000 开始的 0x200000 (2 MB) RAM。我相信它只有 0x30000 (192 KB)。检查数据表的内存映射部分。
如果您告诉链接器没有可用的内存,那么链接器可能会尝试使用该内存,然后您的程序将崩溃。我怀疑对于您的原始程序,链接器从未使用过不存在的内存,因此程序成功运行。但是在您随后的程序中,链接器正在尝试使用不存在的内存并且程序正在崩溃。查看链接器生成的映射文件,了解链接器如何将程序的各个部分分配到内存中。您可能会发现第一个程序不使用超过 0x20030000 的内存,但第二个程序使用了。
如果您确实需要 500 KB 或更多的内存,那么您将不得不在您的板上添加一个外部存储设备,因为微控制器没有那么多 RAM。
更新:如果您的主板有连接到 FMC(灵活内存控制器)的内存,那么那是外部或片外内存。但是,外部存储器不在 0x20000000 处寻址。它应该位于 0x60000000 到 0xDFFFFFFF 范围内的某个位置(参见数据表的内存映射部分)。在访问外部存储器之前,您的程序必须正确配置 FMC。您可能应该通过在该选项对话框中启用一个(或多个)片外存储器部分来告诉链接器存在外部存储器。您可能可以从电路板设计人员那里获得有关如何启用片外存储器的详细信息和建议。
【讨论】:
实际上,STM32F4 系列部件的 RAM 范围从 96KB 到 256KB 每ST link。无论如何,它们都没有接近 500KB。 他们也没有 2Mb 的 IROM。 我的数据表上没有内存映射部分@kkrambo @Dude 这是STM32F439xx datasheet。见第 5 章,第 84 页。【参考方案2】:如果您告诉链接器您的部件有 2Mb 片上 ROM 和 2Mb + 64Kb 片上 RAM,它会相信您,并相应地愉快地定位代码和数据 - 但不要指望在您访问时会发生任何有用的事情不存在的记忆!
如果您正确设置了内存区域,当您超出目标的容量时,链接器将失败。这是一个物理限制,解决方案不是对链接器撒谎——链接器只会产生运行时错误而不是构建错误。
【讨论】:
以上是关于STM32 板的 RAM、堆和堆栈存储器的主要内容,如果未能解决你的问题,请参考以下文章