Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STM32板的RAM、堆和堆栈内存_C++_Embedded_Stm32_Keil - Fatal编程技术网

C++ STM32板的RAM、堆和堆栈内存

C++ STM32板的RAM、堆和堆栈内存,c++,embedded,stm32,keil,C++,Embedded,Stm32,Keil,我正在做一个至少需要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

我正在做一个至少需要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
堆栈大小等于0x00004000
区域堆栈,NOINIT,读写,对齐=3
堆栈\内存空间堆栈\大小
__初始值
;  堆配置
;     堆大小(字节)
; 
堆大小等于0x00200000
面积堆,NOINIT,读写,对齐=3
__堆底
堆内存空间堆大小
__堆极限
但是,我正在尝试将摄像头和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
堆栈大小等于0x00004000
区域堆栈,NOINIT,读写,对齐=3
堆栈\内存空间堆栈\大小
__初始值
;  堆配置
;     堆大小(字节)
; 
堆大小等于0x00002B50
面积堆,NOINIT,读写,对齐=3
__堆底
堆内存空间堆大小
__堆极限
我需要第二个代码示例中堆栈和堆的大小与第一个代码示例中的大小匹配,这样我就不会因为没有可用内存而陷入硬故障异常循环。为什么增加堆大小会使我的项目变得更糟?这意味着,当我增加堆大小时,它为什么看起来甚至没有运行

我附上了我的项目选项的屏幕截图,这样你可以看到RAM的配置

下面是我的记忆量。这不意味着我有2MB的内存吗

8 M x 32位SDRAM连接到STM32F439NIH6 FMC的SDRAM组1 接口

1 Mbit x 16 SRAM连接到气缸组1 NOR/ FMC接口的PSRAM2和两个8位 连接到SRAM的BLE和BHE的BLN0和BLN1允许16位访问
分别。

您的STM32F4微控制器没有从地址0x20000000开始的0x200000(2MB)RAM。我相信它只有0x30000(192KB)。检查数据表的内存映射部分

如果您告诉链接器没有可用内存,那么链接器可能会尝试使用该内存,然后您的程序将崩溃。我怀疑对于您的原始程序,链接器从未使用过不存在的内存,因此程序成功运行。但是在随后的程序中,链接器试图使用不存在的内存,程序正在崩溃。查看链接器生成的映射文件,查看链接器如何将程序的各个部分分配到内存中。您可能会发现第一个程序不使用0x20030000以外的内存,但第二个程序使用

如果你真的需要500 KB或更多的内存,那么你必须在你的电路板上添加一个外部内存设备,因为微控制器没有那么多RAM


更新:如果您的板上有连接到FMC(柔性内存控制器)的内存,则该内存为外部或片外内存。但外部存储器的地址不是0x20000000。它应该位于0x60000000到0xDFFFFF的范围内(参见数据表的内存映射部分)。在访问外部存储器之前,您的程序必须正确配置FMC。您可能应该通过在“选项”对话框中启用一个(或多个)片外内存部分来告诉链接器外部内存存在。你可能会从board designer那里得到关于如何启用片外内存的详细信息和建议。

如果你告诉链接器你有2Mb的片上ROM和2Mb+64Kb的片上RAM,它会相信你,并愉快地找到相应的代码和数据-但不要期望在访问不存在的内存时发生任何有用的事情


如果您正确设置了内存区域,当您超过目标容量时,链接器将失败。这是一个物理限制,解决方案不是欺骗链接器-这只会生成运行时错误而不是生成错误。

请您解释一下“至少会显示LCD屏幕的最高值”好吗?此外,您所说的“增加堆大小使我的项目更糟”是什么意思?堆大小似乎已从0x00200000字节减少到0x00002B50字节。您的描述非常不清楚。是的,它被减少了,因为如果我将其设置为所需的0x00200000值,则项目不会运行。0x00200000是2097152字节的堆-您的控制器甚至没有那么多内存。堆和堆栈选择是STM32的一项重要而困难的任务。您应该考虑需要多少内存,然后将堆栈和堆设置为适当的大小。您还必须明确知道变量或数组的声明位置。您使用操作系统吗?实际上,STM32F4系列部件的内存范围从96KB到256KB不等。在任何情况下,它们都不接近500KB。它们也没有2Mb的IROM。我的数据表上没有内存映射部分@kkrambo@Dude这是你的电话号码。见第5章,第84页。