STM32H723ZGT6-修改内存分布以定义很大的数组
文章目录
- 问题情境
- 解决方案
问题情境
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_regionER_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 内存可用。