Keil指定绝对地址放置变量链接失败的原因及解决方法
链接失败原因及解决办法
原因分析
你遇到的L6985E错误本质是Arm Compiler 6的自动AT段放置机制无法将指定地址的段放入当前内存布局中,具体原因可能有以下几点:
- 内存区域边界限制:默认或自定义的Scatter文件中,RO-data所在的内存区域可能未覆盖
0x1FDFC地址,或者该地址刚好处于两个内存区域的边界,链接器无法自动适配。 - 对齐与段重叠问题:虽然bin文件看起来有空余空间,但链接器会严格遵循内存区域的对齐规则(比如Cortex-M系列常用4字节对齐),且不允许段重叠。
0x1FDFC可能恰好与某个隐含段(如编译器生成的初始化信息、中断向量表预留区域)的末尾对齐,导致无法放置你的变量段。 - 自动AT段放置逻辑限制:Arm Compiler 6的自动AT段放置仅能处理目标地址完全落在现有已定义内存区域内且无冲突的情况,一旦地址处于模糊区域(比如接近区域末尾),就会触发手动放置要求。
从程序大小数据来看:未指定绝对地址时RO-data为11352字节,指定0x1FE2C后RO-data增加4字节(而非预期的2字节),这说明链接器为满足对齐要求,自动为该变量分配了4字节空间,间接证明对齐规则在地址分配中起关键作用。
解决办法
方法1:手动配置Scatter文件(推荐)
- 在Keil中启用
--no_autoat链接选项:- 打开项目选项 →
Linker→Misc controls,添加--no_autoat
- 打开项目选项 →
- 编辑Scatter文件,添加AT段放置规则:
; 在RO区域的合适位置插入以下内容 .ARM.__at_0x1FDFC 0x1FDFC : { main.o(.ARM.__at_0x1FDFC) } > ROM ; 此处ROM需与现有RO区域的目标内存名称一致 - 重新编译链接即可。
方法2:调整变量地址到兼容位置
继续使用验证有效的0x1FE2C地址,或通过查看Keil生成的*.map文件,选择RO-data内存区域内、满足对齐要求的其他空闲地址。
方法3:检查并修改内存区域定义
打开Scatter文件,确认RO-data所在内存区域(通常为ROM或CODE)的起始地址和大小,确保0x1FDFC完全落在该区域内。例如:
ROM 0x08000000 0x00020000 ; 起始地址0x08000000,大小128KB { ; 现有段定义... }
若0x1FDFC超出区域范围,需调整区域大小。
内容的提问来源于stack exchange,提问作者Laurynas Klimavicius
相关产品推荐
相关产品推荐

