问题情境
L6406E: No space in execution regions with .ANY selector matching
以及L6407E: Sections of aggregate size 0x4e0 bytes could not fit into .ANY selector(s)
是内存分配不足导致的。程序分配的 .bss 和 .data 段(也就是全局变量、静态变量的未初始化和已初始化部分)超出了链接脚本分配给RAM(SRAM、DTCM、AXI SRAM等)的空间。
例如:
No space in execution regions with .ANY selector matching main.o(.bss.max_idxA)
表示 main.o
文件中的 max_idxA
变量找不到足够的RAM空间来放置。
STM32H7系列有多个RAM区域(如 DTCMRAM, SRAM1, SRAM2, AXI_SRAM),如果链接脚本只分配了很小的一个区域,或者分配不合理,就会导致可用RAM不够。
解决方案
在项目里搜索到 .sct 文件。
取消勾选以编辑。
文件内容如下:
LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM2 0x24000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
}
LOAD REGION 大小 1MB
Execution Region 大小 1MB
Read Write 128KB: 数据段和未初始化段(变量、数组等)分配到的内存区域——也就是 AXI SRAM,只分配了 128KB。
解决方法:增大 AXI SRAM 分区。STM32H723 的 AXI SRAM 实际上是512KB(0x80000)。
RW_IRAM2 0x24000000 0x00080000 { ; 512KB AXI SRAM
.ANY (+RW +ZI)
}
这样就有 512KB 内存可用。