【Arm】MDK-Link错误解决方案

1、 文档目标

记录Error编号为L6220E的Link错误并给予解决方案,供相关同事参考解决此类问题。


2、 问题场景

客户在使用STM32F1的项目编译时遇到下列报错Error: L6220E: Load region LR_IROM1 size(65552 bytes)。


图2-1

3、软硬件环境

1)、软件版本:MDK5.38

2)、电脑环境:Windows 11

3)、外设硬件:无


4、解决方法

1)、原因1:分配给此负载区域的数据过多。一个加载区域可以由多个执行区域组成,这些执行区域包含一个或多个 RO、RW、XO 或 ZI 数据部分

解决方案1.1:目标设备参考手册中的内存映射详细信息,查看是否有可能增加为此负载区域定义的最大允许大小,例如,特定内部闪存或 RAM 内存区域中仍有剩余空间。如果是,请在 uVision 的"Options for Target - Target"”中修改如下图4-1所示或您自己的散点文件中增加为此加载区域定义的大小。


图4-1

解决方案1.2:检查 uVision 自动生成的链接器分散文件或您自己的分散文件,看看是否可以将此特定加载区域的某些执行区域的分配更改为另一个加载区域

解决方案1.3:提高代码的优化等级,将Arm 编译器优化级别更改为 -O3、-Oz 或 -Omin,以便 Arm 编译器生成较小的代码大小,在某些情况下可能会解决此链接器错误。


2)、原因2:如果 .在此负载区域中使用/分配任何部分,具体取决于算法用于填充此类 .任何部分,链接器生成的内容(如填充物和贴面)都可能过度填充该区域,从而导致此链接器错误 L6220E。

解决方案 2.1:使用--any_contingencylinker 选项,以防止链接器将区域填充到最大值。

解决方案 2.2:使用执行区域属性ANY_SIZE max_size指定 Armlink 可以用未分配的部分填充的区域中的最大大小。


3)、原因3:如果某些数据故意放置在特定地址/位置(靠近此特定加载区域的末尾),则在某些情况下可能会导致此链接器错误 L6220E,本文对此进行了介绍ARMLINK:L6220E ...超出限制,如果将数据放在闪存末尾


注:原因2与原因3暂未遇到,均为原因1所导致的错误,检查内存分配大小即可解决,提高优化等级也可行。

以上参考原厂说明链接:错误:L6220E:加载区域 xxx 大小(xxx 字节)超出限制(xxx 字节) (arm.com)