我正在开发一个需要至少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位SDRAM连接到STM32F439NIH6 FMC的SDRAM Bank1 接口
1 Mbit x 16 SRAM连接到bank1 NOR / FMC接口的PSRAM2均为8位 BLN0&amp; amp; 16允许16位访问。 BLN1连接到BLE&amp; SRAM的BHE 分别
答案 0 :(得分:9)
您的STM32F4微控制器物理上没有从地址0x20000000开始的0x200000(2 MB)RAM。我相信它只有0x30000(192 KB)。检查数据表的存储器映射部分。
如果告诉链接器存在不存在的内存,则链接器可能会尝试使用该内存,然后程序将崩溃。我怀疑你的原始程序链接器从未使用过不存在的内存,所以程序运行成功。但是在你的后续程序中,链接器正在尝试使用不存在的内存,程序正在崩溃。查看链接器生成的映射文件,以查看链接器如何将程序的各个部分分配到内存中。您可能会发现第一个程序不使用超出0x20030000的内存,但第二个程序会使用。
如果你真的需要500 KB或更多内存,那么你将不得不在你的主板上添加一个外部存储器设备,因为微控制器没有那么多RAM。
更新:如果您的主板已将内存连接到FMC(灵活内存控制器),那么这是外部或片外内存。但是外部存储器不在0x20000000处寻址。它应该位于0x60000000到0xDFFFFFFF范围内的某个位置(参见数据手册的存储器映射部分)。在访问外部存储器之前,您的程序必须适当地配置FMC。并且您应该通过在该选项对话框中启用一个(或多个)片外存储器部分来告诉链接器存在外部存储器。您可以获得有关如何从电路板设计人员启用片外存储器的详细信息和建议。
答案 1 :(得分:1)
如果您告诉链接器您有2Mb片上ROM和2Mb + 64Kb片上RAM,它会相信您,并愉快地找到相应的代码和数据 - 但是当您访问时不要指望发生任何有用的事情内存不存在!
如果正确设置了内存区域,则超出目标容量时链接器将失败。这是一个物理限制,解决方案不是欺骗链接器 - 只是生成运行时错误而不是构建错误。