程序内存空间不足导致编译报错

Overview

用户在移植第三方库或进行其他操作时,若遇到程序报内存不足,链接失败等错误,可以试着先改动sdk_ld.c文件,让程序先编译通过,再 查看使用细节,即每个函数、变量的大小,找出是哪个变量占存太大导致的。下面是一些具体的实例场景。

应用示例

首先进入 cpu/wl82/sdk_ld.c 查看相应内存配置

下面主要模拟了三种内存错误的场景,并分别分析错误原因以及对应的解决方案。分别是:在sdram段中定义一个超过段大小的数组;在sram中定义一个超过段大小的数组;在cache_ram中定义一个超过段大小的数组。

示例演示 1:

若遇到报错内容为:’.bss’ is not within region ‘.sdram’

解决方案:

sdk_ld.c 中,适当调整 sdramLENGTH 值(比如不断增加100MB),让程序编译通过,再 查看使用细节,即每个函数、变量的大小,查看该错误是由哪个变量导致的。

由上图可知,该异常是由于在app_main()中定义了一个大小为32MB左右的test_array数组,占用了太大的 sdram 空间,导致内存不足,后续可对其进行相应的代码优化。

示例演示 2:

若遇到报错内容为:’.ram0_bss’ is not within region ‘ram0’;

section .boot_info LMA [xx,xx] overlaps section .ram0_bss LMA [xx,xx]。(注:xx是地址值)

解决方案:

1、第一个错误解决方法与示例1类似,即在 sdk_ld.c 中,适当调整 ram0LENGTH 值(比如不断增加100MB),让程序编译通过,再 查看使用细节,即每个函数、变量的大小,查看该错误是由哪个变量导致的;

2、第二个错误,区域重叠覆盖,可能是在ram段中定义了一个超过ram剩余空间大小的变量,由于ram段与boot_info段相邻,因此超过部分可能会将boot_info重叠部分覆盖。 可以修改 sdk_ld.cMEMORY 中各段 ORIGIN 字段 ,以避免重叠覆盖发生。下面给出修改示例。

MEMORY
{
      rom(rx)             : ORIGIN =  0x4000120, LENGTH = __FLASH_SIZE__
      sdram(rwx)          : ORIGIN =  0x6000120, LENGTH = SDRAM_SIZE
      ram0(rwx)           : ORIGIN =  0x1000000, LENGTH = RAM0_SIZE
      boot_info(rwx)      : ORIGIN =  0x2000000, LENGTH = BOOT_INFO_SIZE
      cache_ram(rw)       : ORIGIN =  0x3000000, LENGTH = CACHE_RAM_SIZE
}

查看使用细节,即每个函数、变量的大小,筛选出 ram0_bss 段的变量。

由上图可知,异常是由于在app_main()中定义了一个大小为4MB的test_array数组,占用了太多的 ram0_bss 空间,导致内存不足,后续可对其进行相应的代码优化。

示例演示 3:

若遇到报错内容为:’.cache_ram_bss’ is not within region ‘cache_ram’;

解决方案:

与示例1类似,在 sdk_ld.c 中,适当调整 cache_ramLENGTH 值(比如不断增加100MB),让程序编译通过,再 查看使用细节,即每个函数、变量的大小,查看该错误是由哪个变量导致的。