KEIL在Build的时候提示Error:L6406E:No space in execution regions with .ANY selector matching 错误

工程文件在Translate的时候,没有提示错误,但是在Build的时候就会提示L6406E的错误。


可以通过修改

再次Translate和Build


就没有提示错误了。下载也完成了。


Build started: Project: Template *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin' Build target 'Template' linking... ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching arm_cfft_radix4_f32.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching arm_common_tables.o(.constdata). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_adc.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_usart.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_rcc.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_gpio.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching main.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_dma.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching arm_bitreversal.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching system_stm32f10x.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching adc.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching fdiv.o(x$fpl$fdiv). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching dmul.o(x$fpl$dmul). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching usart.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching arm_cmplx_mag_f32.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching fsqrt.o(x$fpl$fsqrt). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching fmul.o(x$fpl$fmul). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching faddsub_clz.o(x$fpl$fsub). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching misc.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching delay.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching faddsub_clz.o(x$fpl$fadd). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching _printf_intcommon.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching arm_cfft_radix4_init_f32.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching dnaninf.o(x$fpl$dnaninf). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching fnaninf.o(x$fpl$fnaninf). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching __printf.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching dfixu.o(x$fpl$dfixu). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching _printf_hex_int.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching led.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching sys_stackheap_outer.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f10x_md.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching ffixu.o(x$fpl$ffixu). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching rand.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching rand.o(.emb_text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching _printf_char_common.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching sqrtf.o(i.sqrtf). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching _printf_hex_int.o(.constdata). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching dflt_clz.o(x$fpl$dfltu). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching fflt_clz.o(x$fpl$ffltu). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching _printf_char_file.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_it.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching noretval__2printf.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching _rserrno.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching exit.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching dretinf.o(x$fpl$dretinf). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching fretinf.o(x$fpl$fretinf). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching __rtentry2.o(.ARM.Collect$$rtentry$$0000000D). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching rt_errno_addr_intlibspace.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching ferror.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching libspace.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching _printf_x.o(.ARM.Collect$$_printf_percent$$0000000C). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching heapauxi.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching rtexit2.o(.ARM.Collect$$rtexit$$00000004). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching libinit2.o(.ARM.Collect$$libinit$$0000000D). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching use_no_semi_2.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching use_no_semi.o(.text). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching libshutdown.o(.ARM.Collect$$libshutdown$$00000000). ..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching usenofp.o(x$fpl$usenofp). ..\OBJ\Template.axf: Error: L6407E: Sections of aggregate size 0x3eb4 bytes could not fit into .ANY selector(s). Not enough information to list image symbols. Not enough information to list load addresses in the image map. Finished: 2 information, 0 warning and 59 error messages. "..\OBJ\Template.axf" - 59 Error(s), 0 Warning(s). Target not created. Build Time Elapsed: 00:00:00
09-27
<think>我们正在解决Keil编译器V5.06 update 7 (build 960)构建项目时出现的L6406E和L6407E错误。这些错误通常与链接阶段的内存分配有关,表明执行区域(如ROM或RAM)没有足够的空间来容纳所有目标文件中的代码和数据。 根据错误信息: - L6406E: 执行区域没有足够空间来容纳某个section。 - L6407E: 多个执行区域的重叠(可能由于分散加载文件配置问题)。 结合引用资料中关于编译器版本不可用的解决方法(虽然问题不同,但环境配置思路可参考),以及内存不足的错误本质,我们提出以下解决步骤: ### 步骤1: 确认ARM编译器版本可用性 虽然用户提到使用的是V5.06 update 7 (build 960),但需确保该编译器在Keil中已正确安装并可用。 - 打开项目,点击工具栏的“Options for Target”图标(或通过Project -> Options for Target)。 - 在“Target”选项卡中,检查“ARM Compiler”下拉菜单,确认选择了正确的编译器版本(如V5.06 update 7 (build 960))。若该版本未出现在列表中,可能需要安装或重新安装该编译器版本[^1][^3]。 - 如果使用的是Keil MDK 5.37或更新版本,默认可能只安装了AC6(Arm Compiler 6),因此需要单独安装AC5(Arm Compiler 5)并配置项目使用它。 ### 步骤2: 优化代码大小 如果确认编译器版本正确,那么错误可能是由于代码量过大导致内存不足。可尝试: 1. **编译器优化选项**: - 在“Options for Target”的“C/C++”选项卡中,将“Optimization”等级调整为更高的优化级别(如-O2或-O3)。这可以减小代码体积。 - 注意:高级优化可能改变程序行为,需测试验证。 2. **移除未使用的代码**: - 检查是否包含了不必要的库文件或源文件,移除未使用的模块。 - 使用编译器的“--remove_unused”功能(在Linker选项卡中设置)。 ### 步骤3: 调整内存布局(分散加载文件) L6407E错误提示多个执行区域重叠,需要检查分散加载文件(scatter file)的配置: 1. 在“Options for Target”的“Linker”选项卡中,确认是否使用了自定义的分散加载文件(scatter file)。如果没有,Keil会使用默认的内存布局,但可能不匹配目标设备的实际内存大小。 2. 根据目标设备的实际内存(ROM和RAM)修改分散加载文件,确保每个执行区域(如ROM_region, RAM_region)的起始地址和大小正确,且没有重叠。 - 例如,GD32F10x系列设备的典型内存布局: ```text LR_IROM1 0x08000000 0x00080000 { ; 加载区域(Flash)起始地址0x08000000,大小512KB ER_IROM1 0x08000000 0x00080000 { ; 执行区域(代码) *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; RAM起始地址0x20000000,大小64KB .ANY (+RW +ZI) } } ``` 3. 如果项目实际代码量超过了默认分配的大小,需要扩大相应区域(如果硬件支持)或优化代码。 ### 步骤4: 检查启动文件栈堆设置 启动文件(如startup_*.s)中定义了栈(Stack)和堆(Heap)的大小。如果这些值设置过大,也会挤占RAM空间。 - 打开启动文件,查找类似如下语句: ```assembly Stack_Size EQU 0x00000400 Heap_Size EQU 0x00000200 ``` - 根据实际需求减小栈或堆的大小(但不要过小,以免运行时溢出)。 ### 步骤5: 检查目标设备配置 在“Options for Target”的“Target”选项卡中: - 确认“Read/Only Memory Areas”和“Read/Write Memory Areas”的设置与芯片手册一致。 - 检查芯片型号选择是否正确(例如GD32F10X_CL)。 ### 步骤6: 更新固件库 如果使用的是旧版固件库(如引用[1]中的GD32F10x_Firmware_Library_V2.2.2),尝试更新到最新版本,可能已优化内存使用。 ### 总结 以上步骤应逐步尝试。通常,步骤3(调整内存布局)和步骤4(调整栈堆大小)是解决L6406E和L6407E错误的关键。如果问题依旧,可能需要更换更大内存的芯片或进一步精简代码。 §§相关问题§§ 1. 如何修改Keil中的分散加载文件? 2. 如何优化嵌入式系统的内存使用? 3. Keil编译器版本不兼容问题如何解决? </think>### Keil编译器构建项目时出现L6406E和L6407E错误的解决方法 L6406E和L6407E是Keil链接阶段的典型内存溢出错误,表明执行区域(如ROM/RAM)空间不足或内存布局冲突[^4]。以下是系统化的解决步骤: #### 1. **检查内存映射配置** - 打开项目选项 → Target标签页 - 核对`Read/Only Memory Areas`和`Read/Write Memory Areas`的地址范围是否与芯片手册一致 - 验证`IROM1`(代码存储区)和`IRAM1`(运行内存区)大小是否足够 - *示例:GD32F10X_CL芯片通常需要IROM1=0x08000000 size 0x80000(512KB), IRAM1=0x20000000 size 0x10000(64KB)* #### 2. **优化代码体积** - **编译器优化**: - 在C/C++标签页将优化级别提升至`-O2`或`-O3` - 勾选`One ELF Section per Function`(消除未用函数) ```c // 在代码中手动移除未调用函数 __attribute__((unused)) void unused_func() { ... } ``` - **链接器裁剪**: - 在Linker标签页启用`Use Memory Layout from Target Dialog` - 添加`--remove`参数移除未使用段 #### 3. **调整分散加载文件** 修改.sct文件解决区域重叠问题(L6407E): ```scatterload LR_IROM1 0x08000000 0x00080000 { ; 扩展ROM区域 ER_IROM1 0x08000000 0x00080000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { ; 确保RAM无重叠 .ANY (+RW +ZI) } } ``` #### 4. **硬件相关检查** - 确认Options for Target → Device选择的芯片型号正确 - 检查启动文件`startup_*.s`中的堆栈设置: ```assembly Stack_Size EQU 0x00000400 ; 适当减小栈大小 Heap_Size EQU 0x00000200 ; 减小堆空间 ``` #### 5. **版本兼容性处理** - 若需V5.06编译器: 1. 通过Pack Installer安装`ARM Compiler 5.06 update 7` 2. 在项目选项→Folders/Extensions添加编译器路径 > 注:Keil MDK v5.37+默认使用AC6编译器,需手动配置AC5[^3] #### 6. **高级调试手段** - 生成`*.map`文件分析内存占用: - 查看`Image Symbol Table`确认大型对象 - 检查`Memory Map`区域重叠 - 使用`--info=summarysizes`输出模块大小统计 > **根本原因**:这类错误通常由三方面导致: > - 实际代码量超过芯片Flash容量(L6406E) > - 内存区域地址冲突(L6407E) > - 编译器版本与项目配置不匹配[^1][^4]
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值