SIM808固件编译报armlink L6220:APP加载区超出容量限制
SIMCOM SIM808固件编译错误(L6220)解决方案
问题背景
基于Real View ARM Workbench IDE 4.0与SIM_EAT SDK开发SIM808模块固件,取消注释APP_InitRegions();、APP_init_clib();、app_mem_init();三行代码后,触发链接错误:
armlink : error L6220: Load region APP size (197016 bytes) exceeds limit (196608 bytes)
APP加载区配置为192KB(0x00030000),当前代码超出308字节。
解决方案
1. 代码与编译优化
- 排查
APP_InitRegions()、APP_init_clib()、app_mem_init()三个函数的实现,删除冗余常量、未使用分支或代码片段。 - 提升编译器优化等级:在Real View IDE中将优化选项设为
-O2或-O3,压缩生成的RO代码体积(调试阶段可临时回退至-O0)。 - 清理编译列表:移除项目中未使用的库文件或目标文件,比如编译输出中未用到的传感器、通信模块。
2. 临时扩大Flash分区
从Flash映射可知,APP1区域后有EEP(8KB)、Res(8KB)两个未使用的预留区域,可临时调整分区:
- 修改分散加载文件
scat_SIM808M32.txt,将APP加载区大小从0x00030000(192KB)扩大至0x00034000(208KB),覆盖Res区域:
APP 0x90309000 0x00034000 { APPCFG +0 { * (APP_CFG) } APP0 +0 { main.o* (APPENTRY) } APP1 +0 { main.o* (+RO) *.o* (+RO) } APP_RAM 0xF0380000 0x00060000 { main.o (+RW,+ZI) *.o (+RW,+ZI) } }
- 同步修改Flash映射定义,更新
APP_MAX_SIZE:
#define APP_MAX_SIZE ((UINT32)4096*52)
注意:后续若需使用EEP或Res区域,需将代码移回原分区,避免地址冲突。
3. 拆分RO段到APP2区域
Flash映射中APP2区域有44KB可用,若当前项目未使用该区域,可将部分RO代码分流至此:
- 修改分散加载文件,新增APP2加载区配置:
APP 0x90309000 0x00030000 { APPCFG +0 { * (APP_CFG) } APP0 +0 { main.o* (APPENTRY) } APP1 +0 { main.o* (+RO) SysModules\util.o* (+RO) SIM808EATModules\*.o* (+RO) } } APP2 0x9033D000 0x0000B000 { FleetBoardP\*.o* (+RO) SysModules\fat\*.o* (+RO) *.o* (+RO) } APP_RAM 0xF0380000 0x00060000 { main.o (+RW,+ZI) *.o (+RW,+ZI) }
4. 优化链接器选项
- 删除链接命令中的
--keep *.o,该选项会强制保留所有目标文件,增大RO段体积;改为仅保留必要文件,比如--keep main.o。 - 添加链接器选项
--remove --remove_unused_sections,自动移除未被引用的代码与数据。
验证方式
修改配置后重新编译,查看output.lis中的RO段大小统计,确认APP加载区未超出限制。若仍有溢出,分析map文件定位占用空间最大的模块,针对性优化。
内容的提问来源于stack exchange,提问作者Hossein
相关产品推荐
相关产品推荐

