c – STM32板的RAM,堆和堆栈存储器

前端之家收集整理的这篇文章主要介绍了c – STM32板的RAM,堆和堆栈存储器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个需要至少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,ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

但是,我正在尝试将相机和LCD屏幕功能集成到此SDK中,当我这样做时,至少会调出LCD屏幕的堆栈和堆的最高值如下所示.任何高于此值且LCD屏幕保持黑色且应用程序似乎不运行.

Stack_Size      EQU     0x00004000

            AREA    STACK,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,ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

我需要在第二个代码示例中使用堆栈和堆的大小来匹配第一个代码示例中的大小,这样我就不会因为没有可用内存而陷入硬故障异常循环.为什么增加堆大小会使我的项目变得更糟?这意味着当我增加堆大小时,它甚至不会出现?

我附上了项目选项的屏幕截图,以便您可以看到RAM的配置.

以下是我的内存量.这不是说我有2 MB的RAM吗?

8 M x​​ 32位SDRAM连接到STM32F439NIH6 FMC的SDRAM Bank1
接口.

1 Mbit x 16 SRAM连接到bank1 NOR /
FMC接口的PSRAM2均为8位
BLN0& amp; 16允许16位访问. BLN1连接到BLE& SRAM的BHE
分别.

解决方法

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

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

如果你真的需要500 KB或更多的内存,那么你将不得不在你的主板上添加一个外部存储设备,因为微控制器没有那么多内存.

更新:如果您的主板已将内存连接到FMC(灵活内存控制器),那么这是外部或片外内存.但是外部存储器不在0x20000000处寻址.它应该位于0x60000000到0xDFFFFFFF范围内的某个位置(参见数据手册的存储器映射部分).在访问外部存储器之前,您的程序必须适当地配置FMC.并且您应该通过在该选项对话框中启用一个(或多个)片外存储器部分来告诉链接器存在外部存储器.您可以获得有关如何从电路板设计人员启用片外存储器的详细信息和建议.

原文链接:https://www.f2er.com/c/239593.html

猜你在找的C&C++相关文章