--autoat是ARM链接器(armlink)的一个选项,用于自动放置AT section(绝对地址段),这些段通过__attribute__((section("name")))]{text="__attribute__((section(\"name\")))"}或类似机制指定绝对地址。启用该选项时,链接器会尝试自动分配这些段到内存区域,但若地址冲突、内存不足或段属性不兼容,可能导致错误如L6985E。
错误L6985E的出现通常源于内存布局冲突或scatter文件配置不当。 例如,当多个段试图占用同一地址,或AT section的所需基地址无法满足时,链接器无法自动分配,从而触发此错误。
解决L6985E错误的常见方法包括禁用自动分配并手动配置scatter文件。 具体步骤如下:
- 禁用Auto-AT功能:在Keil中,进入Project -> Options for Target -> Linker,在Misc controls中添加--no_autoat选项以禁用自动地址分配。
- 手动编写scatter文件:创建自定义scatter文件,明确指定段的地址和内存区域。例如:
LR_IROM1 0x08000000 0x00100000 {
ER_IROM1 0x08000000 0x00100000 {
*.o (RESET, +First)
*.o (InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00010000 {
.ANY (+RW +ZI)
}
}预防此类错误需在项目配置阶段注意内存布局和段管理。 关键措施包括:
- 合理规划内存区域:确保scatter文件中定义的区域大小和地址不重叠,特别是RAM和ROM区域。
- 检查段属性:确认代码中使用__attribute__((section()))指定的段名与scatter文件中的区域匹配。
- 验证编译器版本兼容性:某些ARMCC版本对AT section处理可能有差异,需参考官方文档。
我要赚赏金
