一个STM32板的RAM、堆和栈内存是什么?

9

我正在进行一个项目,需要至少使用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的配置。
下面是我拥有的内存量。这难道不意味着我有2MB RAM吗?
8M x 32位SDRAM连接到STM32F439NIH6 FMC的SDRAM Bank1接口。
1 Mbit x 16 SRAM连接到FMC接口的bank1 NOR/PSRAM2,SRAM的BLE & BHE分别连接到BLN0 & BLN1,可以进行8位和16位访问。

请问您能解释一下“最高值至少会使液晶屏幕亮起来”的含义吗?此外,“增加堆大小会让我的项目变得更糟”是什么意思?堆大小似乎已从0x00200000字节减少到0x00002B50字节。您的描述非常不清楚。 - barak manos
是的,它被减少了,因为如果我将其设置为所需的0x00200000值,那么项目就无法运行。 - Dude
0x00200000 是 2097152 字节的堆内存 - 您的控制器甚至没有那么多的内存。对于 STM32 来说,堆和栈的选择是一个重要且困难的任务。您应该考虑需要多少内存,然后将堆栈设置为适当的大小。您还需要确切地知道变量或数组的声明位置。您是否使用操作系统? - clambake
2个回答

10
您的STM32F4微控制器在地址0x20000000开始并没有物理上的2 MB RAM。我认为它只有0x30000(192 KB)。请查看数据表中的内存映射部分。
如果您告诉连接器有不存在的内存可用,那么连接器可能会尝试使用该内存,然后您的程序将崩溃。我怀疑对于您原始的程序,连接器从未使用不存在的内存,因此程序成功运行。但在您的后续程序中,连接器正在尝试使用不存在的内存,因此程序崩溃。查看链接器生成的地图文件,以查看程序的各个部分如何由链接器分配到内存中。您可能会发现,第一个程序不使用超过0x20030000的内存,但第二个程序是这样做的。
如果您真的需要500 KB或更多的内存,则需要向您的板添加外部内存设备,因为微控制器没有那么多RAM。
更新:如果您的板连接了FMC(灵活的存储器控制器)的存储器,则该存储器是外部或片外存储器。但外部存储器的地址不在0x20000000处。它应该位于0x60000000到0xDFFFFFFF范围内(请参阅数据表中的内存映射部分)。在访问外部存储器之前,您的程序将必须适当地配置FMC。并且您应该通过启用选项对话框中的一个(或多个)片外内存部分来告诉连接器存在外部存储器。您可以从板设计者那里获得有关如何启用片外内存的详细信息和建议。

实际上,STM32F4系列的部件从每个ST链接的96KB到256KB的RAM范围内。无论如何,它们中没有一个接近500KB。 - DoxyLover
他们也没有2Mb的IROM。 - Clifford
我的数据表上没有内存映射部分 @kkrambo - Dude
@兄弟,这是STM32F439xx数据手册。请参阅第5章第84页。 - kkrambo

1
如果你告诉链接器,你的部分有2Mb的片上ROM和2Mb + 64Kb的片上RAM,它会相信你,并愉快地定位代码和数据 - 但是当你访问不存在的内存时,不要指望发生任何有用的事情!如果你正确设置了内存区域,当你超出目标容量时,链接器将失败。那是一个物理限制,解决方案不是欺骗链接器 - 那只会生成运行时错误而不是构建错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接